2004-12-21 Ben Maurer <bmaurer@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
1 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
2
3         * statement.cs (Block.ThisVariable): remove the recursion here, to
4         make the --profile more sane.
5
6 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
7
8         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
9         assembly, by JB Evain.
10
11 2004-12-17  Raja R Harinath  <rharinath@novell.com>
12
13         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
14           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
15         "parent" refers to enclosing type/class.  "base" refers to superclass.
16
17 2004-12-17  Raja R Harinath  <rharinath@novell.com>
18
19         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
20         Ensure that we only have GlobalAttributes.
21         * attribute.cs (Attribute.Emit): Make non-virtual.
22         (GlobalAttribute.Emit): Remove.
23         (Attribute.Resolve): Make virtual.
24         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
25         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
26         the argument. Don't create one.
27         (Attribute.GetObsoleteAttribute): Likewise.
28         (Attribute.GetClsCompliantAttributeValue): Likewise.
29         * class.cs, decl.cs: Update to changes.
30
31 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
32
33         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
34         
35         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
36         
37         * statement.cs (Foreach.Resolve): Add error 186 report.
38
39 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
40
41         * expression.cs (Conditional.DoResolve): Add warning 429.
42         
43         * statement.cs (If.Resolve): Add warning 665.
44
45 2004-12-16  Raja R Harinath  <rharinath@novell.com>
46
47         New invariant: RootContext.Tree.Types.NamespaceEntry == null
48         except when in the parser, and in GlobalAttribute.
49         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
50         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
51         RootContext.Tree.Types.NamespaceEntry once work is done.
52         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
53         and resets RootContext.Tree.Types.NamespaceEntry.
54
55 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
56
57         * cs-parser.jay: Don't create a block for every variable.
58
59 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
60
61         * location.cs: Provide extra information.
62
63         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
64         variables from the captured environment, it is the ldarg_0.
65
66 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
67
68         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
69         find a conclusion.
70         
71         * class.cs: Changed warning level for 169 to avoid developer
72         displeasure from warning flooding. It will be changed back when they
73         fix most of current BCL warnings.
74         
75         * RootContext.cs: Pushed default WarningLevel to 3.
76         
77         * statement.cs: Removed unused variable.
78
79 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
80
81         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
82         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
83         Add error 502 report.
84         (StaticClass.DefineType): Add error 441 report.
85         (Class.AllowedModifiersProp): New virtual property as temporary
86         extension to AllowedModifiers.
87         (Class.DefineType): Add error 418 report. Moved ModFlags check here
88         to share implementation with StaticClass and don't call virtual
89         methods from ctor.
90         
91         * driver.cs (MainDriver): Add error 1558 test.
92
93         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
94         report. Moved error 36 test here.
95
96         * statement.cs (Throw.Resolve): Add error 724 report.
97
98         * typemanager.cs: Add out_attribute_type core type.
99         
100 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
101
102         * class.cs (TypeContainer.VerifyClsCompliance): Add error
103         3018 report.
104         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
105
106         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
107         3017 report.
108         
109         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
110
111         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
112         Add error 3023 report.
113         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
114
115         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
116         implementation.
117
118 2004-12-12  John Luke  <john.luke@gmail.com>
119
120         * driver.cs (AddArgs): take -- into account when
121         adding arguments, fixes bug 65710 
122
123 2004-12-12  Martin Baulig  <martin@ximian.com>
124
125         * expression.cs (Unary.TryReduceNegative): Added support for
126         SByteConstant and ByteConstant.
127         (Unary.Reduce): Check error values from TryReduceNegative().
128
129 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
130
131         * attributes.cs (Attribute.Resolve): Avoid multiple error report
132         and report exception as error 182.
133
134 2004-12-10  Raja R Harinath  <rharinath@novell.com>
135
136         * driver.cs (Main): Fix message when there are warnings.
137
138 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
139
140         * delegate.cs: Fixed my fix from yesterday, sorry about that.
141
142 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
143
144         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
145         Reduced number of warnings.
146         
147         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
148
149 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
150
151         * driver.cs: Removed message.
152
153         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
154
155 2004-12-08    <vargaz@freemail.hu>
156
157         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
158
159 2004-12-08  Martin Baulig  <martin@ximian.com>
160
161         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
162         instead of a CS3002 for properties and indexer.
163
164 2004-12-08  Martin Baulig  <martin@ximian.com>
165
166         * decl.cs (MemberName.ToString): Make this work again.
167
168 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
169
170         * attribute.cs (Resolve): Add error 591 detection.
171
172         * class.cs (FieldMember.Define): Add error 1547 detection.
173         (Indexer.Define): Add error 620 detection.
174         (Operator.Define): Add error 590 detection.
175
176         * ecore.cs: Missing argument for error 79.
177
178         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
179         detection.
180
181 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
182
183         Fix #70106
184         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
185         only.
186
187 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
188
189         * cs-parser.jay : handle doc comments on implicit/explicit operators.
190           Some operator comments were suppressed.
191         * doc.cs : Implicit/explicit operator name in doc comments are like
192           "op_Explicit(type)~returnType", so added suffix handling.
193
194 2004-12-07  Martin Baulig  <martin@ximian.com>
195
196         * decl.cs
197         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
198         (MemberCore.GetClsCompliantAttributeValue): Likewise.
199         (DeclSpace.ec): New protected field; store the EmitContext here.
200         (DeclSpace.EmitContext): New public property; moved here from
201         `TypeContainer'.
202         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
203         EmitContext.
204
205         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
206         (Enum.Emit): Don't create a new EmitContext.
207
208         * delegate.cs (Delegate.DefineType): Always create the
209         EmitContext.
210
211         * iterators.cs (Iterators.DefineIterator): Create a new
212         EmitContext and store it in `ec'.
213
214 2004-08-24  Martin Baulig  <martin@ximian.com>
215
216         * typemanager.cs
217         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
218         this for accessibility checks.
219         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
220         IsNestedFamilyAccessible.
221         (TypeManager.IsSubclassOf): New method, do what the name actually
222         says.   
223
224 2004-12-06  Raja R Harinath  <rharinath@novell.com>
225
226         Fix crash on cs0657-17.cs.
227         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
228         Use RootContext.Tree.Types, not 'new RootTypes ()'.
229         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
230         the case where the NamespaceEntry gets overwritten.
231
232 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
233
234         Fixed #69195, #56821
235         * ecore.cs (ResolveBoolean): Tiny refactoring.
236
237         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
238         of right expression resolving when left is false constant and
239         operator is LogicalAnd OR true constant and operator is LogicalOr.
240
241         * statement.cs (ResolveUnreachable): Always reports warning.
242
243 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
244
245         * class.cs: Distinguish between 1721 and 1722 (just a little help
246         for the programmer).
247
248 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
249
250         * delegate.cs: Only allow this on new versions of the language. 
251
252 2004-12-02  Duncan Mak  <duncan@ximian.com>
253
254         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
255         Expression class.
256         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
257         here as a static method. Take an additional bool out parameter
258         `must_do_cs1540_check' for signaling to InstanceResolve.
259         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
260         member field from PropertyExpr class and made it an argument of
261         the method instead.
262         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
263         check for MarshalByRefObject, and report CS0122 instead of CS1540.
264         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
265         and `remove_accessor' as well as InstanceResolve: report CS0122
266         where applicable.
267
268         Fixes #70129.
269
270 2004-12-03  Raja R Harinath  <rharinath@novell.com>
271
272         Fix test-327.cs, test-328.cs, and put in early infrastructure
273         for eventually fixing #52697.
274         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
275         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
276         from other methods.
277         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
278         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
279         (VerifyUsing, error246): Update.
280         * rootcontext.cs (RootContext.NamespaceLookup): Just use
281         'NamespaceEntry.LookupNamespaceOrType'.
282
283 2004-12-03  Martin Baulig  <martin@ximian.com>
284
285         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
286         method as our child, call AnonymousMethod.Compatible() on it.
287
288 2004-12-03  Raja R Harinath  <rharinath@novell.com>
289
290         Disable XML documentation support in 'basic' profile.
291         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
292         Redirect XmlElement to System.Object.
293         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
294         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
295         * mcs.exe.sources: Add doc-bootstrap.cs.
296         * doc-bootstrap.cs: New file.  Contains empty stub implementation
297         of doc.cs.
298
299 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
300
301         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
302           comments are allowed.
303
304 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
305
306         * delegate.cs: Add checks for subtypes in paramaters and return values
307         in VerifyMethod () to add support for Covariance/Contravariance
308         in delegates.
309         
310 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
311
312         * report.cs: Remove extra closing parenthesis.
313
314         * convert.cs (Error_CannotImplicitConversion): If the name of the
315         types are the same, provide some extra information.
316
317         * class.cs (FieldBase): Use an unused bit field from the field to
318         encode the `has_offset' property from the FieldMember.  This saves
319         a couple of Ks on bootstrap compilation.
320
321         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
322         method as our child, return the AnonymousMethod resolved
323         expression.
324
325         * expression.cs (New.DoResolve): Allow return values from
326         NewDelegate to also include AnonymousMethods.
327
328         Fixes #70150.
329
330 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
331
332         Fix bug #70102
333         * attribute.cs (Resolve): Improved implementation of params
334         attribute arguments.
335
336         * support.cs (ParameterData): Add HasParams to be faster.
337
338 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
339
340         all things are for /doc support:
341
342         * doc.cs: new file that supports XML documentation generation.
343         * mcs.exe.sources: added doc.cs.
344         * driver.cs:
345           Handle /doc command line option.
346           Report error 2006 instead of 5 for missing file name for /doc.
347           Generate XML documentation when required, after type resolution.
348         * cs-tokenizer.cs:
349           Added support for picking up documentation (/// and /** ... */),
350           including a new XmlCommentState enumeration.
351         * cs-parser.jay:
352           Added lines to fill Documentation element for field, constant,
353           property, indexer, method, constructor, destructor, operator, event
354           and class, struct, interface, delegate, enum.
355           Added lines to warn incorrect comment.
356         * rootcontext.cs :
357           Added Documentation field (passed only when /doc was specified).
358         * decl.cs:
359           Added DocComment, DocCommentHeader, GenerateDocComment() and
360           OnGenerateDocComment() and some supporting private members for
361           /doc feature to MemberCore.
362         * class.cs:
363           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
364         * delegate.cs:
365           Added overriden DocCommentHeader.
366         * enum.cs:
367           Added overriden DocCommentHeader and GenerateDocComment().
368
369 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
370
371         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
372         unwrapping the enumeration values, chain to
373         DoConstantNumericPromotions again, so we can promote things to the
374         fundamental types (takes care of enums that are bytes, sbytes).
375
376         Fixes bug #62054.
377
378 2004-12-01  Raja R Harinath  <rharinath@novell.com>
379
380         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
381         Fix long-standing bug in type-lookup.  Use FindType instead of
382         LookupType when ec.ResolvingTypeTree.
383         (Attribute.ResolveType, Attribute.Resolve)
384         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
385         Update to changes.
386         (Attributes.Search): Remove internal version.  Update.
387         (Attributes.SearchMulti): Update.
388         (Attributes.GetClsCompliantAttribute): Remove.
389         (Attributes.GetIndexerNameAttribute): Remove.
390         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
391         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
392         * class.cs (Indexer.Define): Likewise.
393
394 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
395
396         Fix bug #68790
397         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
398         MarshallByReference members access.
399
400         * expression.cs: Use CheckMarshallByRefAccess;
401         Better error CS0197 message.
402
403         * report.cs: Print whole related error message.
404
405 2004-11-30  Raja R Harinath  <rharinath@novell.com>
406
407         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
408         the current directory to help debugging.
409
410 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
411
412         * class (GetClassBases): Better error 60 report.
413         (EventProperty): Disabled warning 67 detection.
414
415 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
416
417         Fix bug #60324
418         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
419
420         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
421         precise values.
422
423 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
424
425         Fix bug #49488
426         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
427
428         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
429
430 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
431
432         * attribute.cs (Attribute.Resolve): Refine error reporting and
433         report a cs0117 if the identifier does not exist, to distinguish
434         from 0617 which is a miss-use of the actual identifier.
435
436         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
437         between cs0070 and cs0079.
438
439         * class.cs (MemberBase.DoDefine): When reporting a wrong
440         accessibility level, we use MethodCore to compare instead of
441         Method (this was a regression in some refactoring effort).
442
443         So now we correctly report cs0056 again.
444
445         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
446         testing the target_type (which was known to be object_type) and
447         not the source type (which is anonymous_method).
448
449         Fixed reporting of error cs1660.
450
451         * expression.cs (UserCast.Source): Expose the underlying cast.
452
453         * statement.cs (Switch.SwitchGoverningType): Sort the list of
454         allowed types to find a match to int32 first (most common).
455
456         In addition, it ignores any ImplicitUserConversions that did an
457         internal implicit conversion (as the switch statement allows only
458         one integral conversion to exist).
459
460         * class.cs (PartialContainer.Create): rename `name' to
461         `member_name' for clarity.  Then replace the string calls with a
462         call to MemberName.GetPartialName, as now using
463         MemberName.ToString is an error (this is due to the side effects
464         it had, that were fixed in the past).
465
466         This will restore the error reporting on a number of partial class
467         errors that were missusing this (and getting an exception as a
468         results, which is now just a plain textual warning, because
469         yyparse debug output would crash otherwise).
470
471 2004-11-26  Raja R Harinath  <rharinath@novell.com>
472
473         * Makefile (PROGRAM_INSTALL_DIR): Remove.
474
475 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
476
477         * rootcontext.cs (LookupType): Make sure to cache lookups that
478         don't give us a negative result. This saves about 5% of corlib
479         compilation time.
480
481 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
482
483         * report.cs (AbstractMessage.Print): messages are sent to stderr
484
485         * class.cs (TypeContainer.GetClassBases): It is an error to have a
486         non-interface in the list of interfaces (at this point, either
487         parent was properly set, or a base class is being listed in the
488         interfaces section).
489
490         This flags error 1722, and resolves the crash from bug 69259.
491
492 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
493
494         * statement.cs (Using.EmitExpressionFinally): make this work right
495         for valuetypes. Fixes 69926.
496
497 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
498
499         * const.cs (Const.ChangeType): Cope with the "0 literal can be
500         converted to an enum" here, before we try to change the underlying
501         type.  This code exists, but it is a different code path than the
502         one used while encoding constants.
503
504         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
505         old bug: when converting from the null literal to a pointer,
506         return an EmptyCast, not the NullLiteral.
507
508         This fixes #69921, the recent null_type changes probably made this
509         bug more prominent.
510
511         (ImplicitReferenceConversionExists): In addition, resynchronized
512         the code here, so it matches the same code in
513         ImplicitReferenceConversionExists for the `from any class-type S
514         to any interface-type T'.
515         
516
517 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
518
519         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
520
521 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
522
523         * cs-parser.jay: Use verbosity accordingly. 
524
525 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
526
527         * expression.cs (Unary.ResolveOperator): Do not report warning;
528         AddressOf reads from variable.
529         
530         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
531
532 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
533
534         Fix bug #69462
535
536         * attribute.cs (Attributable): Removed CheckTargets.
537         (Attributes.Emit): Explicit attribute targets are tested here.
538
539         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
540         not enabled for interfaces.
541
542         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
543         (GetAssemblyName): Ouch next bug there.
544
545 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
546
547         * expression.cs: Error 275 added.
548         
549 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
550
551         Fix bug #69177 (Implemented decimal constant support)
552
553         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
554         (BinaryFold): Add DecimalConstant.
555
556         * const.cs (Define): Decimal constant 
557         (is not constant.
558         (ChangeType): Add decimal type handling.
559         (LookupConstantValue): Don't set value for decimal type but
560         emit DecimalConstantAttribute. Needed for constant optimization.
561
562         * constant.cs (ToDecimal): New method.
563         (ConvertToDecimal): New method.
564         (IntConstant): Implemented ConvertToDecimal.
565         (DecimalConstant.Emit): Emit optimized version for decimals in
566         int range.
567
568         * expression.cs (ResolveOperator): Changed order of constant
569         reduction to work correctly with native types which have
570         overloaded operators.
571         (ResolveMemberAccess): Extract constant value from attribute
572         for decimal type.
573
574         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
575
576         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
577         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
578         (ChangeType): Decimal is special.
579         (TypeToCoreType): Add decimal type.
580
581 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
582
583         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
584         decimal types.
585
586 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
587
588         * class.cs (EventField.ApplyAttributeBuilder): Fix error
589         test cs1667-5.cs.
590
591 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
592
593         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
594
595         * pending.cs (PendingImplementation): Grab only interfaces.
596
597 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
598
599         * statement.cs (ForeachHelperMethods): Add location member and
600         error 202 detection.
601
602 2004-11-19  Raja R Harinath  <rharinath@novell.com>
603
604         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
605         automatically handled by executable.make.
606         (PROGRAM): Make profile-specific.
607
608 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
609
610         * expression.cs (DoResolveBase): Fixed wrong warning for out
611         variables.
612
613 2004-11-18  Martin Baulig  <martin@ximian.com>
614
615         Merged latest changes into gmcs.  Please keep this comment in
616         here, it makes it easier for me to see what changed in MCS since
617         the last time I merged.
618
619 2004-11-17  Raja R Harinath  <rharinath@novell.com>
620
621         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
622         (TypeHandle.GetMemberCache): New.
623         (TypeHandle.TypeHandle): Update.
624         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
625         (TypeManager.LookupParentInterfacesCache):
626         Rename from LookupInterfaceCache.  Optimize slightly.
627         (TypeManager.MemberLookup_FindMembers): Update.
628         * decl.cs (MemberCache.MemberCache): Set Container to null in the
629         multi-type variant.
630         (AddCacheContents): Rename from AddHashtable.
631         * class.cs (TypeContainer.parent_container): Remove.
632         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
633         (TypeContainer.DoDefineMembers): Don't initialize it.
634         Update to name changes.
635         
636 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
637
638         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
639         that factors the code to check access modifiers on override.  
640
641         (PropertyBase): Use the code here.
642
643         Patch from Lluis S'anchez, fixes bug #69361.
644
645 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
646
647         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
648         routine that is used to report the use of a captured variable
649         whose address has been taken.
650
651         There are two checks: one when variables are being captured and
652         the other check is when the address of a variable is taken. 
653         
654         (because an anonymous methods might be resolved before *or* after
655         the address has been taken) and 
656
657         * expression.cs (Conditional.DoResolve): Remove the special
658         casing that Martin added to trueExpr and falseExpr being both
659         NullLiteral.  We get the right behavior now just by introducing
660         the null_type into the compiler. 
661
662         * convert.cs (ExplicitConversion): Change the code to use
663         null_type instead of testing `expr is NullLiteral'.
664         (ImplicitConversionStandard): use null_type too.
665         (ImplicitReferenceConversionExists): use null_type too.
666         (ImplicitReferenceConversion): use null_type too.
667
668         * literal.cs: The type of `NullLiteral' is now null_type instead
669         of object_type. 
670         (Resolve): Set the type here.
671
672         * typemanager.cs: Introduce null_type.
673
674 2004-11-17  Martin Baulig  <martin@ximian.com>
675
676         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
677         direction, like FindMembers() does.  Fixes #69546, testcase is in
678         test-315.cs.    
679
680 2004-11-16  Martin Baulig  <martin@ximian.com>
681
682         This is based on a patch from Marek Safar, see bug #69082.
683         Fixes bugs #63705 and #67130.
684
685         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
686         method; create a MemberCache for an interface type and cache the
687         result.
688
689         * decl.cs (IMemberContainer.ParentContainer): Removed.
690         (IMemberContainer.ParentCache): New property.
691         (MemberCache.SetupCacheForInterface): Removed.
692         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
693         to create a cache for an interface's "parent".
694
695         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
696         interfaces too.
697
698 2004-11-16  Martin Baulig  <martin@ximian.com>
699
700         Merged back from gmcs; these changes already went into gmcs a
701         couple of weeks ago.
702
703         * typemanager.cs
704         (TypeManager.AddUserType): Removed the `ifaces' argument.
705         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
706         `TypeExpr []'.
707         (TypeManager.AddUserInterface): Removed.
708         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
709         `TypeExpr []'.
710         (TypeManager.GetInterfaces): Likewise.
711         (TypeManager.GetExplicitInterfaces): Likewise.
712
713         * ecore.cs (TypeExpr.GetInterfaces): Removed.
714
715         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
716         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
717
718 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
719
720         * statement.cs: Avoid adding bools to a hashtable.
721
722 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
723
724         * expression.cs (Invocation.OverloadResolve): Flag error if we are
725         calling an unsafe method from a safe location.
726
727 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
728
729         Fix #69167
730         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
731
732 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
733
734         * namespace.cs (VerifyUsing): use GetPartialName instead of
735         ToString. 
736
737 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
738
739         * statement.cs (Return.Resolve): Fix regression in typo: if
740         `in_exc', we have to request a NeedReturnLabel, this was a typo
741         introduced in the anonymous method check-in.  Fixes #69131.
742
743         * Indexers were using the ShortName when defining themselves,
744         causing a regression in the compiler bootstrap when applying the
745         patch from 2004-11-02 (first part), now they use their full name
746         and the bug is gone.
747
748 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
749
750         * driver.cs: Strip the path from the names of embedded resources. Fixes
751         #68519.
752
753 2004-11-04  Raja R Harinath  <rharinath@novell.com>
754
755         Fix error message regression: cs0104-2.cs.
756         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
757         (AliasEntry.Resolve): Update.
758         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
759         'silent' flag.
760         (RootContext.LookupType): Update.
761
762 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
763
764         * cs-parser.jay: Add support for handling accessor modifiers
765         * class: Add support port accessor modifiers and error checking,
766         define PropertyMethod.Define as virtual (not abstract anymore)
767         * ecore.cs: Add checking for proeprties access with access modifiers
768         * iterators.cs: Modify Accessor constructor call based in the modified
769         constructor
770 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
771
772         * expression.cs (StringConcat): Handle being called twice,
773         as when we have a concat in a field init with more than two
774         ctors in the class
775
776 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
777
778         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
779         special case explicit implementations, we should always produce
780         the .property or .event declaration.
781         
782         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
783         since it will not return correct data if people use this
784         unresolved in the presence of using statements (see test-313).
785
786         * class.cs (MethodData.Define): If we are an explicit interface
787         implementation, set the method name to the full name of the
788         interface plus the name of the method.  
789
790         Notice that using the method.MethodName.GetFullName() does not
791         work, as it will only contain the name as declared on the source
792         file (it can be a shorthand in the presence of using statements)
793         and not the fully qualifed type name, for example:
794
795         using System;
796
797         class D : ICloneable {
798                 object ICloneable.Clone ()  {
799                 }
800         }
801
802         Would produce a method called `ICloneable.Clone' instead of
803         `System.ICloneable.Clone'.
804
805         * namespace.cs (Alias.Resolve): Use GetPartialName.
806         
807 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
808
809         * cs-parser.jay: Add error 1055 report.
810
811 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
812
813         * assign.cs (Assign.DoResolve): Only do the transform of
814         assignment into a New if the types are compatible, if not, fall
815         through and let the implicit code deal with the errors and with
816         the necessary conversions. 
817
818 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
819
820         * cs-parser.jay: Add error 1031 report.
821
822         * cs-tokenizer.cs: Add location for error 1038.
823
824 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
825
826         * cs-parser.jay: Add error 1016 report.
827
828 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
829
830         * cs-parser.jay: Add errors 1575,1611 report.
831
832 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
833
834         * cs-parser.jay: Add error 1001 report.
835
836 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
837
838         Fix #68850
839         * attribute.cs (GetMarshal): Add method argument for
840         caller identification.
841
842         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
843         agument for GetMarshal and RuntimeMissingSupport.
844
845 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
846
847         * attribute.cs (ExtractSecurityPermissionSet): Removed
848         TypeManager.code_access_permission_type.
849
850         * typemanager.cs: Removed TypeManager.code_access_permission_type.
851
852 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
853
854         * expression.cs (LocalVariableReference.DoResolveLValue): Check
855         for obsolete use of a variable here.   Fixes regression on errors
856         cs0619-25 and cs0619-26.
857
858 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
859
860         Fix #62358, implemented security attribute encoding.
861
862         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
863         Tests permitted SecurityAction for assembly or other types.
864         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
865         data from SecurityPermissionAttribute to PermisionSet class.
866
867         * class.cs (ApplyAttributeBuilder): Added special handling
868         for System.Security.Permissions.SecurityAttribute based types.
869
870         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
871         special handling for System.Security.Permissions.SecurityAttribute
872         based types.
873
874         * enum.cs (ApplyAttributeBuilder): Added special handling
875         for System.Security.Permissions.SecurityAttribute based types.
876
877         * parameter.cs (ApplyAttributeBuilder): Added special handling
878         for System.Security.Permissions.SecurityAttribute based types.
879
880         * rootcontext.cs: Next 2 core types.
881
882         * typemanager.cs (TypeManager.security_permission_attr_type):
883         Built in type for the SecurityPermission Attribute.
884         (code_access_permission_type): Build in type.
885
886 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
887
888         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
889         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
890         all of this information into
891         EmitContext.EmitCapturedVariableInstance.
892         
893         * codegen.cs (EmitCapturedVariableInstance): move here the
894         funcionality of emitting an ldarg.0 in the presence of a
895         remapping.   This centralizes the instance emit code.
896
897         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
898         then emit a load of this: it means that we have reached the
899         topmost ScopeInfo: the one that contains the pointer to the
900         instance of the class hosting the anonymous method.
901
902         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
903         captures to the topmost CaptureContext.
904
905 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
906
907         * expression.cs (LocalVariableReference): Move the knowledge about
908         the iterators into codegen's EmitCapturedVariableInstance.
909
910 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
911
912         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
913         all code paths return a value from an anonymous method (it is the
914         same as the 161 error, but for anonymous methods).
915
916 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
917
918         The introduction of anonymous methods in the compiler changed
919         various ways of doing things in the compiler.  The most
920         significant one is the hard split between the resolution phase
921         and the emission phases of the compiler.
922
923         For instance, routines that referenced local variables no
924         longer can safely create temporary variables during the
925         resolution phase: they must do so from the emission phase,
926         since the variable might have been "captured", hence access to
927         it can not be done with the local-variable operations from the runtime.
928         
929         * statement.cs 
930
931         (Block.Flags): New flag `IsTopLevel' to indicate that this block
932         is a toplevel block.
933
934         (ToplevelBlock): A new kind of Block, these are the blocks that
935         are created by the parser for all toplevel method bodies.  These
936         include methods, accessors and anonymous methods.
937
938         These contain some extra information not found in regular blocks:
939         A pointer to an optional CaptureContext (for tracking captured
940         local variables and parameters).  A pointer to the parent
941         ToplevelBlock.
942         
943         (Return.Resolve): Catch missmatches when returning a value from an
944         anonymous method (error 1662).
945         Invoke NeedReturnLabel from the Resolve phase instead of the emit
946         phase.
947
948         (Break.Resolve): ditto.
949
950         (SwitchLabel): instead of defining the labels during the
951         resolution phase, we now turned the public ILLabel and ILLabelCode
952         labels into methods called GetILLabelCode() and GetILLabel() that
953         only define the label during the Emit phase.
954
955         (GotoCase): Track the SwitchLabel instead of the computed label
956         (its contained therein).  Emit the code by using
957         SwitchLabel.GetILLabelCode ().
958
959         (LocalInfo.Flags.Captured): A new flag has been introduce to track
960         whether the Local has been captured or not.
961
962         (LocalInfo.IsCaptured): New property, used to tell whether the
963         local has been captured.
964         
965         * anonymous.cs: Vastly updated to contain the anonymous method
966         support.
967
968         The main classes here are: CaptureContext which tracks any
969         captured information for a toplevel block and ScopeInfo used to
970         track the activation frames for various local variables.   
971
972         Each toplevel block has an optional capture context associated
973         with it.  When a method contains an anonymous method both the
974         toplevel method and the anonymous method will create a capture
975         context.   When variables or parameters are captured, they are
976         recorded on the CaptureContext that owns them, for example:
977
978         void Demo () {
979              int a;
980              MyDelegate d = delegate {
981                  a = 1;
982              }
983         }
984
985         Here `a' will be recorded as captured on the toplevel
986         CapturedContext, the inner captured context will not have anything
987         (it will only have data if local variables or parameters from it
988         are captured in a nested anonymous method.
989
990         The ScopeInfo is used to track the activation frames for local
991         variables, for example:
992
993         for (int i = 0; i < 10; i++)
994                 for (int j = 0; j < 10; j++){
995                    MyDelegate d = delegate {
996                         call (i, j);
997                    }
998                 }
999
1000         At runtime this captures a single captured variable `i', but it
1001         captures 10 different versions of the variable `j'.  The variable
1002         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1003         recorded on a child.  
1004
1005         The toplevel ScopeInfo will also track information like the `this'
1006         pointer if instance variables were referenced (this is necessary
1007         as the anonymous method lives inside a nested class in the host
1008         type of the method). 
1009
1010         (AnonymousMethod): Expanded to track the Toplevel, implement
1011         `AnonymousMethod.Compatible' to tell whether an anonymous method
1012         can be converted to a target delegate type. 
1013
1014         The routine now also produces the anonymous method content
1015
1016         (AnonymousDelegate): A helper class that derives from
1017         DelegateCreation, this is used to generate the code necessary to
1018         produce the delegate for the anonymous method that was created. 
1019
1020         * assign.cs: API adjustments for new changes in
1021         Convert.ImplicitStandardConversionExists.
1022
1023         * class.cs: Adjustments to cope with the fact that now toplevel
1024         blocks are of type `ToplevelBlock'. 
1025
1026         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1027         insteda of standard blocks.
1028
1029         Flag errors if params arguments are passed to anonymous methods.
1030
1031         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1032         `CurrentAnonymousMethod' which points to the current Anonymous
1033         Method.  The variable points to the AnonymousMethod class that
1034         holds the code being compiled.  It is set in the new EmitContext
1035         created for the anonymous method.
1036
1037         (EmitContext.Phase): Introduce a variable and an enumeration to
1038         assist in enforcing some rules about when and where we are allowed
1039         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1040         only one that enfonces this right now).
1041
1042         (EmitContext.HaveCaptureInfo): new helper method that returns
1043         whether we have a CapturedContext initialized.
1044
1045         (EmitContext.CaptureVariable): New method used to register that a
1046         LocalInfo must be flagged for capturing. 
1047
1048         (EmitContext.CapturedParameter): New method used to register that a
1049         parameters must be flagged for capturing. 
1050         
1051         (EmitContext.CapturedField): New method used to register that a
1052         field must be flagged for capturing. 
1053
1054         (EmitContext.HaveCapturedVariables,
1055         EmitContext.HaveCapturedFields): Return whether there are captured
1056         variables or fields. 
1057
1058         (EmitContext.EmitMethodHostInstance): This is used to emit the
1059         instance for the anonymous method.  The instance might be null
1060         (static methods), this (for anonymous methods that capture nothing
1061         and happen to live side-by-side with the current method body) or a
1062         more complicated expression if the method has a CaptureContext.
1063
1064         (EmitContext.EmitTopBlock): Routine that drives the emission of
1065         code: it will first resolve the top block, then emit any metadata
1066         and then emit the code.  The split is done so that we can extract
1067         any anonymous methods and flag any captured variables/parameters.
1068         
1069         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1070         during this phase, the ILGenerator should not be used as labels
1071         and local variables declared here might not be accessible to any
1072         code that is part of an anonymous method.  
1073
1074         Exceptions to this include the temporary variables that are
1075         created by some statements internally for holding temporary
1076         variables. 
1077         
1078         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1079         metadata for a cb
1080
1081         (EmitContext.TemporaryReturn): This method is typically called
1082         from the Emit phase, and its the only place where we allow the
1083         ReturnLabel to be defined other than the EmitMeta.  The reason is
1084         that otherwise we would have to duplicate a lot of logic in the
1085         Resolve phases of various methods that today is on the Emit
1086         phase. 
1087
1088         (EmitContext.NeedReturnLabel): This no longer creates the label,
1089         as the ILGenerator is not valid during the resolve phase.
1090
1091         (EmitContext.EmitThis): Extended the knowledge in this class to
1092         work in anonymous methods in addition to iterators. 
1093
1094         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1095         code is necessary on the stack to access the instance to a local
1096         variable (the variable will be accessed as a field).
1097
1098         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1099         EmitContext.EmitAddressOfParameter): Routines to support
1100         parameters (not completed at this point). 
1101         
1102         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1103         will also remove the parameters.
1104
1105         * convert.cs (Convert): Define a `ConstantEC' which points to a
1106         null.  This is just to prefity some code that uses
1107         ImplicitStandardConversion code and do not have an EmitContext
1108         handy.
1109
1110         The idea is to flag explicitly that at that point in time, it is
1111         known that the conversion will not trigger the delegate checking
1112         code in implicit conversions (which requires a valid
1113         EmitContext). 
1114
1115         Everywhere: pass new EmitContext parameter since
1116         ImplicitStandardConversionExists now requires it to check for
1117         anonymous method conversions. 
1118
1119         (Convert.ImplicitStandardConversionExists): If the type of an
1120         expression is the anonymous_method_type, and the type is a
1121         delegate, we invoke the AnonymousMethod.Compatible method to check
1122         whether an implicit conversion is possible. 
1123
1124         (Convert.ImplicitConversionStandard): Only do implicit method
1125         group conversions if the language level is not ISO_1.
1126
1127         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1128         MethodInfo for the Invoke method.  used by Delegate and
1129         AnonymousDelegate.
1130
1131         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1132         method conversions if the target type is a delegate.
1133
1134         Removed extra debugging nops.
1135
1136         (LocalVariableReference): Turn the `local_info' into a public
1137         field. 
1138
1139         Add `prepared' field, the same hack used for FieldExprs to cope
1140         with composed assignments, as Local variables do not necessarily
1141         operate purely on the stack as they used to: they can be captured
1142         fields. 
1143
1144         Add `temp' for a temporary result, like fields.
1145
1146         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1147
1148         It now copes with Local variables that are captured and emits the
1149         proper instance variable to load it from a field in the captured
1150         case. 
1151
1152         (ParameterReference.DoResolveBase): During the resolve phase,
1153         capture parameters if we are in an anonymous method.
1154
1155         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1156         anonymous method, use the EmitContext helper routines to emit the
1157         parameter reference.
1158
1159         * iterators.cs: Set RemapToProxy to true/false during the
1160         EmitDispose class.
1161
1162         * parameters.cs (GetParameterByName): New helper method. 
1163
1164         * typemanager.cs (anonymous_method_type) a new type that
1165         represents an anonyous method.  This is always an internal type,
1166         used as a fencepost to test against the anonymous-methodness of an
1167         expression. 
1168         
1169 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1170
1171         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1172         561 report.
1173         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1174
1175 2004-10-18  Martin Baulig  <martin@ximian.com>
1176
1177         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1178         `Type' directly, but call ResolveType() on it.
1179         (Catch.Resolve): Likewise.
1180         (Foreach.Resolve): Likewise.
1181
1182 2004-10-18  Martin Baulig  <martin@ximian.com>
1183
1184         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1185         `Type' directly, but call ResolveType() on it.
1186         (Probe.DoResolve): Likewise.
1187         (ArrayCreation.LookupType): Likewise.
1188         (TypeOf.DoResolve): Likewise.
1189         (SizeOf.DoResolve): Likewise.
1190
1191 2004-10-18  Martin Baulig  <martin@ximian.com>
1192
1193         * expression.cs (Invocation.BetterFunction): Put back
1194         TypeManager.TypeToCoreType().
1195
1196 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1197
1198         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1199         the ResolveType.
1200
1201 2004-10-18  Martin Baulig  <martin@ximian.com>
1202
1203         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1204         `Type' directly, but call ResolveType() on it.
1205
1206 2004-10-18  Martin Baulig  <martin@ximian.com>
1207
1208         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1209         `Type' directly, but call ResolveType() on it.
1210         (MemberBase.DoDefine): Likewise.
1211
1212         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1213         `Type' directly, but call ResolveType() on it.
1214         (ComposedCast.DoResolveAsTypeStep): Likewise.
1215
1216         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1217         `Type' directly, but call ResolveType() on it.
1218
1219 2004-10-17  John Luke  <john.luke@gmail.com>
1220
1221         * class.cs (Operator.GetSignatureForError): use CSharpName
1222
1223         * parameter.cs (Parameter.GetSignatureForError): Returns
1224         correct name even if was not defined.
1225
1226 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1227
1228         Fix #65816.
1229         * class.cs (TypeContainer.EmitContext): New property.
1230         (DefineNestedTypes): Create an emitcontext for each part.
1231         (MethodCore.DoDefineParameters): Use container's emitcontext.
1232         Pass type array to InternalParameters.
1233         (MemberBase.DoDefine): Use container's emitcontext.
1234         (FieldMember.Define): Likewise.
1235         (Event.Define): Likewise.
1236         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1237         Pass type array to InternalParameters.
1238         (SetIndexerMethod.GetParameterInfo): Likewise.
1239         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1240         * delegate.cs (Define): Pass emitcontext to
1241         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1242         array to InternalParameters.
1243         * expression.cs (ParameterReference.DoResolveBase): Pass
1244         emitcontext to GetParameterInfo.
1245         (ComposedCast.DoResolveAsTypeStep): Remove check on
1246         ec.ResolvingTypeTree.
1247         * parameter.cs (Parameter.Resolve): Change argument to
1248         EmitContext.  Use ResolveAsTypeTerminal.
1249         (Parameter.GetSignature): Change argument to EmitContext.
1250         (Parameters.ComputeSignature): Likewise.
1251         (Parameters.ComputeParameterTypes): Likewise.
1252         (Parameters.GetParameterInfo): Likewise.
1253         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1254         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1255         * support.cs (InternalParameters..ctor): Remove variant that takes
1256         a DeclSpace.
1257         * typemanager.cs (system_intptr_expr): New.
1258         (InitExpressionTypes): Initialize it.
1259
1260 2004-10-12  Chris Toshok  <toshok@ximian.com>
1261
1262         * cs-parser.jay: fix location for try_statement and catch_clause.
1263
1264 2004-10-11  Martin Baulig  <martin@ximian.com>
1265
1266         * report.cs: Don't make --fatal abort on warnings, we have
1267         -warnaserror for that.
1268
1269 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1270
1271         More DeclSpace.ResolveType avoidance.
1272         * decl.cs (MemberCore.InUnsafe): New property.
1273         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1274         with newly created EmitContext.
1275         (FieldMember.Define): Likewise.
1276         * delegate.cs (Delegate.Define): Likewise.
1277         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1278         only if normal name-lookup fails.
1279         (TypeExpr.DoResolve): Enable error-checking.
1280         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1281         (SizeOf.DoResolve): Likewise.
1282         (ComposedCast.DoResolveAsTypeStep): Likewise.
1283         (StackAlloc.DoResolve): Likewise.
1284         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1285         (Block.Unsafe): New property.
1286         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1287         (Unsafe): Set 'unsafe' flag of contained block.
1288         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1289         (Fixed.Resolve): Likewise.
1290         (Catch.Resolve): Likewise.
1291         (Using.ResolveLocalVariableDecls): Likewise.
1292         (Foreach.Resolve): Likewise.
1293
1294 2004-10-05  John Luke <john.luke@gmail.com>
1295
1296         * cs-parser.jay: add location to error CS0175
1297
1298 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1299
1300         * ecore.cs (Expression.Constantity): Add support for turning null
1301         into a constant.
1302
1303         * const.cs (Const.Define): Allow constants to be reference types
1304         as long as the value is Null.
1305
1306 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1307
1308         * namespace.cs (NamespaceEntry.Using): No matter which warning
1309         level is set, check if this namespace name has already been added.
1310
1311 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1312
1313         * expression.cs: reftype [!=]= null should always use br[true,false].
1314         # 67410
1315
1316 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1317
1318         Fix #67108
1319         * attribute.cs: Enum conversion moved to 
1320         GetAttributeArgumentExpression to be applied to the all
1321         expressions.
1322
1323 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1324
1325         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1326         * class.c (TypeContainer.DefineType): Flag error if
1327         base types aren't accessible due to access permissions.
1328         * decl.cs (DeclSpace.ResolveType): Move logic to
1329         Expression.ResolveAsTypeTerminal.
1330         (DeclSpace.ResolveTypeExpr): Thin layer over
1331         Expression.ResolveAsTypeTerminal.
1332         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1333         Refactor code into NestedAccess.  Use it.
1334         (DeclSpace.NestedAccess): New.
1335         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1336         argument to silence errors.  Check access permissions.
1337         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1338         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1339         (Cast.DoResolve): Likewise.
1340         (New.DoResolve): Likewise.
1341         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1342         (TypeOf.DoResolve): Likewise.
1343
1344         * expression.cs (Invocation.BetterConversion): Return the Type of
1345         the better conversion.  Implement section 14.4.2.3 more faithfully.
1346         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1347         section 14.4.2.2 explicit.
1348         (Invocation.OverloadResolve): Update.
1349         (Invocation): Remove is_base field.
1350         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1351         (Invocation.Emit): Likewise.
1352
1353 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1354
1355         * README: Update to changes.
1356
1357 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1358
1359         * cs-parser.jay: Reverted 642 warning fix.
1360
1361 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1362
1363         Fix bug #66615
1364         * decl.cs (FindMemberWithSameName): Indexer can have more than
1365         1 argument.
1366
1367 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1368
1369         * expression.cs (LocalVariableReference.DoResolveLValue):
1370         Do not report warning 219 for out values.
1371         (EmptyExpression.Null): New member to avoid extra allocations.
1372
1373 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1374
1375         * cs-parser.jay: Fix wrong warning 642 report.
1376
1377         * cs-tokenizer.cs (CheckNextToken): New helper;
1378         Inspect next character if is same as expected.
1379
1380 2004-09-23  Martin Baulig  <martin@ximian.com>
1381
1382         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1383         (Convert.ImplicitReferenceConversionExists): Likewise.
1384
1385 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1386
1387         * class.cs (Operator.Define): Add error 448 and 559 report.
1388
1389 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1390
1391         * class.cs (MemberBase.IsTypePermitted): New protected
1392         method for checking error CS0610.
1393
1394 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1395
1396         * class.cs (TypeContainer.HasExplicitLayout): New property
1397         Returns whether container has StructLayout attribute set Explicit.
1398         (FieldMember): New abstract class for consts and fields.
1399         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1400         (Field): Reuse FieldMember.
1401
1402         * const.cs (Const): Reuse FieldMember.
1403
1404         * rootcontext.cs: EmitConstants call moved to class.
1405
1406 2004-09-22  Martin Baulig  <martin@ximian.com>
1407
1408         Thanks to Peter Sestoft for this bug report.
1409
1410         * expression.cs (Conditional): If both the `trueExpr' and the
1411         `falseExpr' is a NullLiteral, return a NullLiteral.
1412
1413 2004-09-22  Martin Baulig  <martin@ximian.com>
1414
1415         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1416         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1417         for the "get_Current" call.
1418
1419 2004-09-22  Martin Baulig  <martin@ximian.com>
1420
1421         Marek and me just fixed one of our oldest bugs: #28562 :-)
1422
1423         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1424
1425         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1426         we're an EnumConstant, just return that.
1427         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1428         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1429         to get the value which'll actually be written into the attribute.
1430         However, we have to use GetValue() to access the attribute's value
1431         in the compiler.        
1432
1433 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1434
1435         * constant.cs (Constant.IsNegative): New abstract property
1436         IsNegative.
1437
1438         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1439         (StackAlloc.DoResolve): Reused IsNegative.
1440
1441 2004-09-21  Martin Baulig  <martin@ximian.com>
1442
1443         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1444         if we're used in an iterator, we may be called from different
1445         methods.
1446
1447         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1448         we actually have an exception block.
1449
1450 2004-09-20  John Luke <jluke@cfl.rr.com>
1451
1452         * class.cs, cs-parser.jay: Improve the error report for 1520:
1453         report the actual line where the error happens, not where the
1454         class was declared.
1455
1456         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1457         Pass location information that was available elsewhere.
1458
1459 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1460
1461         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1462         runtime to delay sign assemblies.
1463
1464 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1465
1466         * cs-parser.jay: Do not report the stack trace, this is barely
1467         used nowadays.
1468
1469 2004-08-22  John Luke  <john.luke@gmail.com>
1470  
1471         * driver.cs : check that a resource id is not already used
1472         before adding it, report CS1508 if it is, bug #63637
1473
1474 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1475
1476         * ecore.cs: Removed dead code.
1477
1478 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1479
1480         * class.cs: Do not report warning CS0067 on the interfaces.
1481
1482 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1483
1484         * cs-parser.jay: Add error 504 report.
1485
1486 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1487
1488         * rootcontext.cs: WarningLevel is 4 by default now.
1489
1490         * statement.cs (Fixed.Resolve): Do not null
1491         VariableInfo.
1492
1493 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1494
1495         Fixed bug #55780
1496         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1497         deep search when property is not virtual.
1498         (PropertyExpr.ResolveAccessors): Make one call for both
1499         accessors.
1500
1501 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1502
1503         Fixed bug #65766
1504         * statement.cs: Error 152 report constains also location.
1505
1506 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1507
1508         Fixed bug #65766
1509         * const.cs: Explicitly set constant as static.
1510
1511 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1512
1513         Fixed bug #64226
1514         * cs-parser.jay: Add error 1017 report.
1515
1516 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1517
1518         Fixed bug #59980, #64224
1519         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1520
1521         * typemanager.cs (IsSpecialMethod): Simplified
1522
1523 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1524
1525         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1526         condition with better params.
1527
1528 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1529
1530         Fixed bug #65238
1531         * attribute.cs (Resolve): Property has to have both
1532         accessors.
1533
1534 2004-09-14  Martin Baulig  <martin@ximian.com>
1535
1536         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1537
1538 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1539
1540         Fixed bug #61902
1541         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1542         called and is obsolete then this member suppress message
1543         when call is inside next [Obsolete] method or type.
1544
1545         * expression.cs: Use TestObsoleteMethodUsage member.
1546
1547 2004-09-14  Martin Baulig  <martin@ximian.com>
1548
1549         * cs-parser.jay: Sync a bit with the GMCS version.
1550
1551 2004-09-14  Martin Baulig  <martin@ximian.com>
1552
1553         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1554         (CSharpParser.yacc_verbose_flag): New public field.
1555
1556         * genericparser.cs: Removed.
1557
1558 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1559
1560         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1561
1562 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1563
1564         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1565
1566 2004-09-10  Martin Baulig  <martin@ximian.com>
1567
1568         Backported my MemberName changes from GMCS into MCS.
1569
1570         - we are now using a special `MemberName' class instead of using
1571         strings; in GMCS, the `MemberName' also contains the type
1572         arguments.
1573
1574         - changed the grammar rules a bit:
1575           * the old `member_name' is now a `namespace_or_type_name':
1576             The rule is that we use `namespace_or_type_name' everywhere
1577             where we expect either a "member name" (GetEnumerator) or a
1578             "member name" with an explicit interface name
1579             (IEnumerable.GetEnumerator).
1580             In GMCS, the explicit interface name may include type arguments
1581             (IEnumerable<T>.GetEnumerator).
1582           * we use `member_name' instead of just `IDENTIFIER' for
1583             "member names":
1584             The rule is that we use `member_name' wherever a member may
1585             have type parameters in GMCS.       
1586
1587         * decl.cs (MemberName): New public class.
1588         (MemberCore.MemberName): New public readonly field.
1589         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1590         (DeclSpace): Likewise.
1591
1592         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1593         * enum.cs (Enum.ctor): Likewise.
1594
1595         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1596         MemberName.     
1597         (AliasEntry.ctor): Take a MemberName, not an Expression.
1598         (AliasEntry.UsingAlias): Likewise.
1599
1600         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1601         (IMethodData.MemberName): Changed type from string to MemberName.
1602         (MemberBase.ExplicitInterfaceName): Likewise.
1603         (AbstractPropertyEventMethod.SetupName): Make this private.
1604         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1605         argument; compute the member name here.
1606         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1607         on the `member.MemberName' and the `prefix'.
1608
1609         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1610         not `type_name'.
1611         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1612         thus, we get a `MemberName' instead of a `string'.  These
1613         declarations may have type parameters in GMCS.
1614         (interface_method_declaration, delegate_declaration): Likewise.
1615         (class_declaration, interface_declaration): Likewise.
1616         (method_header): Use `namespace_or_type_name' instead of
1617         `member_name'.  We may be an explicit interface implementation.
1618         (property_declaration, event_declaration): Likewise.
1619         (member_name): This is now just an `IDENTIFIER', not a
1620         `namespace_or_type_name'.
1621         (type_name, interface_type): Removed.
1622         (namespace_or_type_name): Return a MemberName, not an Expression.
1623         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1624         call GetTypeExpression() on the MemberName to get an expression.
1625         (IndexerDeclaration.interface_type): Changed type from string to
1626         MemberName.
1627         (MakeName): Operate on MemberName's instead of string's.
1628
1629 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1630
1631         Fix bug #55770.
1632         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1633         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1634         lookup to avoid symbols introduced by 'using'.
1635         * rootcontext.cs (NamespaceLookup): Update.
1636
1637 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1638
1639         * class.cs (TypeContainer.DoDefineMembers): Do not call
1640         DefineDefaultConstructor for static classes.
1641
1642 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1643
1644         * attribute.cs (Attribute.Resolve): Add error 653 report.
1645
1646         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1647         report.
1648         (Method.ApplyAttributeBuilder): Add error 685 report.
1649         (Operator.Define): Add error 564 report.
1650
1651         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1652
1653         * expression.cs (Invocation.DoResolve): Add error
1654         245 and 250 report.
1655
1656         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1657         error 674 report.
1658
1659 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1660
1661         * class.cs (ConstructorInitializer.Resolve):
1662         Wrong error number (515->516).
1663
1664 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1665
1666         * class.cs (Indexer.Define): Add error 631 report.
1667
1668 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1669
1670         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1671
1672 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1673
1674         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1675
1676 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1677
1678         * cs-parser.jay: Added error CS0241 report.
1679
1680 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1681
1682         * cs-parser.jay (fixed_statement): Introduce a scope for the
1683         declaration in the 'fixed' statement.
1684
1685 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1686
1687         * cs-parser.jay: Added CS0230 error report.
1688
1689 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1690
1691         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1692
1693 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1694
1695         * expression.cs (Argument.Resolve): Added error CS0192 and
1696         CS0199 report.
1697
1698 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1699
1700         C# 2.0 #pragma warning feature
1701
1702         * cs-tokenizer.cs (PreProcessPragma): New method; 
1703         Handles #pragma directive.
1704
1705         * report.cs (WarningRegions): New class; Support
1706         class for #pragma warning directive. It tests whether
1707         warning is enabled for a given line.
1708
1709 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1710
1711         * const.cs: Add more descriptive error report, tahnks to
1712         Sebastien. 
1713
1714 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1715
1716         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1717
1718 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1719
1720         * expression.cs: Apply patch from Ben: Remove dead code from
1721         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1722         as that code just threw an exception anwyays.
1723
1724         * const.cs: Remove the call to the turnintoconstant, for details
1725         see bug: #63144
1726         
1727         * literal.cs: The type of the null-literal is the null type;  So
1728         we use a placeholder type (literal.cs:System.Null, defined here)
1729         for it.
1730
1731         * expression.cs (Conditional.DoResolve): Remove some old code that
1732         is no longer needed, conversions have been fixed.
1733
1734         (ArrayCreationExpression.DoResolve): Return false if we fail to
1735         resolve the inner expression.
1736
1737 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1738
1739         Fix test-290.cs.
1740         * cs-parser.jay (delegate_declaration): Record a delegate
1741         declaration as a type declaration.
1742         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1743
1744 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1745
1746         * parameter.cs: Do not crash if the type can not be resolved. 
1747
1748         * expression.cs: Report errors with unsafe pointers, fixes #64896
1749
1750 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1751
1752         * expression.cs: Pointer arith always needs to do a conv.i
1753         if the operand is a long. fix 65320
1754
1755 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1756
1757         Fixed cs0619-37.cs, cs0619-38.cs
1758
1759         * enum.cs (GetObsoleteAttribute): Removed.
1760
1761         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1762         on Enum member is double staged. The first is tested member
1763         and then enum.
1764
1765 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1766
1767         Fixed #56986, #63631, #65231
1768
1769         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1770         adds member to name container.
1771         (TypeContainer.AddToTypeContainer): New method, adds type to
1772         name container.
1773         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1774         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1775         AddOperator): Simplified by reusing AddToMemberContainer.
1776         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1777         instead of field.
1778         (Method.CheckForDuplications): Fixed implementation to test all
1779         possibilities.
1780         (MemberBase): Detection whether member is explicit interface
1781         implementation is now in constructor.
1782         (MemberBase.UpdateMemberName): Handles IndexerName.
1783         (Accessor): Changed to keep also location information.
1784         (AbstractPropertyEventMethod): Is derived from MemberCore.
1785         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1786         will be emited or not.
1787         (PropertyBase.AreAccessorsDuplicateImplementation):
1788         Tests whether accessors are not in collision with some method.
1789         (Operator): Is derived from MethodCore to simplify common
1790         operations.
1791
1792         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1793         must be performed.
1794         (DeclSpace.AddToContainer): Adds the member to defined_names
1795         table. It tests for duplications and enclosing name conflicts.
1796
1797         * enum.cs (EnumMember): Clean up to reuse the base structures
1798
1799 2004-09-03  Martin Baulig  <martin@ximian.com>
1800
1801         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1802         into TypeContainer, to make partial classes work again.
1803
1804 2004-09-03  Martin Baulig  <martin@ximian.com>
1805
1806         * rootcontext.cs (RootContext.V2): Removed.
1807
1808 2004-03-23  Martin Baulig  <martin@ximian.com>
1809
1810         * expression.cs (Invocation.OverloadResolve): Added `bool
1811         may_fail' argument and use it instead of the Location.IsNull() hack.
1812
1813 2004-09-03  Martin Baulig  <martin@ximian.com>
1814
1815         Merged latest changes into gmcs.  Please keep this comment in
1816         here, it makes it easier for me to see what changed in MCS since
1817         the last time I merged.
1818
1819 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1820
1821         Fix #61128.
1822         * expression.cs (BetterConversion): Don't allow either conversion 
1823         to be null.  Remove redundant implicit conversion test when 'q ==
1824         null' -- when this function is invoked, we already know that the
1825         implicit conversion exists.
1826         (BetterFunction): Assume that 'best' is non-null.  Remove
1827         redundant reimplementation of IsApplicable when 'best' is null.
1828         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1829         number of arguments.
1830         (IsAncestralType): Extract from OverloadResolve.
1831         (OverloadResolve): Make robust to the MethodGroupExpr being
1832         unsorted.  Implement all the logic of Section 14.5.5.1, and
1833         support overloading of methods from multiple applicable types.
1834         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1835
1836         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1837         (RealError, Warning): Append type of report to related symbol.
1838
1839 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1840
1841         * enum.cs: Fixed CLS-Compliance checks for enum members.
1842         Error tests cs3008-8.cs, cs3014-8.cs
1843
1844 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1845
1846         Fixed bug #62342, #63102
1847         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1848         like ImplementMethod.
1849
1850 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1851
1852         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1853         Fixed bug #65170.
1854
1855 2004-09-02  Martin Baulig  <martin@ximian.com>
1856
1857         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1858         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1859         on the MethodBase.
1860
1861 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1862
1863         C# 2.0 Static classes implemented
1864
1865         * class.cs (TypeContainer): instance_constructors,
1866         initialized_fields, initialized_static_fields,
1867         default_constructor, base_inteface_types are protected to be
1868         accessible from StaticClass.
1869         (TypeContainer.DefineDefaultConstructor): New virtual method
1870         for custom default constructor generating
1871         (StaticClass): New class to handle "Static classes" feature.
1872
1873         * cs-parser.jay: Handle static keyword on class like instance
1874         of StaticClass.
1875
1876         * driver.cs: Added "/langversion" command line switch with two
1877         options (iso-1, default).
1878
1879 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1880
1881         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1882
1883 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1884
1885         * delegate.cs: Style.
1886
1887 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1888
1889         * delegate.cs: Add seperate instance expr field for miguel.
1890
1891 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1892
1893         * PointerArithmetic (Resolve): make sure we are not doing
1894         pointer arith on void*. Also, make sure we are resolved
1895         by not setting eclass until resolve.
1896
1897         All callers: Make sure that PointerArithmetic gets resolved.
1898
1899 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1900
1901         * ArrayCreation (LookupType): If the type does not resolve 
1902         to an array, give an error.
1903
1904 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1905
1906         * statement.cs (Try.Resolve): Fixed bug #64222
1907
1908 2004-08-27  Martin Baulig  <martin@ximian.com>
1909
1910         * class.cs
1911         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1912         crash here.     
1913
1914 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1915
1916         * ecore.cs (Constantify): Get underlying type via
1917         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1918         Windows in special cases.
1919
1920 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1921
1922         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1923         for obtaining also private methods.
1924         (GetRemoveMethod): Used GetRemoveMethod (true)
1925         for obtaining also private methods.
1926
1927 2004-08-24  Martin Baulig  <martin@ximian.com>
1928
1929         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1930         MethodAttributes.HideBySig for operators.
1931
1932 2004-08-23  Martin Baulig  <martin@ximian.com>
1933
1934         Back to the old error reporting system :-)
1935
1936         * report.cs (Message): Removed.
1937         (Report.MessageData, ErrorData, WarningData): Removed.
1938         (Report.Error, Warning): Back to the old system.
1939
1940 2004-08-23  Martin Baulig  <martin@ximian.com>
1941
1942         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1943
1944         * class.cs (TypeContainer.ParentContainer): New public virtual
1945         method; replaces the explicit interface implementation.
1946         (ClassPart.ParentContainer): Override.
1947
1948 2004-08-23  Martin Baulig  <martin@ximian.com>
1949
1950         * statement.cs (Switch): Added support for constant switches; see
1951         #59428 or test-285.cs.
1952
1953 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1954
1955         Fixed bug #62740.
1956         * statement.cs (GetEnumeratorFilter): Removed useless
1957         logic because C# specs is strict. GetEnumerator must be
1958         public.
1959
1960 2004-08-22  Martin Baulig  <martin@ximian.com>
1961
1962         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1963         a switch and may break, reset the barrier.  Fixes #59867.
1964
1965 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1966
1967         CLS-Compliance speed up (~5% for corlib)
1968
1969         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1970         New method. Tests container for CLS-Compliant names
1971
1972         * class.cs (TypeContainer.VerifyClsName): New method.
1973         Checks whether container name is CLS Compliant.
1974         (Constructor): Implements IMethodData.
1975
1976         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1977         low-case table for CLS Compliance test.
1978         (MemberCache.VerifyClsParameterConflict): New method.
1979         Checks method parameters for CS3006 error.
1980
1981         * enum.cs (EnumMember): Is derived from MemberCore.
1982         (Enum.VerifyClsName): Optimized for better performance.
1983
1984 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1985
1986         * report.cs: Renamed Error_T to Error and changed all
1987         references.
1988
1989 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1990
1991         * class.cs (TypeContainer.IndexerArrayList): New inner class
1992         container for indexers.
1993         (TypeContainer.DefaultIndexerName): New constant for default
1994         indexer name. Replaced all "Item" with this constant.
1995         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1996
1997         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1998         DefaultMemberAttribute constructor.
1999
2000 2004-08-05  Martin Baulig  <martin@ximian.com>
2001
2002         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2003         Fix bug #59429.
2004
2005 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2006
2007         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2008         multi platforms problem.
2009
2010         * compiler.csproj: Included shared files.
2011
2012 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2013
2014         Fix bug 60333, 55971 in the more general way
2015         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2016         Added arg_type argument for constant conversion.
2017         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2018
2019 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2020
2021         Fix bug #59760
2022         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2023         OperatorArrayList, MethodCoreArrayList for typecontainer
2024         containers. Changed class member types to these new types.
2025         (MethodArrayList.DefineMembers): Added test for CS0659.
2026
2027 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2028
2029         * cfold.cs: Synchronize the folding with the code in expression.cs
2030         Binary.DoNumericPromotions for uint operands.
2031
2032         * attribute.cs: Revert patch from Raja, it introduced a regression
2033         while building Blam-1.2.1 (hard to isolate a test case).
2034
2035 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2036
2037         Fix for #55382
2038         * class.cs:
2039         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2040         name collision.
2041         (MethodCore.parent_method): New member. The method we're overriding
2042         if this is an override method.
2043         (MethodCore.CheckBase): Moved from Method class and made common.
2044         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2045         private.
2046         (MethodCore.CheckForDuplications): New abstract method. For custom
2047         member duplication search in a container
2048         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2049         method and its return type.
2050         (Event.conflict_symbol): New member. Symbol with same name in the
2051         parent class.
2052
2053         * decl.cs:
2054         (MemberCache.FindMemberWithSameName): New method. The method
2055         is looking for conflict with inherited symbols.
2056
2057 2004-08-04  Martin Baulig  <martin@ximian.com>
2058
2059         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2060
2061         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2062
2063 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2064
2065         * report.cs (Message): New enum for better error, warning reference in
2066         the code.
2067         (MessageData): New inner abstract class. It generally handles printing of
2068         error and warning messages.
2069         Removed unused Error, Warning, Message methods.
2070
2071 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2072
2073         Fix for cs0592-8.cs test
2074         * attribute.cs
2075         (Attributable.ValidAttributeTargets): Made public.
2076         (Attribute.ExplicitTarget): New member for explicit target value.
2077         (Attribute.CheckTargets): Now we translate explicit attribute
2078         target to Target here.
2079
2080 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2081
2082         * ecore.cs (MethodGroupExpr): new IsBase property.
2083
2084         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2085
2086         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2087         rather than an instance expr.
2088
2089         (DelegateCreation.Emit): Use the method group rather than
2090         the instance expression. Also, if you have base.Foo as the
2091         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2092
2093         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2094
2095         (NewDelegate.DoResolve): Only check for the existance of Invoke
2096         if the method is going to be needed. Use MethodGroupExpr.
2097
2098         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2099
2100         * expression.cs: For pointer arith., make sure to use
2101         the size of the type, not the size of the pointer to
2102         the type.
2103
2104 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2105
2106         Fix for #60722
2107         * class.cs (Class): Added error CS0502 test.
2108
2109 2004-08-03  John Luke  <jluke@cfl.rr.com>
2110             Raja R Harinath  <rharinath@novell.com>
2111
2112         Fix for #60997.
2113         * attribute.cs (Attribute.complained_before): New flag.
2114         (Attribute.ResolveType, Attribute.Resolve),
2115         (Attribute.DefinePInvokeMethod): Set it.
2116         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2117         
2118 2004-08-03  Martin Baulig  <martin@ximian.com>
2119
2120         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2121         use a user-defined operator; we still need to do numeric
2122         promotions in case one argument is a builtin type and the other
2123         one has an implicit conversion to that type.  Fixes #62322.
2124
2125 2004-08-02  Martin Baulig  <martin@ximian.com>
2126
2127         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2128         (LocalInfo.IsThis): New public property.
2129         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2130
2131 2004-08-01  Martin Baulig  <martin@ximian.com>
2132
2133         * class.cs (TypeContainer.GetClassBases): Don't set the default
2134         here since we may get called from GetPartialBases().
2135         (TypeContainer.DefineType): If GetClassBases() didn't return a
2136         parent, use the default one.
2137
2138 2004-07-30  Duncan Mak  <duncan@ximian.com>
2139
2140         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2141
2142 2004-07-30  Martin Baulig  <martin@ximian.com>
2143
2144         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2145
2146         * class.cs (SourceMethod): New public class, derive from the
2147         symbol writer's ISourceMethod.
2148         (Method): Use the new symbol writer API.
2149
2150         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2151         as argument and use the new symbol writer.
2152
2153         * location.cs
2154         (SourceFile): Implement the symbol writer's ISourceFile.
2155         (Location.SymbolDocument): Removed.
2156         (Location.SourceFile): New public property.
2157
2158         * symbolwriter.cs: Use the new symbol writer API.
2159
2160 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2161
2162         * Makefile (install-local): Remove.  Functionality moved to
2163         executable.make.
2164
2165 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2166
2167         * Makefile: Install mcs.exe.config file together with mcs.exe.
2168         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2169         correct runtime version.
2170         
2171 2004-07-25  Martin Baulig  <martin@ximian.com>
2172
2173         * class.cs
2174         (TypeContainer.RegisterOrder): Removed, this was unused.
2175         (TypeContainer, interface_order): Removed.
2176         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2177         TypeContainer as argument since we can also be called with a
2178         `PartialContainer' for a partial class/struct/interface.
2179         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2180         of checking whether we're an `Interface' - we could be a
2181         `PartialContainer'.
2182         (PartialContainer.Register): Override; call
2183         AddClass()/AddStruct()/AddInterface() on our parent.
2184
2185         * cs-parser.jay (interface_member_declaration): Add things to the
2186         `current_container', not the `current_class'.
2187
2188         * rootcontext.cs (RegisterOrder): The overloaded version which
2189         takes an `Interface' was unused, removed.
2190
2191         * typemanager.cs (TypeManager.LookupInterface): Return a
2192         `TypeContainer', not an `Interface'.
2193         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2194         contain a `PartialContainer' for an interface, so check it's
2195         `Kind' to figure out what it is.
2196
2197 2004-07-25  Martin Baulig  <martin@ximian.com>
2198
2199         * class.cs (Class.DefaultTypeAttributes): New public constant.
2200         (Struct.DefaultTypeAttributes): Likewise.
2201         (Interface.DefaultTypeAttributes): Likewise.
2202         (PartialContainer.TypeAttr): Override this and add the
2203         DefaultTypeAttributes.
2204
2205 2004-07-25  Martin Baulig  <martin@ximian.com>
2206
2207         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2208         we can just use the `Parent' field instead.
2209
2210 2004-07-25  Martin Baulig  <martin@ximian.com>
2211
2212         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2213
2214 2004-07-25  Martin Baulig  <martin@ximian.com>
2215
2216         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2217         our parts before defining any methods.
2218         (TypeContainer.VerifyImplements): Make this virtual.
2219         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2220         on our PartialContainer.
2221
2222 2004-07-25  Martin Baulig  <martin@ximian.com>
2223
2224         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2225
2226         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2227         argument, we can just use the `Parent' field instead.
2228
2229         * class.cs
2230         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2231         (MemberBase.DoDefine): Likewise.
2232
2233 2004-07-24  Martin Baulig  <martin@ximian.com>
2234
2235         * decl.cs (MemberCore.Parent): New public field.
2236         (DeclSpace.Parent): Moved to MemberCore.
2237
2238         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2239         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2240         parent's .ctor.
2241         (FieldBase, Field, Operator): Likewise.
2242         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2243         (EventField, Event): Likewise.
2244
2245 2004-07-23  Martin Baulig  <martin@ximian.com>
2246
2247         * class.cs (PartialContainer): New public class.
2248         (ClassPart): New public class.
2249         (TypeContainer): Added support for partial classes.
2250         (TypeContainer.GetClassBases): Splitted some of the functionality
2251         out into GetNormalBases() and GetPartialBases().
2252
2253         * cs-tokenizer.cs (Token.PARTIAL): New token.
2254         (Tokenizer.consume_identifier): Added some hacks to recognize
2255         `partial', but only if it's immediately followed by `class',
2256         `struct' or `interface'.
2257
2258         * cs-parser.jay: Added support for partial clases.
2259
2260 2004-07-23  Martin Baulig  <martin@ximian.com>
2261
2262         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2263         a `DeclSpace' and also made it readonly.
2264         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2265         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2266         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2267
2268         * cs-parser.jay: Pass the `current_class', not the
2269         `current_container' (at the moment, this is still the same thing)
2270         to a new Method, Property, Event, Indexer or Constructor.
2271
2272 2004-07-23  Martin Baulig  <martin@ximian.com>
2273
2274         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2275         and removed the `current_interface' one.
2276         (struct_declaration, class_declaration, interface_declaration):
2277         Set `current_class' to the newly created class/struct/interface;
2278         set their `Bases' and call Register() before parsing their body.
2279
2280 2004-07-23  Martin Baulig  <martin@ximian.com>
2281
2282         * class.cs (Kind): New public enum.
2283         (TypeContainer): Made this class abstract.
2284         (TypeContainer.Kind): New public readonly field.
2285         (TypeContainer.CheckDef): New public method; moved here from
2286         cs-parser.jay.
2287         (TypeContainer.Register): New public abstract method.
2288         (TypeContainer.GetPendingImplementations): New public abstract
2289         method.
2290         (TypeContainer.GetClassBases): Removed the `is_class' and
2291         `is_iface' parameters.
2292         (TypeContainer.DefineNestedTypes): Formerly known as
2293         DoDefineType().
2294         (ClassOrStruct): Made this class abstract.
2295
2296         * tree.cs (RootTypes): New public type. 
2297
2298 2004-07-20  Martin Baulig  <martin@ximian.com>
2299
2300         * tree.cs (Tree.RecordNamespace): Removed.
2301         (Tree.Namespaces): Removed.
2302
2303         * rootcontext.cs (RootContext.IsNamespace): Removed.
2304
2305         * cs-parser.jay (namespace_declaration): Just create a new
2306         NamespaceEntry here.
2307
2308 2004-07-20  Martin Baulig  <martin@ximian.com>
2309
2310         * statement.cs (ExceptionStatement): New abstract class.  This is
2311         now used as a base class for everyone who's using `finally'.
2312         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2313         our local variables before using them.
2314
2315         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2316         virtual method.  This is used by Yield.Resolve() to "steal" an
2317         outer block's `finally' clauses.
2318         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2319         argument.
2320
2321         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2322         version which takes an ExceptionStatement.  This version must be
2323         used to create exception branchings.
2324
2325         * iterator.cs
2326         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2327         (Iterator.EmitMoveNext): Added exception support; protect the
2328         block with a `fault' clause, properly handle 'finally' clauses.
2329         (Iterator.EmitDispose): Run all the `finally' clauses here.
2330
2331 2004-07-20  Martin Baulig  <martin@ximian.com>
2332
2333         * iterator.cs: This is the first of a set of changes in the
2334         iterator code.  Match the spec more closely: if we're an
2335         IEnumerable, then GetEnumerator() must be called.  The first time
2336         GetEnumerator() is called, it returns the current instance; all
2337         subsequent invocations (if any) must create a copy.
2338
2339 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2340
2341         * expression.cs: Resolve the constant expression before returning
2342         it. 
2343
2344 2004-07-19  Martin Baulig  <martin@ximian.com>
2345
2346         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2347         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2348         the return type of the new EmitContext.
2349
2350 2004-07-18  Martin Baulig  <martin@ximian.com>
2351
2352         * class.cs (Property.Define): Fix iterators.
2353
2354         * iterators.cs (Iterator.Define): Moved the
2355         `container.AddInterator (this)' call here from the .ctor; only do
2356         it if we resolved successfully.
2357
2358 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2359
2360         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2361         `true' for preprocessing directives that we parse.  The return
2362         value indicates whether we should return to regular tokenizing or
2363         not, not whether it was parsed successfully.
2364
2365         In the past if we were in: #if false ... #line #endif, we would
2366         resume parsing after `#line'.  See bug 61604.
2367
2368         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2369         building: IsEnumType should return true only for enums, not for
2370         enums or System.Enum itself.  This fixes #61593.
2371
2372         Likely what happened is that corlib was wrong: mcs depended on
2373         this bug in some places.  The bug got fixed, we had to add the
2374         hack, which caused bug 61593.
2375
2376         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2377         that was a workaround for the older conditions.
2378
2379 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2380
2381         * assign.cs: IAssignMethod has a new interface, as documented
2382         inline. All assignment code now uses this new api.
2383
2384         * ecore.cs, expression.cs: All classes which implement
2385         IAssignMethod now use the new interface.
2386
2387         * expression.cs (Invocation): add a hack to EmitCall so that
2388         IndexerAccess can be the target of a compound assignment without
2389         evaluating its arguments twice.
2390
2391         * statement.cs: Handle changes in Invocation api.
2392
2393 2004-07-16  Martin Baulig  <martin@ximian.com>
2394
2395         * iterators.cs: Rewrote this.  We're now using one single Proxy
2396         class for both the IEnumerable and the IEnumerator interface and
2397         `Iterator' derives from Class so we can use the high-level API.
2398
2399         * class.cs (TypeContainer.AddIterator): New method.
2400         (TypeContainer.DoDefineType): New protected virtual method, which
2401         is called from DefineType().
2402         (TypeContainer.DoDefineMembers): Call DefineType() and
2403         DefineMembers() on all our iterators.
2404         (TypeContainer.Emit): Call Emit() on all our iterators.
2405         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2406
2407         * codegen.cs (EmitContext.CurrentIterator): New public field.
2408
2409 2004-07-15  Martin Baulig  <martin@ximian.com>
2410
2411         * typemanager.cs
2412         (TypeManager.not_supported_exception_type): New type.   
2413
2414 2004-07-14  Martin Baulig  <martin@ximian.com>
2415
2416         * iterators.cs: Use real error numbers.
2417
2418 2004-07-14  Martin Baulig  <martin@ximian.com>
2419
2420         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2421         requires this to be a System.Collection.IEnumerable and not a
2422         class implementing that interface.
2423         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2424
2425 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2426
2427         * class.cs: Fixed previous fix, it broke some error tests.
2428
2429 2004-07-12  Martin Baulig  <martin@ximian.com>
2430
2431         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2432         Fixes #61293.
2433
2434 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2435
2436         * assign.cs (LocalTemporary): Add new argument: is_address,If
2437         `is_address' is true, then the value that we store is the address
2438         to the real value, and not the value itself.
2439         
2440         * ecore.cs (PropertyExpr): use the new local temporary
2441         stuff to allow us to handle X.Y += z (where X is a struct)
2442
2443 2004-07-08  Martin Baulig  <martin@ximian.com>
2444
2445         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2446         not always return, just like we're doing in Using.Resolve().
2447
2448 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2449
2450         * cs-parser.jay (fixed_statement): flag this as Pinned.
2451
2452 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2453
2454         * typemanager.cs (TypeManager): Removed MakePinned method, this
2455         mechanism is replaced with the .NET 2.x compatible mechanism of
2456         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2457
2458         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2459         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2460         `IsFixed' property which has a different meaning.
2461
2462 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2463
2464         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2465         visible from inside a nested class, not just the names of the
2466         immediately enclosing class.
2467         Fix for bug #60730.
2468
2469 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2470
2471         * expression.cs (BetterConversion): Remove buggy special-case
2472         handling of "implicit constant expression conversions".  At this
2473         point, we already know that the conversion is possible -- we're
2474         only checking to see which is better.
2475
2476 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2477
2478         * cs-parser.jay: Added error CS0210 test.
2479
2480 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2481
2482         * cs-parser.jay: Added error CS0134 test.
2483
2484 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2485
2486         Fix bug #52507
2487         * cs-parser.jay: Added error CS0145 test.
2488
2489 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2490
2491         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2492
2493 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2494         
2495         * expression.cs (StackAlloc.Resolve): The argument may not
2496         be a constant; deal with this case.
2497         
2498 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2499
2500         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2501         GetIndexerAttributeValue.
2502         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2503
2504         * class.cs (Indexer.Define): Added error tests for CS0415,
2505         CS0609.
2506
2507 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2508
2509         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2510         property code.
2511
2512 2004-06-23  Martin Baulig  <martin@ximian.com>
2513
2514         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2515         neither return nor throw, reset the barrier as well.  Fixes #60457.
2516
2517 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2518
2519         * class.cs : EventAttributes is now set to None by default.
2520           This fixes bug #60459.
2521
2522 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2523
2524         Fix bug #60219
2525         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2526         Don't throw exception but return null (it's sufficient now).
2527
2528 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2529
2530         * typemanager.cs (GetArgumentTypes): Faster implementation.
2531
2532 2004-06-18  Martin Baulig  <martin@ximian.com>
2533
2534         * attribute.cs (Attribute.Resolve): Check whether we're an
2535         EmptyCast which a Constant child.  Fixes #60333.
2536
2537 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2538
2539         * statement.cs (EmitCollectionForeach): Account for the fact that
2540         not all valuetypes are in areas which we can take the address of.
2541         For these variables, we store to a temporary variable. Also, make
2542         sure that we dont emit a `callvirt' on a valuetype method.
2543
2544 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2545
2546         * expression.cs (StackAlloc.DoReSolve): Added test for
2547         negative parameter (CS0247).
2548
2549 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2550
2551         Fix bug #59792
2552         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2553
2554 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2555
2556         Fix bug #59781
2557         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2558         ulong.
2559
2560 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2561
2562         Fix bug #58254 & cs1555.cs, cs1556.cs
2563         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2564
2565 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2566
2567         * cs-parser.jay: Added error CS1669 test for indexers.
2568
2569 2004-06-11  Martin Baulig  <martin@ximian.com>
2570
2571         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2572         call this twice: for params and varargs methods.
2573
2574 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2575
2576         * class.cs:
2577         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2578
2579 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2580
2581         * attribute.cs (Attribute.GetValidTargets): Made public.
2582
2583         * class.cs: 
2584         (AbstractPropertyEventMethod): New class for better code sharing.
2585         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2586         CS1667 report.
2587         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2588
2589 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2590
2591         Fix bug #59477.
2592         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2593         that the call to Resolve is part of a MemberAccess.
2594         (Expression.Resolve): Use it for SimpleName resolution.
2595         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2596         Add 'intermediate' boolean argument.
2597         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2598         error message when the SimpleName can be resolved ambiguously
2599         between an expression and a type.
2600         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2601         public.
2602         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2603         call on the left-side.
2604
2605 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2606
2607         * class.cs:
2608         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2609
2610 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2611
2612         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2613
2614 2004-06-11  Martin Baulig  <martin@ximian.com>
2615
2616         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2617         varargs methods if applicable.
2618
2619 2004-06-11  Martin Baulig  <martin@ximian.com>
2620
2621         * expression.cs (Invocation.EmitCall): Don't use
2622         `method.CallingConvention == CallingConventions.VarArgs' since the
2623         method could also have `CallingConventions.HasThis'.
2624
2625 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2626
2627         * class.cs (Event.GetSignatureForError): Implemented.
2628         Fixed crash in error test cs3010.cs
2629
2630 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2631
2632         * cs-tokenizer.cs: Change the way we track __arglist to be
2633         consistent with the other keywords.
2634
2635 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2636
2637         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2638         tomorrow.
2639
2640 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2641
2642         * codegen.cs: Check that all referenced assemblies have a strongname
2643         before strongnaming the compiled assembly. If not report error CS1577.
2644         Fix bug #56563. Patch by Jackson Harper.
2645         * typemanager.cs: Added a method to return all referenced assemblies.
2646         Fix bug #56563. Patch by Jackson Harper.
2647
2648 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2649
2650         * class.cs:
2651         (Method.ApplyAttributeBuilder): Moved and added conditional
2652         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2653
2654         * delegate.cs:
2655         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2656
2657 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2658
2659         Fixed #59640
2660         * class.cs: (EventField.attribute_targets): Changed default target.
2661
2662 2004-06-08  Martin Baulig  <martin@ximian.com>
2663
2664         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2665
2666 2004-06-08  Martin Baulig  <martin@ximian.com>
2667
2668         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2669
2670 2004-06-07  Martin Baulig  <martin@ximian.com>
2671
2672         Added support for varargs methods.
2673
2674         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2675         keyword.
2676
2677         * cs-parser.jay: Added support for `__arglist'.
2678
2679         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2680
2681         * expression.cs (Argument.AType): Added `ArgList'.
2682         (Invocation): Added support for varargs methods.
2683         (ArglistAccess): New public class.
2684         (Arglist): New public class.
2685
2686         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2687
2688         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2689         a method's top-level block if the method has varargs.
2690
2691         * support.cs (ReflectionParameters, InternalParameters): Added
2692         support for varargs methods.    
2693
2694 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2695
2696         * class.cs: Provide location in indexer error report.
2697
2698         * driver.cs: Use standard names.
2699
2700         * namespace.cs: Catch the use of using after a namespace has been
2701         declared also on using aliases.
2702
2703 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2704
2705         Bug #50820.
2706         * typemanager.cs (closure_private_ok, closure_invocation_type)
2707         (closure_qualifier_type, closure_invocation_assembly)
2708         (FilterWithClosure): Move to ...
2709         (Closure): New internal nested class.
2710         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2711         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2712         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2713         (MemberLookup, MemberLookupFailed): Use it.
2714         * expression.cs (New.DoResolve): Treat the lookup for the
2715         constructor as being qualified by the 'new'ed type.
2716         (Indexers.GetIndexersForTypeOrInterface): Update.
2717
2718 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2719
2720         * attribute.cs
2721         (GetConditionalAttributeValue): New method. Returns
2722         condition of ConditionalAttribute.
2723         (SearchMulti): New method.  Returns all attributes of type 't'.
2724         Use it when attribute is AllowMultiple = true.
2725         (IsConditionalMethodExcluded): New method.
2726
2727         * class.cs
2728         (Method.IsExcluded): Implemented. Returns true if method has conditional
2729         attribute and the conditions is not defined (method is excluded).
2730         (IMethodData): Extended interface for ConditionalAttribute support.
2731         (PropertyMethod.IsExcluded): Implemented.
2732
2733         * decl.cs
2734         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2735
2736         * expression.cs
2737         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2738         on the method.
2739
2740 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2741
2742         * expression.cs (ArrayCreationExpression): Make this just an
2743         `expression'. It can't be a statement, so the code here was
2744         dead.
2745
2746 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2747
2748         Fixed #59072
2749         * typemanager.cs (GetFullNameSignature): New method for
2750         MethodBase types.
2751
2752 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2753
2754         Fixed #56452
2755         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2756         Use this method when MethodBuilder is null.
2757         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2758         Added test for error CS0626 (MONO reports error for this situation).
2759         (IMethodData.GetSignatureForError): Extended interface.
2760
2761 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2762
2763         * attribute.cs
2764         (AttributeTester.GetObsoleteAttribute): Returns instance of
2765         ObsoleteAttribute when type is obsolete.
2766
2767         * class.cs
2768         (TypeContainer.VerifyObsoleteAttribute): Override.
2769         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2770         (MethodCode.VerifyObsoleteAttribute): Override.
2771         (MemberBase.VerifyObsoleteAttribute): Override.
2772
2773         * decl.cs
2774         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2775         and report proper error.
2776
2777         *delegate.cs
2778         Delegate.VerifyObsoleteAttribute): Override.
2779
2780         * ecore.cs
2781         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2782         and report proper error.
2783         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2784
2785         * enum.cs
2786         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2787         and enum member.
2788
2789         * expression.cs
2790         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2791         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2792         Added test for ObsoleteAttribute.
2793
2794         * statement.cs
2795         (Catch): Derived from Statement.
2796
2797 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2798  
2799         Fixed bug #59071 & cs0160.cs
2800  
2801         * statement.cs (Try.Resolve): Check here whether order of catch
2802         clauses matches their dependencies.
2803
2804 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2805
2806         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2807         caused a regression: #59343.  Referencing nested classes from an
2808         assembly stopped working.
2809
2810 2004-05-31  Martin Baulig  <martin@ximian.com>
2811
2812         MCS is now frozen for beta 2.
2813
2814 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2815
2816         * convert.cs: add a trivial cache for overload operator resolution.
2817
2818 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2819
2820         * decl.cs: If possible, use lookuptypedirect here. We can only do
2821         this if there is no `.' after the namespace. Avoids using
2822         LookupType, which does lots of slow processing.
2823         (FindNestedType) New method, does what it says :-).
2824         * namespace.cs: use LookupTypeDirect.
2825         * rootcontext.cs: use membercache, if possible.
2826         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2827
2828 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2829
2830         * expression.cs:
2831         According to the spec, 
2832
2833         In a member access of the form E.I, if E is a single identifier,
2834         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2835         field, property, localvariable, or parameter with the same type as
2836         the meaning of E as a type-name (§3.8), then both possible
2837         meanings of E are permitted.
2838
2839         We did not check that E as a simple-name had the same type as E as
2840         a type name.
2841
2842         This trivial check gives us 5-7% on bootstrap time.
2843
2844 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2845
2846         * expression.cs (Invocation.OverloadResolve): Avoid the
2847         use of hashtables and boxing here by allocating on demand.
2848
2849 2004-05-30  Martin Baulig  <martin@ximian.com>
2850
2851         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2852         we're doing a silent lookup.  Don't try to lookup nested types in
2853         TypeManager.object_type (thanks to Ben Maurer).
2854
2855 2004-05-30  Martin Baulig  <martin@ximian.com>
2856
2857         Committing a patch from Ben Maurer.
2858
2859         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2860
2861 2004-05-29  Martin Baulig  <martin@ximian.com>
2862
2863         * class.cs (IMethodData.ShouldIgnore): New method.
2864
2865         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2866         `Location' argument, we don't need it anywhere.  Use
2867         `IMethodData.ShouldIgnore ()' instead of
2868         `MethodData.GetMethodFlags ()'.
2869         (TypeManager.AddMethod): Removed.
2870         (TypeManager.AddMethod2): Renamed to AddMethod.
2871
2872 2004-05-29  Martin Baulig  <martin@ximian.com>
2873
2874         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2875
2876         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2877         converting from a class type S to an interface type and we already
2878         have an object on the stack, don't box it again.  Fixes #52578.
2879
2880 2004-05-29  Martin Baulig  <martin@ximian.com>
2881
2882         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2883         Added support for `params' parameters.  Fixes #59267.
2884
2885 2004-05-29  Martin Baulig  <martin@ximian.com>
2886
2887         * literal.cs (NullPointer): Provide a private .ctor which sets
2888         `type' to TypeManager.object_type.  Fixes #59048.
2889
2890 2004-05-29  Martin Baulig  <martin@ximian.com>
2891
2892         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2893         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2894
2895         * ecore.cs (EventExpr.instance_expr): Make the field private.
2896
2897 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2898
2899         Fixed bug #50080 & cs0214-2.cs
2900         * expression.cs (Cast.DoResolve): Check unsafe context here.
2901         
2902         * statement.cs (Resolve.DoResolve): Likewise.
2903
2904 2004-05-26  Martin Baulig  <martin@ximian.com>
2905
2906         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2907
2908         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2909         (RootContext.LookupType): Pass down the `silent' flag.
2910
2911 2004-05-25  Martin Baulig  <martin@ximian.com>
2912
2913         * expression.cs
2914         (MethodGroupExpr.IdenticalTypeName): New public property.
2915         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2916         expression actually refers to a type.
2917
2918 2004-05-25  Martin Baulig  <martin@ximian.com>
2919
2920         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2921         for #56176 and made it actually work.
2922
2923 2004-05-25  Martin Baulig  <martin@ximian.com>
2924
2925         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2926         (FieldExpr, PropertyExpr): Override and implement
2927         CacheTemporaries.  Fixes #52279.
2928
2929 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2930
2931         * location.cs: In the new compiler listing a file twice is a
2932         warning, not an error.
2933
2934 2004-05-24  Martin Baulig  <martin@ximian.com>
2935
2936         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2937         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2938
2939 2004-05-24  Martin Baulig  <martin@ximian.com>
2940
2941         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2942         walking the `using' list.  Fixes #53921.
2943
2944 2004-05-24  Martin Baulig  <martin@ximian.com>
2945
2946         * const.cs (Const.LookupConstantValue): Added support for
2947         EmptyCast's; fixes #55251.
2948
2949 2004-05-24  Martin Baulig  <martin@ximian.com>
2950
2951         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2952         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2953         which does the CS0135 check.  The reason is that we first need to
2954         check whether the variable actually exists.
2955
2956 2004-05-24  Martin Baulig  <martin@ximian.com>
2957
2958         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2959         than RootContext.LookupType() to find the explicit interface
2960         type.  Fixes #58584.
2961
2962 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2963
2964         * Makefile: Simplify.  Use executable.make.
2965         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2966
2967 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2968
2969         * decl.cs:
2970         * enum.cs:
2971         Use the invariant culture when doing String.Compare for CLS case
2972         sensitivity.
2973         
2974 2004-05-23  Martin Baulig  <martin@ximian.com>
2975
2976         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2977         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2978
2979         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2980         
2981 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2982
2983         * class.cs (MemberBase.Define): Reuse MemberType member for 
2984         resolved type. Other methods can use it too.
2985
2986 2004-05-23  Martin Baulig  <martin@ximian.com>
2987
2988         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2989         the variable also exists in the current block (otherwise, we need
2990         to report a CS0103).  Fixes #58670.
2991
2992 2004-05-23  Martin Baulig  <martin@ximian.com>
2993
2994         * flowanalysis.cs (Reachability.Reachable): Compute this
2995         on-the-fly rather than storing it as a field.
2996
2997 2004-05-23  Martin Baulig  <martin@ximian.com>
2998
2999         * flowanalysis.cs (Reachability.And): Manually compute the
3000         resulting `barrier' from the reachability.      
3001        
3002 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3003
3004         Fix bug #57835
3005         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3006         instance of ObsoleteAttribute when symbol is obsolete.
3007
3008         * class.cs
3009         (IMethodData): Extended interface for ObsoleteAttribute support.
3010
3011 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3012
3013         * attribute.cs: Fix bug #55970
3014
3015 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3016
3017         Fix bug #52705
3018         * attribute.cs
3019         (GetObsoleteAttribute): New method. Creates the instance of
3020         ObsoleteAttribute.
3021         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3022         ObsoleteAttribute when member is obsolete.
3023         (AttributeTester.Report_ObsoleteMessage): Common method for
3024         Obsolete error/warning reporting.
3025
3026         * class.cs
3027         (TypeContainer.base_classs_type): New member for storing parent type.
3028
3029         * decl.cs
3030         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3031         for this MemberCore.
3032
3033 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3034
3035         * attribute.cs, const.cs: Fix bug #58590
3036
3037 2004-05-21  Martin Baulig  <martin@ximian.com>
3038
3039         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3040         out parameters if the end of the method is unreachable.  Fixes
3041         #58098. 
3042
3043 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3044
3045         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3046         Hari was right, why extra method.
3047
3048 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3049
3050         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3051
3052 2004-05-20  Martin Baulig  <martin@ximian.com>
3053
3054         Merged this back from gmcs to keep the differences to a minumum.
3055
3056         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3057         instead of a Declspace.
3058         (Attribute.ResolveType): Likewise.
3059         (Attributes.Search): Likewise.
3060         (Attributes.Contains): Likewise.
3061         (Attributes.GetClsCompliantAttribute): Likewise.
3062
3063         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3064         argument.
3065         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3066         DeclSpace.
3067
3068 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3069
3070         Fix bug #58688 (MCS does not report error when the same attribute
3071         is assigned twice)
3072
3073         * attribute.cs (Attribute.Emit): Distinction between null and default.
3074
3075 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3076
3077         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3078         of a top-level attribute without an attribute target.
3079         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3080         Make non-static.
3081         (Attribute.Conditional_GetConditionName), 
3082         (Attribute.Obsolete_GetObsoleteMessage): Update.
3083         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3084         part of ScanForIndexerName.
3085         (Attribute.CanIgnoreInvalidAttribute): New function.
3086         (Attribute.ScanForIndexerName): Move to ...
3087         (Attributes.ScanForIndexerName): ... here.
3088         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3089         (Attributes.Search): New internal variant that can choose not to
3090         complain if types aren't resolved.  The original signature now
3091         complains.
3092         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3093         complaints suppressed.
3094         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3095         only if it not useful.
3096         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3097         top-level for attributes that are shared between the assembly
3098         and a top-level class.
3099         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3100         * class.cs: Update to reflect changes.
3101         (DefineIndexers): Fuse loops.
3102         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3103         a couple more variants of attribute names.
3104
3105 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3106
3107         Fix bug #52585 (Implemented explicit attribute declaration)
3108
3109         * attribute.cs:
3110         (Attributable.ValidAttributeTargets): New abstract method. It gets
3111         list of valid attribute targets for explicit target declaration.
3112         (Attribute.Target): It holds target itself.
3113         (AttributeSection): Removed.
3114         (Attribute.CheckTargets): New method. It checks whether attribute
3115         target is valid for the current element.
3116
3117         * class.cs:
3118         (EventProperty): New class. For events that are declared like
3119         property (with add and remove accessors).
3120         (EventField): New class. For events that are declared like field.
3121         class.cs
3122
3123         * cs-parser.jay: Implemented explicit attribute target declaration.
3124
3125         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3126         Override ValidAttributeTargets.
3127
3128         * parameter.cs:
3129         (ReturnParameter): Class for applying custom attributes on 
3130         the return type.
3131         (ParameterAtribute): New class. Class for applying custom
3132         attributes on the parameter type.
3133
3134 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3135
3136         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3137         definitions. 
3138
3139         (Method): Allow UNSAFE here.
3140
3141         * modifiers.cs: Support unsafe reporting.
3142
3143 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3144
3145         * decl.cs: Fix bug #58478.
3146
3147 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3148
3149         * statement.cs: When checking for unreachable code on an EmptyStatement,
3150         set the location. Fixes bug #58488.
3151
3152 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3153
3154         * driver.cs: Add -pkg handling.
3155
3156         From Gonzalo: UseShelLExecute=false
3157
3158 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3159
3160         * attribute.cs:
3161         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3162         for attribute.
3163         (Attribute.IsClsCompliaceRequired): Moved to base for better
3164         accesibility.
3165         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3166         when attribute is AttributeUsageAttribute.
3167         (Attribute.GetValidTargets): Simplified.
3168         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3169         attribute for this type.
3170         (Attribute.ApplyAttributes): Method renamed to Emit and make
3171         non-static.
3172         (GlobalAttributeSection): New class for special handling of global
3173         attributes (assembly, module).
3174         (AttributeSection.Emit): New method.
3175
3176         * class.cs: Implemented Attributable abstract methods.
3177         (MethodCore.LabelParameters): Moved to Parameter class.
3178         (Accessor): Is back simple class.
3179         (PropertyMethod): Implemented Attributable abstract class.
3180         (DelegateMethod): Implemented Attributable abstract class.
3181         (Event): New constructor for disctintion between normal Event
3182         and Event with accessors.
3183
3184         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3185
3186         * codegen.cs, const.cs, decl.cs, delegate.cs:
3187         (CommonAssemblyModulClass): Implemented Attributable abstract class
3188         and simplified.
3189
3190         * enum.cs: Implement IAttributeSupport interface.
3191         (EnumMember): New class for emum members. Implemented Attributable
3192         abstract class
3193
3194         * parameter.cs:
3195         (ParameterBase): Is abstract.
3196         (ReturnParameter): New class for easier [return:] attribute handling.
3197
3198         * typemanager.cs: Removed builder_to_attr.
3199
3200 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3201
3202         Fix bug #57151.
3203         * attribute.cs (Attribute.GetPositionalValue): New function.
3204         * class.cs (TypeContainer.VerifyMembers): New function.
3205         (TypeContainer.Emit): Use it.
3206         (ClassOrStruct): New base class for Class and Struct.
3207         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3208         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3209         class.
3210         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3211         then each non-static field should have a FieldOffset attribute.
3212         Otherwise, none of the fields should have a FieldOffset attribute.
3213         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3214         and FieldOffset attributes.
3215         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3216         (TypeManager.field_offset_attribute_type): New core types.
3217         (TypeManager.InitCoreTypes): Initialize them.
3218
3219 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3220
3221         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3222         Return correct type.
3223         From bug #58270.
3224
3225 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3226
3227         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3228         be implicitly converted to ulong.
3229         
3230         * expression.cs: The logic for allowing operator &, | and ^ worked
3231         was wrong, it worked before because we did not report an error in
3232         an else branch.  Fixes 57895.
3233
3234         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3235         allow volatile fields to be reference types.
3236
3237 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3238
3239         * driver.cs: Add support for /debug-
3240
3241 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3242
3243         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3244         Add a 'complain' parameter to silence errors.
3245         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3246         silently overlooked type-resolutions.
3247         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3248         to reflect changes.
3249         (Attributes.Search): New function.
3250         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3251         (Attributes.GetAttributeFullName): Remove hack.
3252         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3253         Update to reflect changes.
3254         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3255         Use Attributes.Search instead of nested loops.
3256
3257 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3258
3259         * decl.cs:
3260         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3261         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3262         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3263
3264         * report.cs: (Report.Warning): Renamed to Warning_T because of
3265         parameter collision.
3266
3267 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3268
3269         * expression.cs (MemberAccess.ResolveMemberAccess):
3270         Exit with non-zero status after Report.Error.
3271         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3272         Likewise.
3273         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3274
3275 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3276
3277         * support.cs: Don't hang when the file is empty.
3278
3279 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3280
3281         * support.cs: In SeekableStreamReader, compute the preamble size of the
3282           underlying stream. Position changes should take into account that initial
3283           count of bytes.
3284
3285 2004-05-03  Todd Berman  <tberman@sevenl.net>
3286
3287         * driver.cs: remove unused GetSysVersion function.
3288
3289 2004-05-03  Todd Berman  <tberman@sevenl.net>
3290
3291         * driver.cs: Remove the hack from saturday, as well as the hack
3292         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3293         link_paths to get that bit proper.
3294
3295 2004-05-01  Todd Berman  <tberman@sevenl.net>
3296
3297         * driver.cs: Try a LoadFrom before a Load, this checks the current
3298         path. This is currently a bug in mono that is be fixed, however, this
3299         provides a workaround for now. This will be removed when the bug
3300         is fixed.
3301
3302 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3303
3304         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3305         incomplete key pairs (#57941).
3306
3307 2004-05-01  Todd Berman  <tberman@sevenl.net>
3308
3309         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3310         from the GAC
3311
3312 2004-04-30  Jackson Harper  <jackson@ximian.com>
3313
3314         * codegen.cs: Open keys readonly.
3315         
3316 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3317
3318         * typemanager.cs: don't report cyclic struct layout when a struct
3319         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3320         which has 2 Pango.Rectangle fields.
3321
3322 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3323
3324         * expression.cs: Handle IntPtr comparisons with IL code
3325         rather than a method call.
3326
3327 2004-04-29  Martin Baulig  <martin@ximian.com>
3328
3329         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3330         the list of PropertyInfo's in class hierarchy and find the
3331         accessor.  Fixes #56013.
3332
3333 2004-04-29  Martin Baulig  <martin@ximian.com>
3334
3335         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3336
3337 2004-04-29  Martin Baulig  <martin@ximian.com>
3338
3339         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3340
3341         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3342
3343 2004-04-29  Martin Baulig  <martin@ximian.com>
3344
3345         * class.cs (ConstructorInitializer.Resolve): Check whether the
3346         parent .ctor is accessible.  Fixes #52146.
3347
3348 2004-04-29  Martin Baulig  <martin@ximian.com>
3349
3350         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3351
3352         * statement.cs (Using.EmitLocalVariableDecls): Use
3353         TypeManager.idisposable_type, not typeof (IDisposable).
3354         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3355
3356 2004-04-29  Martin Baulig  <martin@ximian.com>
3357
3358         * class.cs (Event.Define): Don't emit the field and don't set
3359         RTSpecialName and SpecialName for events on interfaces.  Fixes
3360         #57703. 
3361
3362 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3363
3364         Refactor Attribute.ApplyAttributes.
3365         * attribute.cs (Attributable): New base class for objects that can
3366         have Attributes applied on them.
3367         (Attribute): Make AttributeUsage fields public.
3368         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3369         (Attribute.IsInternalCall): New property.
3370         (Attribute.UsageAttr): Convert to a public read-only property.
3371         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3372         (Attribute.ResolveType, Attribute.Resolve)
3373         (Attribute.ScanForIndexerName): Update to reflect changes.
3374         (Attribute.CheckAttributeTarget): Re-format.
3375         (Attribute.ApplyAttributes): Refactor, to various
3376         Attributable.ApplyAttributeBuilder methods.
3377         * decl.cs (MemberCore): Make Attributable.
3378         * class.cs (Accessor): Make Attributable.
3379         (MethodData.ApplyAttributes): Use proper attribute types, not
3380         attribute names.
3381         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3382         (TypeContainer.ApplyAttributeBuilder)
3383         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3384         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3385         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3386         (Operator.ApplyAttributeBuilder): New factored-out methods.
3387         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3388         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3389         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3390         * parameter.cs (ParameterBase): New Attributable base class
3391         that can also represent Return types.
3392         (Parameter): Update to the changes.
3393
3394 2004-04-29  Jackson Harper  <jackson@ximian.com>
3395
3396         * driver.cs: Prefer the corlib system version when looking for
3397         assemblies in the GAC. This is still a hack, but its a better hack
3398         now.
3399         
3400 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3401
3402         * decl.cs, enum.cs: Improved error 3005 reporting.
3403   
3404         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3405         (related_symbols): New private member for list of symbols
3406         related to reported error/warning.
3407         
3408         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3409
3410 2004-04-29  Martin Baulig  <martin@ximian.com>
3411
3412         * ecore.cs (Expression.Constantify): If we're an enum and
3413         TypeManager.TypeToCoreType() doesn't give us another type, use
3414         t.UnderlyingSystemType.  Fixes #56178.  
3415
3416 2004-04-29  Martin Baulig  <martin@ximian.com>
3417
3418         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3419         interfaces and for each interface, only add members directly
3420         declared in that interface.  Fixes #53255.
3421
3422 2004-04-28  Martin Baulig  <martin@ximian.com>
3423
3424         * expression.cs (ConditionalLogicalOperator): Use a temporary
3425         variable for `left' to avoid that we evaluate it more than once;
3426         bug #52588.
3427
3428 2004-04-28  Martin Baulig  <martin@ximian.com>
3429
3430         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3431         `void[]' (CS1547).
3432
3433 2004-04-28  Martin Baulig  <martin@ximian.com>
3434
3435         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3436         void (CS1547).
3437
3438         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3439         whether the type is not void (CS1547).
3440
3441 2004-04-28  Martin Baulig  <martin@ximian.com>
3442
3443         * expression.cs (Unary.DoResolveLValue): Override this and report
3444         CS0131 for anything but Operator.Indirection.
3445
3446 2004-04-28  Martin Baulig  <martin@ximian.com>
3447
3448         Committing a patch from Ben Maurer; see bug #50820.
3449
3450         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3451         check for classes.
3452
3453         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3454         classes.        
3455
3456 2004-04-28  Martin Baulig  <martin@ximian.com>
3457
3458         Committing a patch from Ben Maurer; see bug #50820.
3459
3460         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3461         check for classes.
3462
3463         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3464         classes.        
3465
3466 2004-04-28  Martin Baulig  <martin@ximian.com>
3467
3468         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3469         (Block.AddLabel): Call DoLookupLabel() to only search in the
3470         current block.
3471
3472 2004-04-28  Martin Baulig  <martin@ximian.com>
3473
3474         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3475         comparing StringConstants and NullLiterals in Equality and Inequality.
3476
3477 2004-04-28  Jackson Harper  <jackson@ximian.com>
3478
3479         * driver.cs: Attempt to load referenced assemblies from the
3480         GAC. This is the quick and dirty version of this method that
3481         doesnt take into account versions and just takes the first
3482         canidate found. Will be good enough for now as we will not have more
3483         then one version installed into the GAC until I update this method.
3484
3485 2004-04-28  Martin Baulig  <martin@ximian.com>
3486
3487         * typemanager.cs (TypeManager.CheckStructCycles): New public
3488         static method to check for cycles in the struct layout.
3489
3490         * rootcontext.cs (RootContext.PopulateTypes): Call
3491         TypeManager.CheckStructCycles() for each TypeContainer.
3492         [Note: We only need to visit each type once.]
3493
3494 2004-04-28  Martin Baulig  <martin@ximian.com>
3495
3496         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3497
3498         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3499         success and added `out object value'.  Use a `bool resolved' field
3500         to check whether we've already been called rather than
3501         `ConstantValue != null' since this breaks for NullLiterals.
3502
3503 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3504
3505         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3506         setting of this flag, since the 'set' method may be non-public.
3507
3508 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3509
3510         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3511         check on current_vector.Block.
3512
3513 2004-04-27  Martin Baulig  <martin@ximian.com>
3514
3515         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3516         a field initializer.  Fixes #56459.
3517
3518 2004-04-27  Martin Baulig  <martin@ximian.com>
3519
3520         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3521         we're not attempting to use an indexer.  Fixes #52154.
3522
3523 2004-04-27  Martin Baulig  <martin@ximian.com>
3524
3525         * statement.cs (Return): Don't create a return label if we don't
3526         need it; reverts my change from January 20th.  Thanks to Ben
3527         Maurer for this.
3528
3529 2004-04-27  Martin Baulig  <martin@ximian.com>
3530
3531         According to the spec, `goto' can only leave a nested scope, but
3532         never enter it.
3533
3534         * statement.cs (Block.LookupLabel): Only lookup in the current
3535         block, don't recurse into parent or child blocks.
3536         (Block.AddLabel): Check in parent and child blocks, report
3537         CS0140/CS0158 if we find a duplicate.
3538         (Block): Removed this indexer for label lookups.
3539         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3540         this already does the error reporting for us.
3541
3542         * flowanalysis.cs
3543         (FlowBranching.UsageVector.Block): New public variable; may be null.
3544         (FlowBranching.CreateSibling): Added `Block' argument.
3545         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3546         label for the target of a `goto' and check whether we're not
3547         leaving a `finally'.
3548
3549 2004-04-27  Martin Baulig  <martin@ximian.com>
3550
3551         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3552         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3553         just for returns).
3554
3555 2004-04-27  Martin Baulig  <martin@ximian.com>
3556
3557         * statement.cs (Block.AddLabel): Also check for implicit blocks
3558         and added a CS0158 check.
3559
3560 2004-04-27  Martin Baulig  <martin@ximian.com>
3561
3562         * flowanalysis.cs (FlowBranchingLoop): New class.
3563         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3564         UsageVector's instead of an ArrayList.
3565         (FlowBranching.Label): Likewise.
3566         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3567         (FlowBranching.AddBreakVector): New method.
3568
3569 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3570
3571         * attribute.cs: Small regression fix: only convert the type if we
3572         the type is different, fixes System.Drawing build.
3573
3574 2004-04-27  Martin Baulig  <martin@ximian.com>
3575
3576         * attribute.cs (Attribute.Resolve): If we have a constant value
3577         for a named field or property, implicity convert it to the correct
3578         type.
3579
3580 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3581
3582         * statement.cs (Block.Block): Implicit blocks share
3583         'child_variable_names' fields with parent blocks.
3584         (Block.AddChildVariableNames): Remove.
3585         (Block.AddVariable): Mark variable as "used by a child block" in
3586         every surrounding block.
3587         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3588         been used in a child block, complain about violation of "Invariant
3589         meaning in blocks" rule.
3590         * cs-parser.jay (declare_local_variables): Don't use
3591         AddChildVariableNames.
3592         (foreach_statement): Don't create an implicit block: 'foreach'
3593         introduces a scope.
3594
3595 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3596
3597         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3598         converting from 0L to ulong.  Fixes 57522.
3599
3600 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3601
3602         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3603         derived class hides via 'new' keyword field from base class (test-242.cs).
3604         TODO: Handle this in the more general way.
3605         
3606         * class.cs (CheckBase): Ditto.
3607
3608 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3609
3610         * decl.cs (caching_flags): New member for storing cached values
3611         as bit flags.
3612         (MemberCore.Flags): New enum where bit flags for caching_flags
3613         are defined.
3614         (MemberCore.cls_compliance): Moved to caching_flags.
3615         (DeclSpace.Created): Moved to caching_flags.
3616
3617         * class.cs: Use caching_flags instead of DeclSpace.Created
3618         
3619 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3620
3621         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3622         if we are only a derived class, not a nested class.
3623
3624         * typemanager.cs: Same as above, but do this at the MemberLookup
3625         level (used by field and methods, properties are handled in
3626         PropertyExpr).   Allow for the qualified access if we are a nested
3627         method. 
3628
3629 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3630
3631         * class.cs: Refactoring.
3632         (IMethodData): New inteface; Holds links to parent members
3633         to avoid member duplication (reduced memory allocation).
3634         (Method): Implemented IMethodData interface.
3635         (PropertyBase): New inner classes for get/set methods.
3636         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3637         (Event): New inner classes for add/remove methods.
3638         (Event.DelegateMethod): Implemented IMethodData interface.
3639
3640         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3641         EmitContext (related to class.cs refactoring).
3642
3643 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3644
3645         * delegate.cs (Delegate.VerifyApplicability): If the number of
3646         arguments are the same as the number of parameters, first try to
3647         verify applicability ignoring  any 'params' modifier on the last
3648         parameter.
3649         Fixes #56442.
3650
3651 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3652
3653         * class.cs (TypeContainer.AddIndexer): Use
3654         'ExplicitInterfaceName' to determine if interface name was
3655         explicitly specified.  'InterfaceType' is not initialized at this time.
3656         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3657         Indexers array is already in the required order.  Initialize
3658         'IndexerName' only if there are normal indexers.
3659         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3660         (TypeContainer.Emit): Emit DefaultMember attribute only if
3661         IndexerName is initialized.
3662         Fixes #56300.
3663
3664 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3665
3666         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3667         Fixes #57007
3668
3669 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3670
3671         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3672         attributes.
3673         Fix for #56456.
3674
3675         * attribute.cs (Attribute.Resolve): Check for duplicate named
3676         attributes.
3677         Fix for #56463.
3678
3679 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3680
3681         * iterators.cs (MarkYield): track whether we are in an exception,
3682         and generate code accordingly.  Use a temporary value to store the
3683         result for our state.
3684
3685         I had ignored a bit the interaction of try/catch with iterators
3686         since their behavior was not entirely obvious, but now it is
3687         possible to verify that our behavior is the same as MS .NET 2.0
3688
3689         Fixes 54814
3690
3691 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3692
3693         * iterators.cs: Avoid creating temporaries if there is no work to
3694         do. 
3695
3696         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3697         Enumerations, use TypeManager.EnumToUnderlying and call
3698         recursively. 
3699
3700         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3701         bug #57013
3702
3703         (This.Emit): Use EmitContext.EmitThis to emit our
3704         instance variable.
3705
3706         (This.EmitAssign): Ditto.
3707
3708         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3709         codepaths, we will move all the functionality into
3710         Mono.CSharp.This 
3711
3712         (FieldExpr.EmitAssign): Ditto.
3713
3714         This fixes several hidden bugs that I uncovered while doing a code
3715         review of this today.
3716
3717         * codegen.cs (EmitThis): reworked so the semantics are more clear
3718         and also support value types "this" instances.
3719
3720         * iterators.cs: Changed so that for iterators in value types, we
3721         do not pass the value type as a parameter.  
3722
3723         Initialization of the enumerator helpers is now done in the caller
3724         instead of passing the parameters to the constructors and having
3725         the constructor set the fields.
3726
3727         The fields have now `assembly' visibility instead of private.
3728
3729 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3730
3731         * expression.cs (Argument.Resolve): Check if fields passed as ref
3732         or out are contained in a MarshalByRefObject.
3733
3734         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3735         another compiler type.
3736
3737 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3738
3739         * class.cs (Indexer.Define): use the new name checking method.
3740         Also, return false on an error.
3741         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3742         (is_identifier_[start/part]_character): make static.
3743
3744 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3745
3746         * expression.cs (Binary.ResolveOperator): Do no append strings
3747         twice: since we can be invoked more than once (array evaluation)
3748         on the same concatenation, take care of this here.  Based on a fix
3749         from Ben (bug #56454)
3750
3751 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3752
3753         * codegen.cs: Fix another case where CS1548 must be reported (when 
3754         delay-sign isn't specified and no private is available #56564). Fix
3755         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3756         error when MCS is used on the MS runtime and we need to delay-sign 
3757         (which seems unsupported by AssemblyBuilder - see #56621).
3758
3759 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3760
3761         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3762         (TypeManager.ComputeNamespaces): Faster implementation for
3763         Microsoft runtime.
3764
3765         * compiler.csproj: Updated AssemblyName to mcs.
3766
3767 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3768
3769         * rootcontext.cs: Add new types to the boot resolution.
3770
3771         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3772         MulticastDelegate is not allowed.
3773
3774         * typemanager.cs: Add new types to lookup: System.TypedReference
3775         and ArgIterator.
3776
3777         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3778         check for TypedReference or ArgIterator, they are not allowed. 
3779
3780         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3781         makes us properly catch 1510 in some conditions (see bug 56016 for
3782         details). 
3783
3784 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3785
3786         * CryptoConvert.cs: update from corlib version
3787         with endian fixes.
3788
3789 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3790
3791         * class.cs (Indexer.Define): Check indexername declaration
3792
3793 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3794
3795         * attribute.cs (IsClsCompliant): Fixed problem with handling
3796         all three states (compliant, not-compliant, undetected).
3797
3798 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3799
3800         * attribute.cs (Attribute): Location is now public.
3801         (Resolve): Store resolved arguments (pos_values) in attribute class.
3802         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3803         (GetClsCompliantAttributeValue): New method that gets
3804         CLSCompliantAttribute value.
3805         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3806         if exists else null.
3807         (AttributeTester): New class for CLS-Compliant verification routines.
3808
3809         * class.cs (Emit): Add CLS-Compliant verification.
3810         (Method.GetSignatureForError): Implemented.
3811         (Constructor.GetSignatureForError): Implemented
3812         (Constructor.HasCompliantArgs): Returns if constructor has
3813         CLS-Compliant arguments.
3814         (Constructor.Emit): Override.
3815         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3816         is needed to test only parameters.
3817         (FieldBase.GetSignatureForError): Implemented.
3818         (TypeContainer): New member for storing base interfaces.
3819         (TypeContainer.FindMembers): Search in base interfaces too.
3820
3821         * codegen.cs (GetClsComplianceAttribute): New method that gets
3822         assembly or module CLSCompliantAttribute value.
3823         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3824         for assembly.
3825         (ModuleClass.Emit): Add error 3012 test.
3826
3827         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3828
3829         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3830         state for all decl types.
3831         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3832         if CLS-Compliant tests are required.
3833         (IsClsCompliaceRequired): New method. Analyze whether code
3834         must be CLS-Compliant.
3835         (IsExposedFromAssembly): New method. Returns true when MemberCore
3836         is exposed from assembly.
3837         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3838         value or gets cached value.
3839         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3840         is explicitly marked with CLSCompliantAttribute.
3841         (IsIdentifierClsCompliant): New abstract method. This method is
3842         used to testing error 3005.
3843         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3844         for identifier and parameters CLS-Compliant testing.
3845         (VerifyClsCompliance): New method. The main virtual method for
3846         CLS-Compliant verifications.
3847         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3848         null. I don't know why is null (too many public members !).
3849         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3850         and get value of first CLSCompliantAttribute that found.
3851
3852         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3853         (VerifyClsCompliance): Override and add extra tests.
3854
3855         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3856         clscheck- disable CLS-Compliant verification event if assembly is has
3857         CLSCompliantAttribute(true).
3858
3859         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3860         ApllyAttribute is now called in emit section as in the other cases.
3861         Possible future Emit integration.
3862         (IsIdentifierClsCompliant): New override.
3863         (VerifyClsCompliance): New override.
3864         (GetEnumeratorName): Returns full enum name.
3865
3866         * parameter.cs (GetSignatureForError): Implemented.
3867
3868         * report.cs (WarningData): New struct for Warning message information.
3869         (LocationOfPreviousError): New method.
3870         (Warning): New method. Reports warning based on the warning table.
3871         (Error_T): New method. Reports error based on the error table.
3872
3873         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3874         verifications are done here.
3875
3876         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3877
3878         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3879         CLSCompliantAttribute.
3880         (all_imported_types): New member holds all imported types from other
3881         assemblies.
3882         (LoadAllImportedTypes): New method fills static table with exported types
3883         from all referenced assemblies.
3884         (Modules): New property returns all assembly modules.
3885
3886 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3887
3888         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3889         throwing a parser error.
3890
3891         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3892         which removes the hardcoded get_/set_ prefixes for properties, as
3893         IL allows for the properties to be named something else.  
3894
3895         Bug #56013
3896
3897         * expression.cs: Do not override operand before we know if it is
3898         non-null.  Fix 56207
3899
3900 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3901
3902         * typemanager.cs: support for pinned variables.
3903
3904 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3905
3906         * decl.cs, typemanager.cs: Avoid using an arraylist
3907         as a buffer if there is only one result set.
3908
3909 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3910
3911         * expression.cs: Make sure you cant call a static method
3912         with an instance expression, bug #56174.
3913
3914 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3915
3916         * class.cs (IsDuplicateImplementation): Improve error reporting to
3917         flag 663 (method only differs in parameter modifier).
3918
3919         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3920         in preprocessor directives.
3921
3922         * location.cs (LookupFile): Allow for the empty path.
3923
3924         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3925         better approach for some of that patch, but its failing with the
3926         CharSet enumeration.  For now try/catch will do.
3927
3928         * typemanager.cs: Do not crash if a struct does not have fields.
3929         Fixes 56150.
3930
3931 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3932
3933         * expression.cs: cs0213, cant fix a fixed expression.
3934         fixes 50231.
3935
3936 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3937
3938         * cs-parser.jay: detect invalid embeded statements gracefully.
3939         bug #51113.
3940
3941 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3942
3943         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3944         As a regex:
3945         s/
3946         the invocation type may not be a subclass of the tye of the item/
3947         The type of the item must be a subclass of the invocation item.
3948         /g
3949
3950         Fixes bug #50820.
3951
3952 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3953
3954         * attribute.cs: Added methods to get a string and a bool from an
3955         attribute. Required to information from AssemblyKeyFileAttribute,
3956         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3957         * codegen.cs: Modified AssemblyName creation to include support for
3958         strongnames. Catch additional exceptions to report them as CS1548.
3959         * compiler.csproj: Updated include CryptoConvert.cs.
3960         * compiler.csproj.user: Removed file - user specific configuration.
3961         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3962         Mono.Security assembly. The original class is maintained and tested in
3963         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3964         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3965         like CSC 8.0 (C# v2) supports.
3966         * Makefile: Added CryptoConvert.cs to mcs sources.
3967         * rootcontext.cs: Added new options for strongnames.
3968
3969 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3970
3971         * driver.cs: For --expect-error, report error code `2'
3972         if the program compiled with no errors, error code `1' if
3973         it compiled with an error other than the one expected.
3974
3975 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3976
3977         * compiler.csproj: Updated for Visual Studio .NET 2003.
3978         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3979         * compiler.sln: Updated for Visual Studio .NET 2003.
3980
3981 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3982
3983         * expression.cs: Fix bug #47234. We basically need to apply the
3984         rule that we prefer the conversion of null to a reference type
3985         when faced with a conversion to 'object' (csc behaviour).
3986
3987 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3988
3989         * statement.cs: Shorter form for foreach, eliminates
3990         a local variable. r=Martin.
3991
3992 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3993
3994         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3995         checks if we can use brtrue/brfalse to test for 0.
3996         * expression.cs: use the above in the test for using brtrue/brfalse.
3997         cleanup code a bit.
3998
3999 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4000
4001         * expression.cs: Rewrite string concat stuff. Benefits:
4002
4003         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4004         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4005         rather than a concat chain.
4006
4007         * typemanager.cs: Add lookups for more concat overloads.
4008
4009 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4010
4011         * expression.cs: Emit shorter il code for array init.
4012
4013         newarr
4014         dup
4015         // set 1
4016
4017         // set 2
4018
4019         newarr
4020         stloc.x
4021
4022         ldloc.x
4023         // set 1
4024
4025         ldloc.x
4026         // set 2
4027
4028 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4029
4030         * statement.cs: Before, two switch blocks would be merged if the
4031         total size of the blocks (end_item - begin_item + 1) was less than
4032         two times the combined sizes of the blocks.
4033
4034         Now, it will only merge if after the merge at least half of the
4035         slots are filled.
4036
4037         fixes 55885.
4038
4039 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4040
4041         * class.cs : csc build fix for GetMethods(). See bug #52503.
4042
4043 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4044
4045         * expression.cs: Make sure fp comparisons work with NaN.
4046         This fixes bug #54303. Mig approved this patch a long
4047         time ago, but we were not able to test b/c the runtime
4048         had a related bug.
4049
4050 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4051
4052         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4053
4054 2004-03-19  Martin Baulig  <martin@ximian.com>
4055
4056         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4057         error here and not in our caller.
4058
4059 2004-03-19  Martin Baulig  <martin@ximian.com>
4060
4061         * interface.cs: Completely killed this file.
4062         (Interface): We're now a TypeContainer and live in class.cs.
4063
4064         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4065         argument; we're now also called for interfaces.
4066         (TypeContainer.DefineMembers): Allow this method being called
4067         multiple times.
4068         (TypeContainer.GetMethods): New public method; formerly known as
4069         Interface.GetMethod().  This is used by PendingImplementation.
4070         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4071         it's now private and non-static.
4072         (Interface): Moved this here; it's now implemented similar to
4073         Class and Struct.
4074         (Method, Property, Event, Indexer): Added `bool is_interface'
4075         argument to their .ctor's.
4076         (MemberBase.IsInterface): New public field.
4077
4078         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4079         instances instead of InterfaceMethod, InterfaceProperty, etc.
4080         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4081         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4082
4083 2004-03-19  Martin Baulig  <martin@ximian.com>
4084
4085         * class.cs (MethodCore.IsDuplicateImplementation): New private
4086         method which does the CS0111 checking.
4087         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4088         Use IsDuplicateImplementation().
4089
4090 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4091
4092         * decl.cs (FindMemberToOverride): New method to find the correct
4093         method or property to override in the base class.
4094         * class.cs
4095             - Make Method/Property use the above method to find the
4096               version in the base class.
4097             - Remove the InheritableMemberSignatureCompare as it is now
4098               dead code.
4099
4100         This patch makes large code bases much faster to compile, as it is
4101         O(n) rather than O(n^2) to do this validation.
4102
4103         Also, it fixes bug 52458 which is that nested classes are not
4104         taken into account when finding the base class member.
4105
4106         Reviewed/Approved by Martin.
4107
4108 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4109
4110         * interface.cs: In all interface classes removed redundant
4111         member initialization.
4112
4113 2004-03-16  Martin Baulig  <martin@ximian.com>
4114
4115         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4116
4117 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4118
4119         * decl.cs (DefineTypeAndParents): New helper method to define a
4120         type's containers before the type itself is defined;  This is a
4121         bug exposed by the recent changes to Windows.Forms when an
4122         implemented interface was defined inside a class that had not been
4123         built yet.   
4124
4125         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4126
4127         (Check): Loop correctly to report errors modifiers
4128         (UNSAFE was not in the loop, since it was the same as TOP).
4129
4130         * interface.cs: Every interface member now takes a ModFlags,
4131         instead of a "is_new" bool, which we set on the base MemberCore. 
4132
4133         Every place where we called "UnsafeOk" in the interface, now we
4134         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4135         the unsafe settings from the member declaration instead of the
4136         container interface. 
4137
4138         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4139
4140         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4141         `set_indexer_name' to the pending bits (one per type).
4142
4143         We fixed a bug today that was picking the wrong method to
4144         override, since for properties the existing InterfaceMethod code
4145         basically ignored the method name.  Now we make sure that the
4146         method name is one of the valid indexer names.
4147
4148 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4149  
4150         * support.cs (SeekableStreamReader): Keep track of stream byte
4151         positions and don't mix them with character offsets to the buffer.
4152
4153         Patch from Gustavo Giráldez
4154
4155 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4156
4157         * interface.cs (InterfaceSetGetBase): Removed double member
4158         initialization, base class does it as well.
4159
4160 2004-03-13  Martin Baulig  <martin@ximian.com>
4161
4162         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4163         when compiling corlib.
4164
4165 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4166
4167         * convert.cs (ExplicitConversion): We were reporting an error on
4168         certain conversions (object_type source to a value type, when the
4169         expression was `null') before we had a chance to pass it through
4170         the user defined conversions.
4171
4172         * driver.cs: Replace / and \ in resource specifications to dots.
4173         Fixes 50752
4174
4175         * class.cs: Add check for duplicate operators.  Fixes 52477
4176
4177 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4178
4179         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4180         that are in the middle of the statements, not only at the end.
4181         Fixes #54987
4182
4183         * class.cs (TypeContainer.AddField): No longer set the
4184         `HaveStaticConstructor' flag, now we call it
4185         `UserDefineStaticConstructor' to diferentiate the slightly
4186         semantic difference.
4187
4188         The situation is that we were not adding BeforeFieldInit (from
4189         Modifiers.TypeAttr) to classes that could have it.
4190         BeforeFieldInit should be set to classes that have no static
4191         constructor. 
4192
4193         See:
4194
4195         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4196
4197         And most importantly Zoltan's comment:
4198
4199         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4200
4201         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4202          before its static fields are used', i.e. initialization does not need
4203          to be triggered by the first access to the type. Setting this flag
4204          helps the JIT to compile better code, since it can run the static
4205          constructor at JIT time, and does not need to generate code to call it
4206          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4207          this flag for lots of classes like String. 
4208          
4209          csc sets this flag if the type does not have an explicit static 
4210          constructor. The reasoning seems to be that if there are only static
4211          initalizers for a type, and no static constructor, then the programmer
4212          does not care when this initialization happens, so beforefieldinit
4213          can be used.
4214          
4215          This bug prevents the AOT compiler from being usable, since it 
4216          generates so many calls to mono_runtime_class_init that the AOT code
4217          is much slower than the JITted code. The JITted code is faster, 
4218          because it does not generate these calls if the vtable is type is
4219          already initialized, which is true in the majority of cases. But the
4220          AOT compiler can't do this."
4221
4222 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4223
4224         * class.cs (MethodData.Emit): Refactor the code so symbolic
4225         information is generated for destructors;  For some reasons we
4226         were taking a code path that did not generate symbolic information
4227         before. 
4228
4229 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4230
4231         * class.cs: Create a Constructor.CheckBase method that
4232         takes care of all validation type code. The method
4233         contains some code that was moved from Define.
4234
4235         It also includes new code that checks for duplicate ctors.
4236         This fixes bug #55148.
4237
4238 2004-03-09  Joshua Tauberer <tauberer@for.net>
4239
4240         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4241         a { ... }-style array creation invokes EmitStaticInitializers
4242         which is not good for reference-type arrays.  String, decimal
4243         and now null constants (NullCast) are not counted toward
4244         static initializers.
4245
4246 2004-03-05  Martin Baulig  <martin@ximian.com>
4247
4248         * location.cs (SourceFile.HasLineDirective): New public field;
4249         specifies whether the file contains or is referenced by a "#line"
4250         directive.
4251         (Location.DefineSymbolDocuments): Ignore source files which
4252         either contain or are referenced by a "#line" directive.        
4253
4254 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4255
4256         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4257         direct access to our parent, so check the method inline there.
4258
4259 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4260
4261         * expression.cs (Invocation.EmitCall): Miguel's last commit
4262         caused a regression. If you had:
4263
4264             T t = null;
4265             t.Foo ();
4266
4267         In Foo the implict this would be null.
4268
4269 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4270
4271         * expression.cs (Invocation.EmitCall): If the method is not
4272         virtual, do not emit a CallVirt to it, use Call.
4273
4274         * typemanager.cs (GetFullNameSignature): Improve the method to
4275         cope with ".ctor" and replace it with the type name.
4276
4277         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4278         as an argument the ConstructorBuilder where it is being defined,
4279         to catch the recursive constructor invocations.
4280
4281 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4282
4283         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4284         routines to check if a type is an enumerable/enumerator allow
4285         classes that implement the IEnumerable or IEnumerator interfaces.
4286
4287         * class.cs (Property, Operator): Implement IIteratorContainer, and
4288         implement SetYields.
4289
4290         (Property.Define): Do the block swapping for get_methods in the
4291         context of iterators.   We need to check if Properties also
4292         include indexers or not.
4293
4294         (Operator): Assign the Block before invoking the
4295         OperatorMethod.Define, so we can trigger the Iterator code
4296         replacement. 
4297
4298         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4299         Property and Operator classes are not created when we parse the
4300         declarator but until we have the block completed, so we use a
4301         singleton SimpleIteratorContainer.Simple to flag whether the
4302         SetYields has been invoked.
4303
4304         We propagate this setting then to the Property or the Operator to
4305         allow the `yield' to function.
4306
4307 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4308
4309         * codegen.cs: Implemented attribute support for modules.
4310         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4311         Assembly/Module functionality.
4312
4313         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4314         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4315         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4316
4317 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4318
4319         * interface.cs (FindMembers): The operation is performed on all base
4320         interfaces and not only on the first. It is required for future CLS Compliance patch.
4321
4322 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4323
4324         * statement.cs, codegen.cs:
4325         This patch deals with patterns such as:
4326
4327         public class List : IEnumerable {
4328
4329                 public MyEnumerator GetEnumerator () {
4330                         return new MyEnumerator(this);
4331                 }
4332
4333                 IEnumerator IEnumerable.GetEnumerator () {
4334                         ...
4335                 }
4336                 
4337                 public struct MyEnumerator : IEnumerator {
4338                         ...
4339                 }
4340         }
4341
4342         Before, there were a few things we did wrong:
4343         1) we would emit callvirt on a struct, which is illegal
4344         2) we emited ldarg when we needed to emit ldarga
4345         3) we would mistakenly call the interface methods on an enumerator
4346         type that derived from IEnumerator and was in another assembly. For example:
4347
4348         public class MyEnumerator : IEnumerator
4349
4350         Would have the interface methods called, even if there were public impls of the
4351         method. In a struct, this lead to invalid IL code.
4352
4353 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4354
4355         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4356           renamed to Emit.
4357
4358         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4359
4360 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4361
4362         * cs-parser.jay: Fix small regression: we were not testing V2
4363         compiler features correctly.
4364
4365         * interface.cs: If the emit context is null, then create one
4366
4367 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4368
4369         * decl.cs (GetSignatureForError): New virtual method to get full name
4370           for error messages.
4371
4372         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4373           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4374
4375         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4376           Duplicated members and code in these classes has been removed.
4377           Better encapsulation in these classes.
4378
4379 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4380
4381         * assign.cs (Assign.DoResolve): When dealing with compound
4382         assignments, there is a new rule in ECMA C# 2.4 (might have been
4383         there before, but it is documented here) that states that in:
4384
4385         a op= b;
4386
4387         If b is of type int, and the `op' is a shift-operator, then the
4388         above is evaluated as:
4389
4390         a = (int) a op b 
4391
4392         * expression.cs (Binary.ResolveOperator): Instead of testing for
4393         int/uint/long/ulong, try to implicitly convert to any of those
4394         types and use that in pointer arithmetic.
4395
4396         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4397         method to print information for from the type, not from the
4398         null-method we were given.
4399
4400 2004-02-01  Duncan Mak  <duncan@ximian.com>
4401
4402         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4403         parsing for cmd, fixes bug #53694.
4404
4405 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4406
4407         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4408         in the member name duplication tests. Property and operator name duplication
4409         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4410
4411 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4412
4413         * interface.cs (PopulateMethod): Fixed crash when interface method
4414         returns not existing type (error test cs0246-3.cs).
4415
4416 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4417
4418         * cs-parser.jay (interface_accessors): Re-write actions to also
4419         store attributes attached to get and set methods. Fix spelling
4420         while at it.
4421
4422         (inteface_property_declaration): Modify accordingly.
4423
4424         (InterfaceAccessorInfo): New helper class to store information to pass
4425         around between rules that use interface_accessors.
4426
4427         * interface.cs (Emit): Apply attributes on the get and set
4428         accessors of properties and indexers too.
4429
4430         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4431         right MethodBuilder when applying attributes to the get and set accessors.
4432
4433 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4434
4435         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4436
4437 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4438
4439         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4440
4441 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4442
4443         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4444         changes that treat `yield' specially when present before `break'
4445         or `return' tokens.
4446
4447         * cs-tokenizer.cs: yield is no longer a keyword.
4448
4449 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4450
4451         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4452         setting for default constructors.
4453         For default constructors are almost every time set wrong Modifier. The
4454         generated IL code has been alright. But inside mcs this values was
4455         wrong and this was reason why several of my CLS Compliance tests
4456         failed.
4457
4458 2004-01-22  Martin Baulig  <martin@ximian.com>
4459
4460         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4461         not a QualifiedIdentifier.  This is what `type_name_expression'
4462         was previously doing.
4463         (type_name_expression): Removed; the code is now in
4464         `namespace_or_type_name'.
4465         (qualified_identifier): Removed, use `namespace_or_type_name'
4466         instead.
4467         (QualifiedIdentifier): Removed this class.      
4468
4469 2004-01-22  Martin Baulig  <martin@ximian.com>
4470
4471         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4472         not a string as alias name.
4473
4474 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4475
4476         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4477         #52730 bug, and instead compute correctly the need to use a
4478         temporary variable when requesting an address based on the
4479         static/instace modified of the field and the constructor.
4480  
4481 2004-01-21  Martin Baulig  <martin@ximian.com>
4482
4483         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4484         class and namespace before looking up aliases.  Fixes #52517.
4485
4486 2004-01-21  Martin Baulig  <martin@ximian.com>
4487
4488         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4489         assinged in a 'try'; fixes exception4.cs.
4490
4491 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4492         * class.cs : Implemented parameter-less constructor for TypeContainer
4493
4494         * decl.cs: Attributes are now stored here. New property OptAttributes
4495
4496         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4497
4498         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4499
4500 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4501
4502         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4503           (CSharpSignature): New method for indexer and property signature.
4504
4505 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4506
4507         * pending.cs (IsVirtualFilter): Faster implementation.
4508
4509 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4510
4511         * typemanager.cs: Avoid inclusion of same assembly more than once.
4512
4513 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4514
4515         * cs-parser.jay: Fixed problem where the last assembly attribute
4516           has been applied also to following declaration (class, struct, etc.)
4517           
4518 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4519
4520         * class.cs: Added error CS0538, CS0539 reporting.
4521         Fixed crash on Microsoft runtime when field type is void.
4522
4523         * cs-parser.jay: Added error CS0537 reporting.
4524
4525         * pending.cs: Added error CS0535 reporting.
4526         Improved error report for errors CS0536, CS0534.
4527
4528 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4529
4530         Merge a few bits from the Anonymous Method MCS tree.
4531
4532         * statement.cs (ToplevelBlock): New class for toplevel methods,
4533         will hold anonymous methods, lifted variables.
4534
4535         * cs-parser.jay: Create toplevel blocks for delegates and for
4536         regular blocks of code. 
4537
4538 2004-01-20  Martin Baulig  <martin@ximian.com>
4539
4540         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4541         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4542         and `NeedExplicitReturn'; added `IsLastStatement'.
4543         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4544         have a `ReturnLabel' or we're not unreachable.
4545
4546         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4547         child's reachability; don't just override ours with it.  Fixes
4548         #58058 (lluis's example).
4549         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4550         InFinally(), InLoop(), InSwitch() and
4551         BreakCrossesTryCatchBoundary() methods.
4552
4553         * statement.cs (Return): Do all error checking in Resolve().
4554         Unless we are the last statement in a top-level block, always
4555         create a return label and jump to it.
4556         (Break, Continue): Do all error checking in Resolve(); also make
4557         sure we aren't leaving a `finally'.
4558         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4559         statement in a top-level block.
4560         (Block.Flags): Added `IsDestructor'.
4561         (Block.IsDestructor): New public property.
4562
4563 2004-01-20  Martin Baulig  <martin@ximian.com>
4564
4565         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4566
4567 2004-01-20  Martin Baulig  <martin@ximian.com>
4568
4569         * statement.cs (Statement.ResolveUnreachable): New public method.
4570         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4571         (Block.Resolve): Resolve unreachable statements.
4572
4573 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4574
4575         * expression.cs: We need to fix the case where we do
4576         not have a temp variable here.
4577
4578         * assign.cs: Only expression compound assignments need
4579         temporary variables.
4580
4581 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4582
4583         * flowanalysis.cs: Reduce memory allocation in a few ways:
4584           - A block with no variables should not allocate a bit
4585             vector for itself.
4586           - A method with no out parameters does not need any tracking
4587             for assignment of the parameters, so we need not allocate
4588             any data for it.
4589           - The arrays:
4590                 public readonly Type[] VariableTypes;
4591                 public readonly string[] VariableNames;
4592             Are redundant. The data is already stored in the variable
4593             map, so we need not allocate another array for it.
4594           - We need to add alot of checks for if (params | locals) == null
4595             due to the first two changes.
4596
4597 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4598
4599         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4600         implement IMemoryLocation, we store a copy on a local variable and
4601         take the address of it.  Patch from Benjamin Jemlich
4602
4603         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4604         to use a special "type_name_expression" rule which reduces the
4605         number of "QualifiedIdentifier" classes created, and instead
4606         directly creates MemberAccess expressions.
4607
4608 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4609
4610         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4611         that fixes #52853.  Null literal assignment to ValueType
4612
4613         * class.cs (MethodData.Emit): Instead of checking the name of the
4614         method to determine if its a destructor, create a new derived
4615         class from Method called Destructor, and test for that.  
4616
4617         * cs-parser.jay: Create a Destructor object instead of a Method.  
4618
4619         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4620
4621         Fixes: 52933
4622
4623 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4624
4625         * expression.cs (Binary.ResolveOperator): Perform an implicit
4626         conversion from MethodGroups to their delegate types on the
4627         Addition operation.
4628
4629         * delegate.cs: Introduce a new class DelegateCreation that is the
4630         base class for `NewDelegate' and `ImplicitDelegateCreation',
4631         factor some code in here.
4632
4633         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4634         conversion from MethodGroups to compatible delegate types. 
4635
4636         * ecore.cs (Expression.Resolve): Do not flag error 654
4637         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4638         we allow conversions from MethodGroups to delegate types now.
4639
4640         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4641         assignments in v2 either.
4642
4643 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4644
4645         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4646         static read-only fields in ctors.
4647
4648         Applied patch from Benjamin Jemlich 
4649
4650         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4651
4652 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4653
4654         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4655         here to return true, as they can be used like this:
4656
4657                 (XXX) int.MEMBER ()
4658
4659         Fixed 49836 and all the other dups
4660
4661 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4662
4663         * driver.cs: Implement /win32res and /win32icon.
4664
4665 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4666
4667         * cs-parser.jay: Add a rule to improve error handling for the
4668         common mistake of placing modifiers after the type.
4669
4670 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4671
4672         * cs-parser.jay (interface_event_declaration): Catch
4673         initialization of events on interfaces, and report cs0068
4674
4675         * cs-parser.jay (interface_event_declaration): Catch
4676         initialization of events. 
4677
4678         * ecore.cs: Better report missing constructors.
4679
4680         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4681         the error reporting done in the wrong place.  Fix.
4682
4683         * expression.cs (Binary.ResolveOperator): Catch the 
4684         operator + (E x, E y) error earlier, and later allow for implicit
4685         conversions in operator +/- (E e, U x) from U to the underlying
4686         type of E.
4687
4688         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4689         52596, if the container class is abstract, the default constructor
4690         is protected otherwise its public (before, we were always public).
4691
4692         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4693         fixed statement.
4694
4695         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4696         Jemlich that fixes bug #52597, MCS was generating invalid code for
4697         idisposable structs.   Thanks to Ben for following up with this
4698         bug as well.
4699
4700 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4701
4702         * driver.cs: Allow assemblies without code to be generated, fixes
4703         52230.
4704
4705 2004-01-07  Nick Drochak <ndrochak@gol.com>
4706
4707         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4708
4709 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4710
4711         * cs-parser.jay: Add rules to improve error reporting if fields or
4712         methods are declared at the namespace level (error 116)
4713
4714         * Add rules to catch event add/remove
4715
4716 2004-01-04  David Sheldon <dave-mono@earth.li>
4717
4718   * expression.cs: Added matching ")" to error message for 
4719   CS0077
4720
4721 2004-01-03 Todd Berman <tberman@gentoo.org>
4722
4723         * ecore.cs, attribute.cs:
4724         Applying fix from #52429.
4725
4726 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4727
4728         * ecore.cs, expression.cs, statement.cs:
4729         Total rewrite of how we handle branching. We
4730         now handle complex boolean expressions with fewer
4731         jumps. As well if (x == 0) no longer emits a ceq.
4732
4733         if (x is Foo) is much faster now, because we generate
4734         better code.
4735
4736         Overall, we get a pretty big improvement on our benchmark
4737         tests. The code we generate is smaller and more readable.
4738
4739         I did a full two-stage bootstrap. The patch was reviewed
4740         by Martin and Miguel.
4741
4742 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4743
4744         * cs-parser.jay: Make primary_expression not take a QI.
4745         we dont need this because the member_access rule covers
4746         us here. So we replace the rule with just IDENTIFIER.
4747
4748         This has two good effects. First, we remove a s/r conflict.
4749         Second, we allocate many fewer QualifiedIdentifier objects.
4750
4751 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4752
4753         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4754         set the correct information via SRE. This prevents
4755         hanging on the MS runtime. Fixes #29374.
4756
4757 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4758
4759         * convert.cs: correctly handle conversions to value types
4760         from Enum and ValueType as unboxing conversions.
4761
4762         Fixes bug #52569. Patch by Benjamin Jemlich.
4763
4764 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4765
4766         * expression.cs (BetterConversion): Prefer int -> uint
4767         over int -> ulong (csc's behaviour). This fixed bug #52046.
4768
4769 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4770
4771         * decl.cs (MemberCache.FindMembers): now returns a
4772         MemberInfo [].
4773
4774         * typemanager.cs: In general, go with with ^^.
4775         (CopyNewMethods): take an IList.
4776         (RealMemberLookup): Only allocate an arraylist
4777         if we copy from two sets of methods.
4778
4779         This change basically does two things:
4780         1) Fewer array lists allocated due to CopyNewMethods.
4781         2) the explicit cast in MemberList costed ALOT.
4782
4783 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4784
4785         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4786         a hashtable to avoid needless string allocations when an identifier is
4787         used more than once (the common case).
4788
4789 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4790
4791         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4792         is broken, it will not return anything. So, we
4793         have to use the information we have in mcs to
4794         do the task.
4795
4796         * typemanager.cs: Add a cache for GetInterfaces,
4797         since this will now be used more often (due to ^^)
4798
4799         (GetExplicitInterfaces) New method that gets the
4800         declared, not effective, interfaces on a type
4801         builder (eg, if you have interface IFoo, interface
4802         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4803         { IBar }.
4804
4805         This patch makes MCS able to bootstrap itself on
4806         Windows again.
4807
4808 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4809
4810         * expression.cs: Remove the Nop's that Miguel put
4811         in by mistake.
4812
4813 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4814
4815         * report.cs, codegen.cs: Give the real stack trace to
4816         the error when an exception is thrown.
4817
4818 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4819
4820         * decl.cs: only allocate hashtables for ifaces if 
4821         it is an iface!
4822
4823 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4824
4825         * expression.cs: fix the error from cs0121-2.cs
4826         (a parent interface has two child interfaces that
4827         have a function with the same name and 0 params
4828         and the function is called through the parent).
4829
4830 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4831
4832         * class.cs, rootcontext.cs, typmanager.cs: do not
4833         leak pointers.
4834
4835 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4836
4837         * codegen.cs: remove stack for the ec flow branching.
4838         It is already a linked list, so no need.
4839
4840 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4841
4842         * Makefile: Allow custom profiler here.
4843
4844 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4845
4846         * typemanager.cs (LookupType):
4847           - Use a static char [], because split takes
4848             a param array for args, so it was allocating
4849             every time.
4850           - Do not store true in a hashtable, it boxes.
4851
4852 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4853
4854         * flowanalysis.cs: bytify common enums.
4855
4856 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4857
4858         * modifiers.cs: Add a new set of flags for the
4859         flags allowed on explicit interface impls.
4860         * cs-parser.jay: catch the use of modifiers in
4861         interfaces correctly.
4862         * class.cs: catch private void IFoo.Blah ().
4863
4864         All related to bug #50572.
4865
4866 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4867
4868         * decl.cs: Rewrite the consistant accessability checking.
4869         Accessability is not linear, it must be implemented in
4870         a tableish way. Fixes #49704.
4871
4872 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4873
4874         * expression.cs: Handle negation in a checked context.
4875         We must use subtraction from zero. Fixes #38674.
4876
4877 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4878
4879         * class.cs: Ignore static void main in DLLs.
4880         * rootcontext.cs: Handle the target type here,
4881         since we are have to access it from class.cs
4882         * driver.cs: account for the above.
4883
4884 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4885
4886         * report.cs: Give line numbers and files if available.
4887
4888 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4889
4890         * driver.cs: Implement /addmodule.
4891
4892         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4893         ModuleBuilders.
4894
4895 2003-12-20  Martin Baulig  <martin@ximian.com>
4896
4897         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4898         (FieldBase.IsAssigned): Removed this field.
4899         (FieldBase.SetAssigned): New public method.
4900         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4901
4902 2003-12-20  Martin Baulig  <martin@ximian.com>
4903
4904         * expression.cs (LocalVariableReference.DoResolve): Don't set
4905         `vi.Used' if we're called from DoResolveLValue().
4906
4907         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4908         returns the usage vector it just merged into the current one -
4909         pass this one to UsageWarning().
4910         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4911         of the `EmitContext', don't call this recursively on our children.
4912
4913 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4914
4915         * driver.cs: Implement /target:module.
4916
4917 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4918
4919         * support.cs (CharArrayHashtable): New helper class.
4920
4921         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4922         char arrays, not strings, so we can avoid creating a string in
4923         consume_identifier if the identifier is a keyword.
4924
4925 2003-12-16  Martin Baulig  <martin@ximian.com>
4926
4927         * statement.cs (LocalInfo.Assigned): Removed this property.
4928         (LocalInfo.Flags): Removed `Assigned'.
4929         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4930         and uses flow analysis.
4931         (Block.UsageWarning): Made this method private.
4932         (Block.Resolve): Call UsageWarning() if appropriate.
4933
4934         * expression.cs (LocalVariableReference.DoResolve): Always set
4935         LocalInfo.Used here.
4936
4937 2003-12-13  Martin Baulig  <martin@ximian.com>
4938
4939         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4940         any value here; we're now using flow analysis to figure out
4941         whether a statement/block returns a value.
4942
4943 2003-12-13  Martin Baulig  <martin@ximian.com>
4944
4945         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4946         working again.
4947         (FlowBranching.MergeFinally): Don't call
4948         `branching.CheckOutParameters()' here, this is called in
4949         MergeTopBlock().
4950         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4951         when adding the `finally' vector.       
4952
4953 2003-12-13  Martin Baulig  <martin@ximian.com>
4954
4955         * flowanalysis.cs
4956         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4957         actually work and also fix #48962.
4958
4959 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4960
4961         * decl.cs: Do not check System.Object for nested types,
4962         since we know it does not have any. Big bang for buck:
4963
4964         BEFORE:
4965            Run 1:   8.35 seconds
4966            Run 2:   8.32 seconds
4967            corlib:  17.99 seconds
4968         AFTER:
4969            Run 1:   8.17 seconds
4970            Run 2:   8.17 seconds
4971            corlib:  17.39 seconds
4972
4973 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4974
4975         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4976         time we are returning 0 members, so we save alot here.
4977
4978 2003-12-11  Martin Baulig  <martin@ximian.com>
4979
4980         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4981         `MergeChild()', also just take the `FlowBranching' as argument;
4982         call Merge() on it and return the result.
4983         (FlowBranching.Merge): We don't need to do anything if we just
4984         have one sibling.
4985
4986 2003-12-11  Martin Baulig  <martin@ximian.com>
4987
4988         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4989         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4990         Maurer for this idea.
4991
4992 2003-12-11  Martin Baulig  <martin@ximian.com>
4993
4994         * flowanalysis.cs (MergeResult): This class is now gone; we now
4995         use the `UsageVector' for this.  The reason for this is that if a
4996         branching just has one sibling, we don't need to "merge" them at
4997         all - that's the next step to do.
4998         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4999         `MergeResult'.
5000
5001 2003-12-11  Martin Baulig  <martin@ximian.com>
5002
5003         Reworked flow analyis and made it more precise and bug-free.  The
5004         most important change is that we're now using a special `Reachability'
5005         class instead of having "magic" meanings of `FlowReturns'.  I'll
5006         do some more cleanups and optimizations and also add some more
5007         documentation this week.
5008
5009         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5010         largely reworked this class.
5011         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5012         the new `Reachability' class instead of having "magic" values here.
5013         (FlowBranching): We're now using an instance of `Reachability'
5014         instead of having separate `Returns', `Breaks' etc. fields.
5015
5016         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5017         based on flow analysis; ignore the return value of block.Emit ().
5018
5019 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5020
5021         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5022         if they are private.
5023
5024 2003-12-09  Martin Baulig  <martin@ximian.com>
5025
5026         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5027         call them directly on the UsageVector.
5028
5029 2003-12-09  Martin Baulig  <martin@ximian.com>
5030
5031         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5032         Changed return type from `FlowReturns' to `Reachability'.
5033
5034 2003-12-09  Martin Baulig  <martin@ximian.com>
5035
5036         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5037         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5038         `Reachable' fields with a single `Reachability' one.
5039
5040 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5041
5042         * class.cs (FindMembers): Remove foreach's.
5043
5044         Bootstrap times:
5045
5046         BEFORE
5047                 Run 1:   8.74 seconds
5048                 Run 2:   8.71 seconds
5049
5050         AFTER
5051                 Run 1:   8.64 seconds
5052                 Run 2:   8.58 seconds
5053
5054
5055 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5056
5057         * cs-parser.jay:
5058         * gen-treedump.cs:
5059         * statement.cs:
5060         This patch does a few things:
5061                 1. EmptyStatement is now a singleton, so it is never reallocated.
5062                 2. All blah is EmptyStatement constructs have been changed to
5063                    blah == EmptyStatement.Value, which is much faster and valid
5064                    now that EmptyStatement is a singleton.
5065                 3. When resolving a block, rather than allocating a new array for
5066                    the non-empty statements, empty statements are replaced with
5067                    EmptyStatement.Value
5068                 4. Some recursive functions have been made non-recursive.
5069         Mainly the performance impact is from (3), however (1) and (2) are needed for
5070         this to work. (4) does not make a big difference in normal situations, however
5071         it makes the profile look saner.
5072
5073         Bootstrap times:
5074
5075         BEFORE
5076         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5077         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5078         Total memory allocated: 56397 KB
5079
5080         AFTER
5081         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5082         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5083         Total memory allocated: 55666 KB
5084
5085 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5086
5087         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5088         than the hashtable in a hashtable version
5089
5090         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5091         we always end up concating a string. This results in a huge perf
5092         loss, because many strings have to be tracked by the GC. In this
5093         patch, we first use a hashtable that works with two keys, so that
5094         the strings do not need to be concat'ed.
5095
5096         Bootstrap times:
5097         BEFORE
5098                 Run 1:   8.74 seconds
5099                 Run 2:   8.71 seconds
5100
5101         AFTER
5102                 Run 1:   8.65 seconds
5103                 Run 2:   8.56 seconds
5104
5105 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5106
5107         * Makefile: Add a new target `do-time' that does a quick and simple
5108         profile, leaving easy to parse output.
5109
5110 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5111
5112         * codegen.cs (Init): Create the dynamic assembly with 
5113         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5114
5115 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5116
5117         * support.cs: Make the PtrHashtable use only one
5118         instance of its comparer.
5119
5120 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5121
5122         * typemanager.cs: Fix lookup of GetNamespaces.
5123
5124 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5125
5126         * expression.cs: Removed redundant line.
5127
5128         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5129         ArrayLists, use for loops with bounds.  
5130
5131         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5132         arraylist.
5133
5134         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5135         arraylists, use for loop with bounds.
5136
5137         The above three changes give us a 0.071 second performance
5138         improvement out of 3.294 seconds down to 3.223.  On my machine
5139         the above changes reduced the memory usage by 1,387 KB during
5140         compiler bootstrap.
5141
5142         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5143         QualifiedIdentifiers.  Before we created a new string through
5144         concatenation, and mostly later on, the result would be
5145         manipulated by DecomposeQI through string manipulation.
5146
5147         This reduced the compiler memory usage for bootstrapping from
5148         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5149         compile times in 0.05 seconds.
5150
5151 2003-11-28  Dick Porter  <dick@ximian.com>
5152
5153         * support.cs: Do string compares with the Invariant culture.
5154
5155         * rootcontext.cs: 
5156         * gen-treedump.cs: 
5157         * expression.cs: 
5158         * driver.cs: 
5159         * decl.cs: 
5160         * codegen.cs: 
5161         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5162         the comparison is done with the Invariant culture.
5163
5164 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5165
5166         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5167         GetEnumerator method.
5168
5169         (ProbeCollectionType): Iterate starting at the most specific type
5170         upwards looking for a GetEnumerator
5171
5172         * expression.cs: Shift count can be up to 31 for int/uint and 63
5173         for long/ulong.
5174
5175 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5176
5177         * statement.cs (Block.LookupLabel): Also look for the label on the
5178         children blocks.  Use a hash table to keep track of visited
5179         nodes. 
5180
5181         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5182         we actually did transform the other operand, otherwise fall back
5183         to the common codepath that casts to long.
5184
5185         * cs-tokenizer.cs: Use the same code pattern as the int case.
5186         Maybe I should do the parsing myself, and avoid depending on the
5187         Parse routines to get this done.
5188
5189 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5190
5191         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5192         which fixes bug 51347.  This time test it.
5193
5194         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5195         attributes for example can not tell the difference between these.
5196         The difference was only a syntax feature of the language. 
5197
5198         * attribute.cs: Apply attributes to delegates.
5199
5200         * delegate.cs: Call the apply attributes method.
5201
5202 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5203
5204         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5205         comparing 0 vs Byte.MinValue, not the value
5206
5207         (ImplicitConversionRequired): When reporting a conversion error,
5208         use error 31 to print out the constant error instead of the
5209         simpler 29.
5210
5211         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5212         which fixes bug 51347.
5213
5214 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5215
5216         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5217         which fixes the -warnaserror command line option.
5218
5219 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5220
5221         * cfold.cs (DoNumericPromotions): During constant folding of
5222         additions on UIntConstant, special case intconstants with
5223         IntConstants like we do on the expression binary operator. 
5224
5225 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5226
5227         * convert.cs (ImplicitReferenceConversion): We were missing a case
5228         (System.Enum are not value types or class types, so we need to
5229         classify them separatedly).
5230
5231         * driver.cs: We do not support error 2007.
5232
5233 2003-11-12 Jackson Harper <jackson@ximian.com>
5234
5235         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5236         system directory. Also use the full file name so users can
5237         libraries names mscorlib-o-tron.dll in a non system dir.
5238
5239 2003-11-10  Martin Baulig  <martin@ximian.com>
5240
5241         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5242         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5243         calling `ResolveType()' on them, directly assign their `Type'.
5244
5245 2003-11-08  Martin Baulig  <martin@ximian.com>
5246
5247         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5248         return value and the `out parent' parameter.
5249         (TypeContainer.DefineType): Moved the CS0644 check into
5250         GetClassBases().  Don't pass the interface types to the
5251         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5252         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5253
5254         * ecore.cs (TypeExpr.IsAttribute): New property.
5255         (TypeExpr.GetInterfaces): New method.
5256
5257         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5258         TypeExpr instead of a Type.
5259         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5260         (Interface.DefineType): Don't pass the interface types to the
5261         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5262         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5263
5264         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5265         instead of a `Type[]'.
5266         (TypeManager.RegisterBuilder): Likewise.
5267         (TypeManager.AddUserInterface): Likewise.
5268         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5269         `Type[]' and also return a `TypeExpr[]'.
5270         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5271
5272 2003-11-08  Martin Baulig  <martin@ximian.com>
5273
5274         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5275         Expression.     
5276
5277 2003-11-08  Martin Baulig  <martin@ximian.com>
5278
5279         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5280         TypeManager.ResolveExpressionTypes().
5281
5282         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5283         instead of an Expression.
5284         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5285         (TypeExpression): New public class; formerly known as `TypeExpr'.
5286
5287         * expression.cs (ComposedCast): Derive from TypeExpr.
5288
5289         * typemanager.cs (TypeManager.system_*_expr): These are now
5290         TypExpr's instead of Expression's.
5291         (TypeManager.ResolveExpressionTypes): New public static function;
5292         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5293         of them.        
5294
5295 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5296
5297         * expression.cs (New.DoResolve): Do not dereference value that
5298         might be a null return.
5299
5300         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5301         sure that the constant value has the right type.  Fixes an
5302         unreported bug, similar to 50425.
5303
5304         * const.cs (Const.LookupConstantValue): Call
5305         ImplicitStandardConversionExists before doing a conversion to
5306         avoid havng the TypeManager.ChangeType do conversions.
5307
5308         Reduced the number of casts used
5309
5310         (Const.ChangeType): New routine to enable reuse of the constant
5311         type changing code from statement.
5312
5313         * typemanager.cs (ChangeType): Move common initialization to
5314         static global variables.
5315
5316         Fixes #50425.
5317
5318         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5319         every value type to go through, even if it was void.  Fix that. 
5320
5321         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5322         character of the define, and the is_identifier_part_character for
5323         the rest of the string.
5324
5325 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5326
5327         * expression.cs (UnaryMutator.EmitCode): When I updated
5328         LocalVariableReference.DoResolve, I overdid it, and dropped an
5329         optimization done on local variable references.
5330
5331 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5332
5333         * ecore.cs: Convert the return from Ldlen into an int.
5334
5335 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5336
5337         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5338         the accessibility, this is a special case for toplevel non-public
5339         classes (internal for instance).
5340
5341 2003-10-20  Nick Drochak <ndrochak@gol.com>
5342
5343         * ecore.cs: Fix typo and build.  Needed another right paren.
5344
5345 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5346
5347         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5348         `internal' case regular and protected, but not allowing protected
5349         to be evaluated later.  Bug 49840
5350
5351 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5352
5353         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5354         to kb.Nlast, and not the kb.nFirst to isolate the switch
5355         statement.
5356
5357         Extract the underlying type, so enumerations of long/ulong are
5358         treated like long/ulong.
5359
5360 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5361
5362         * expression.cs (New): Overload the meaning of RequestedType to
5363         track the possible creation of the NewDelegate type, since
5364         DoResolve is invoked more than once for new constructors on field
5365         initialization.
5366
5367         See bugs: #48800 and #37014
5368
5369         * cs-parser.jay (declare_local_constants): Take an arraylist
5370         instead of a single constant.
5371
5372         (local_constant_declaration): It should take a
5373         constant_declarators, not a constant_declarator.  Fixes 49487
5374
5375         * convert.cs: Fix error report.
5376
5377 2003-10-13 Jackson Harper <jackson@ximian.com>
5378
5379         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5380         bug #49611
5381
5382 2003-10-09  Martin Baulig  <martin@ximian.com>
5383
5384         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5385         to the .ctor.
5386         (MethodCore.DoDefineParameters): Removed the TypeContainer
5387         argument; use the DeclSpace which was passed to the .ctor instead.
5388         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5389         TypeContainer; we only need a DeclSpace here.
5390
5391 2003-10-09  Martin Baulig  <martin@ximian.com>
5392
5393         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5394         to the .ctor.
5395         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5396         EmitContext's .ctor.    
5397
5398 2003-10-09  Martin Baulig  <martin@ximian.com>
5399
5400         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5401         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5402         AsAccessible(), moved them as well.
5403
5404         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5405
5406 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5407
5408         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5409
5410 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5411
5412         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5413         generation for >=, as spotted by Paolo, bug 48679.  
5414         Patch from David Waite.
5415
5416         * cs-tokenizer.cs: Add handling for #pragma.
5417
5418         * cs-parser.jay: Allow for both yield and yield return in the
5419         syntax.  The anti-cobolization of C# fight will go on!
5420
5421         * class.cs (TypeBuilder.DefineType): Catch error condition here
5422         (Parent.DefineType erroring out and returning null).
5423
5424         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5425         coping with enumerations variables, we were mistakenly processing
5426         them as a regular value type instead of built-in types.  Fixes the
5427         bug #48063
5428
5429         * typemanager.cs (IsBuiltinOrEnum): New method.
5430
5431 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5432
5433         * cs-parser.jay: Upgrade: yield now needs the return clause.
5434
5435 2003-09-19  Martin Baulig  <martin@ximian.com>
5436
5437         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5438         `MemberCache parent' argument.  Normally, an interface doesn't
5439         have a parent type except System.Object, but we use this in gmcs
5440         for generic type parameters.
5441
5442 2003-09-18  Martin Baulig  <martin@ximian.com>
5443
5444         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5445         on `type.IsInterface'; don't check whether the type has a parent
5446         to determine whether it's an interface.
5447
5448 2003-09-15  Martin Baulig  <martin@ximian.com>
5449
5450         * class.cs (TypeContainer.DefineType): Added an error flag to
5451         avoid reporting duplicate CS0146's ("class definition is
5452         circular.").
5453
5454         * driver.cs (Driver.MainDriver): Abort if
5455         RootContext.ResolveTree() reported any errors.
5456
5457 2003-09-07  Martin Baulig  <martin@ximian.com>
5458
5459         * report.cs (Error, Warning): Added overloaded versions which take
5460         a `params object[] args' and call String.Format().
5461
5462 2003-09-07  Martin Baulig  <martin@ximian.com>
5463
5464         * decl.cs (DeclSpace..ctor): Don't call
5465         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5466         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5467         (DeclSpace.RecordDecl): New method.
5468
5469         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5470
5471 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5472
5473         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5474         value attributes to be applied to ParameterBuilders.
5475
5476         * class.cs (MethodCore.LabelParameters): Make static and more
5477         generic so that it can be used from other places - like interface
5478         methods, for instance.
5479
5480         * interface.cs (Interface.Emit): Call LabelParameters before
5481         emitting attributes on the InterfaceMethod.
5482
5483 2003-08-26  Martin Baulig  <martin@ximian.com>
5484
5485         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5486         resolving aliases; fixes #47927.
5487
5488 2003-08-26  Martin Baulig  <martin@ximian.com>
5489
5490         * statement.cs (Using.DoResolve): This is internally emitting a
5491         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5492         do not always return.  Fixes #47681.
5493
5494 2003-08-26  Martin Baulig  <martin@ximian.com>
5495
5496         * decl.cs (MemberCore): Moved WarningNotHiding(),
5497         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5498         into MemberBase.
5499         (AdditionResult): Make this nested in DeclSpace.
5500         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5501         argument; call NamespaceEntry.Define() unless we're nested in a
5502         class or struct.
5503
5504         * namespace.cs (Namespace.DefineName): New public function.  This
5505         is called from DeclSpace's .ctor to add 
5506         (Namespace.Lookup): Include DeclSpaces in the lookup.
5507
5508         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5509
5510         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5511
5512 2003-08-25  Martin Baulig  <martin@ximian.com>
5513
5514         * convert.cs (Convert.ExplicitReferenceConversion): When
5515         converting from an interface type to a class, unbox if the target
5516         type is a struct type.  Fixes #47822.
5517
5518 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5519
5520         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5521         #47854.
5522
5523 2003-08-22  Martin Baulig  <martin@ximian.com>
5524
5525         * class.cs (TypeManager.DefineType): When defining a nested type,
5526         call DefineType() on our parent; fixes #47801.
5527
5528 2003-08-22  Martin Baulig  <martin@ximian.com>
5529
5530         * class.cs (MethodData.Define): While checking if a method is an
5531         interface implementation, improve the test a bit more to fix #47654.
5532
5533 2003-08-22  Martin Baulig  <martin@ximian.com>
5534
5535         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5536         correctly; fixes #47722.
5537
5538 2003-08-22  Martin Baulig  <martin@ximian.com>
5539
5540         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5541         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5542
5543         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5544
5545 2003-08-22  Martin Baulig  <martin@ximian.com>
5546
5547         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5548         can only be assigned in static constructors.  Fixes #47161.
5549
5550 2003-08-22  Martin Baulig  <martin@ximian.com>
5551
5552         Rewrote and improved the flow analysis code.
5553
5554         * flowbranching.cs (FlowBranching): Make this class abstract.
5555         (FlowBranching.CreateBranching): New static function to create a
5556         new flow branching.
5557         (FlowBranchingBlock, FlowBranchingException): New classes.
5558         (FlowBranching.UsageVector.Type): New public readonly field.
5559         (FlowBranching.UsageVector.Breaks): Removed the setter.
5560         (FlowBranching.UsageVector.Returns): Removed the setter.
5561         (FlowBranching.UsageVector): Added Break(), Return(),
5562         NeverReachable() and Throw() methods to modify the reachability.
5563         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5564         done by FlowBranching.Merge().
5565         (FlowBranching.UsageVector.MergeChild): New method; merges the
5566         merge result into the current vector.
5567         (FlowBranching.Merge): New abstract method to merge a branching.
5568
5569 2003-08-12  Martin Baulig  <martin@ximian.com>
5570
5571         * expression.cs (Indirection.CacheTemporaries): Create the
5572         LocalTemporary with the pointer type, not its element type.
5573
5574 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5575
5576         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5577         token was a keyword or not.
5578
5579         Add `error' options where an IDENTIFIER was expected;  Provide
5580         CheckToken and CheckIdentifierToken convenience error reporting
5581         functions. 
5582
5583         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5584
5585         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5586         NameSpaceEntry NameSpaceEntry.
5587
5588         (LookupInterfaceOrClass): Avoid creating a full qualified name
5589         from namespace and name: avoid doing lookups when we know the
5590         namespace is non-existant.   Use new Tree.LookupByNamespace which
5591         looks up DeclSpaces based on their namespace, name pair.
5592
5593         * driver.cs: Provide a new `parser verbose' to display the
5594         exception thrown during parsing.  This is turned off by default
5595         now, so the output of a failure from mcs is more graceful.
5596
5597         * namespace.cs: Track all the namespaces defined in a hashtable
5598         for quick lookup.
5599
5600         (IsNamespace): New method
5601
5602 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5603
5604         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5605         we know that we need to concatenate (full typename can never be
5606         null). 
5607
5608         * class.cs: ditto.
5609
5610         * statement.cs: Use a bitfield;  Do not initialize to null things
5611         which are done by the constructor by default.
5612
5613         * cs-parser.jay: bug fix, parameter was 4, not 3.
5614
5615         * expression.cs: Just use the property;
5616
5617         * statement.cs: No need for GetVariableInfo method.
5618
5619 2003-08-08  Martin Baulig  <martin@ximian.com>
5620
5621         * flowanalysis.cs (FlowReturns): This is now nested in the
5622         `FlowBranching' class.
5623         (MyBitVector): Moved this here from statement.cs.
5624         (FlowBranching.SiblingType): New enum type.
5625         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5626
5627 2003-08-07  Martin Baulig  <martin@ximian.com>
5628
5629         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5630         `FlowBranching' class and called `BranchingType'.
5631
5632 2003-08-07  Martin Baulig  <martin@ximian.com>
5633
5634         * flowanalysis.cs: Moved all the control flow analysis code into
5635         its own file.
5636
5637 2003-08-07  Martin Baulig  <martin@ximian.com>
5638
5639         * assign.cs (Assign.DoResolve): `target' must either be an
5640         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5641         #37319.
5642
5643 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5644
5645         * expression.cs (BinaryMethod): This kind of expression is created by the
5646         Binary class if it determines that the operator has to be handled
5647         by a method.
5648
5649         (BinaryDelegate): This kind of expression is created if we are
5650         dealing with a + or - operator on delegates.
5651
5652         (Binary): remove method, argumetns, and DelegateOperator: when
5653         dealing with methods, 
5654
5655         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5656
5657         * statement.cs (Block): use bitfields for the three extra booleans
5658         we had in use.   Remove unused topblock parameter.
5659
5660         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5661
5662         * assign.cs: Drop extra unneeded tests.
5663
5664 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5665
5666         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5667
5668         * statement.cs (Foreach): Use VariableStorage instead of
5669         LocalBuilders.   
5670
5671         * codegen.cs (VariableStorage): New class used by clients that
5672         require a variable stored: locals or fields for variables that
5673         need to live across yield.
5674
5675         Maybe provide a convenience api for EmitThis+EmitLoad?
5676
5677         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5678         these bad boys.
5679
5680 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5681
5682         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5683         RemapParameterLValue): New methods that are used to turn a
5684         precomputed FieldInfo into an expression like this:
5685
5686                 instance.FieldInfo
5687
5688         The idea is to use this instead of making LocalVariableReference
5689         have more than one meaning.
5690
5691         * cs-parser.jay: Add error production to BASE.
5692
5693         * ecore.cs: Deal with TypeManager.GetField returning null, which
5694         is now a valid return value.
5695
5696         (FieldExprNoAddress): New expression for Fields whose address can
5697         not be taken.
5698
5699         * expression.cs (LocalVariableReference): During the resolve
5700         phases, create new expressions if we are in a remapping context.
5701         Remove code that dealt with remapping here.
5702
5703         (ParameterReference): same.
5704
5705         (ProxyInstance): New expression, like the `This' expression, but
5706         it is born fully resolved.  We know what we are doing, so remove
5707         the errors that are targeted to user-provided uses of `this'.
5708
5709         * statement.cs (Foreach): our variable is now stored as an
5710         Expression;  During resolution, follow the protocol, dont just
5711         assume it will return this.
5712
5713 2003-08-06  Martin Baulig  <martin@ximian.com>
5714
5715         * support.cs (SeekableStreamReader.cs): New public class.
5716
5717         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5718         SeekableStreamReader instead of the normal StreamReader.
5719
5720 2003-08-04  Martin Baulig  <martin@ximian.com>
5721
5722         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5723         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5724         deambiguate casts and delegate invocations.
5725         (parenthesized_expression): Use the new tokens to ensure this is
5726         not a cast of method invocation.
5727
5728         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5729         when reading a `)' and Deambiguate_CloseParens () was previously
5730         called.
5731
5732         * expression.cs (ParenthesizedExpression): New class.  This is
5733         just used for the CS0075 test.
5734         (Binary.DoResolve): Check for CS0075.   
5735
5736 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5737
5738         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5739         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5740         reference comparison.
5741
5742         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5743         examine the ReturnType for equality - this is necessary in the
5744         cases of implicit and explicit operators whose signature also
5745         includes the return type.
5746
5747 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5748
5749         * namespace.cs: Cache the result of the namespace computation,
5750         instead of computing it every time.
5751
5752 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5753
5754         * decl.cs: Use a global arraylist that we reuse over invocations
5755         to avoid excesive memory consumption.  Reduces memory usage on an
5756         mcs compile by one meg (45 average).
5757
5758         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5759         private, work around that.
5760
5761 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5762
5763         * literal.cs (IntLiteral): Define Zero and One static literals. 
5764
5765         * cs-parser.jay (integer_literal): use static literals to reduce
5766         memory usage for the most used literals (0, 1 and -1).  211kb
5767         reduced in memory usage.
5768
5769         Replace all calls to `new ArrayList' with `new
5770         ArrayList(4)' which is a good average number for most allocations,
5771         and also requires only 16 bytes of memory for its buffer by
5772         default. 
5773
5774         This reduced MCS memory usage in seven megabytes for the RSS after
5775         bootstrapping.
5776
5777 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5778
5779         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5780         handle params methods the correct way by forming only one
5781         applicable set with params and normal methods in them. Earlier we
5782         were looking at params methods only if we found no normal methods
5783         which was not the correct thing to do.
5784
5785         (Invocation.BetterFunction): Take separate arguments indicating
5786         when candidate and the best method are params methods in their
5787         expanded form.
5788
5789         This fixes bugs #43367 and #46199.
5790
5791         * attribute.cs: Documentation updates.
5792
5793         (CheckAttribute): Rename to CheckAttributeTarget.
5794         (GetValidPlaces): Rename to GetValidTargets.
5795
5796         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5797         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5798
5799         Fixes bug #44468.
5800
5801 2003-07-28  Martin Baulig  <martin@ximian.com>
5802
5803         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5804         name when looking up the base class of a nested class.  Fixes #46977.
5805
5806 2003-07-26  Martin Baulig  <martin@ximian.com>
5807
5808         * expression.cs (Indexers.Indexer): New nested struct; contains
5809         getter, setter and the indexer's type.
5810         (Indexers.Properties): This is now an ArrayList of
5811         Indexers.Indexer's.
5812         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5813         indexer doesn't have any getters.
5814
5815         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5816         for embedded property and indexer assignments.
5817
5818 2003-07-26  Martin Baulig  <martin@ximian.com>
5819
5820         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5821         preprocessor directive is not the first non-whitespace character
5822         on a line.
5823
5824 2003-07-26  Martin Baulig  <martin@ximian.com>
5825
5826         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5827         namespace parsing, follow the spec more closely.
5828
5829         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5830         NamespaceEntry.Lookup().
5831
5832 2003-07-25  Martin Baulig  <martin@ximian.com>
5833
5834         * MethodCore.cs (OverridesSomething): New public field; it's set
5835         from TypeContainer.DefineMembers if this method overrides
5836         something (which doesn't need to be a method).  Fix #39462.
5837
5838 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5839
5840         * typemanager.cs (GetMembers): Ensure that the list of members is
5841         reversed. This keeps things in sync.
5842
5843         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5844         find an AttributeUsage attribute.
5845
5846         * expression.cs (Invocation.OverloadResolve): Perform the check
5847         which disallows Invoke to be directly called on a Delegate.
5848
5849         (Error_InvokeOnDelegate): Report error cs1533.
5850
5851 2003-07-25  Martin Baulig  <martin@ximian.com>
5852
5853         * expression.cs (Indexers.GetIndexersForType): Only look in the
5854         interface hierarchy if the requested type is already an
5855         interface.  Fixes #46788 while keeping #46502 fixed.
5856
5857 2003-07-25  Martin Baulig  <martin@ximian.com>
5858
5859         * class.cs (TypeContainer.DefineMembers): Check whether all
5860         readonly fields have been assigned and report warning CS0649 if
5861         not.
5862
5863         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5864         a valuetype.
5865
5866 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5867
5868         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5869         returned from GetMethods to make things consistent with the
5870         assumptions MCS makes about ordering of methods.
5871
5872         This should comprehensively fix bug #45127 and it does :-)
5873
5874         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5875         ordering is actually reverse.
5876
5877         * Clean up some debug messages I left lying around.
5878
5879         * interface.cs (Populate*): Get rid of code which emits attributes
5880         since the stage in which we emit attributes is the 'Emit' stage,
5881         not the define stage.
5882
5883         (Emit): Move attribute emission for interface members here.
5884
5885 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5886
5887         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5888         closely: we eliminate methods in base types when we have an
5889         applicable method in a top-level type.
5890
5891         Please see section 14.5.5.1 for an exact description of what goes
5892         on. 
5893
5894         This fixes bug #45127 and a host of other related to corlib compilation.
5895
5896         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5897         array is the method corresponding to the top-level type (this is
5898         because of the changes made to icall.c) so we change this
5899         accordingly.
5900
5901         (MethodGroupExpr.Name): This too.
5902
5903         * typemanager.cs (GetElementType): New method which does the right
5904         thing when compiling corlib. 
5905
5906         * everywhere: Make use of the above in the relevant places.
5907
5908 2003-07-22  Martin Baulig  <martin@ximian.com>
5909
5910         * cs-parser.jay (invocation_expression): Moved
5911         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5912         `cast_expression', but create a InvocationOrCast which later
5913         resolves to either an Invocation or a Cast.
5914
5915         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5916         method; call this before EmitStatement() to make sure that this
5917         expression can be used as a statement.
5918
5919         * expression.cs (InvocationOrCast): New class; resolves to either
5920         an Invocation or a Cast.
5921
5922         * statement.cs (StatementExpression): Call ResolveStatement() on
5923         the ExpressionStatement before emitting it.
5924
5925 2003-07-21  Martin Baulig  <martin@ximian.com>
5926
5927         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5928         `ref' and `out' attributes match; fixes #46220.
5929         (MemberAccess.ResolveMemberAccess): You can't reference a type
5930         through an expression; fixes #33180.
5931         (Indexers.GetIndexersForType): Don't return the indexers from
5932         interfaces the class implements; fixes #46502.
5933
5934 2003-07-21  Martin Baulig  <martin@ximian.com>
5935
5936         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5937         CS0661 checks; fixes bug #30442.
5938
5939 2003-07-21  Martin Baulig  <martin@ximian.com>
5940
5941         * decl.cs (AdditionResult): Added `Error'.
5942
5943         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5944
5945         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5946         makes cs0031.cs actually work.
5947
5948 2003-07-20  Martin Baulig  <martin@ximian.com>
5949
5950         * namespace.cs: Fixed that bug which caused a crash when compiling
5951         the debugger's GUI.
5952
5953 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5954
5955         * typemanager.cs (LookupTypeReflection): Never expose types which
5956         are NotPublic, NestedPrivate, NestedAssembly, or
5957         NestedFamANDAssem.  We used to return these, and later do a check
5958         that would report a meaningful error, but the problem is that we
5959         would not get the real match, if there was a name override.
5960
5961 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5962
5963         * namespace.cs (Namespace, Name): Do not compute the namespace
5964         name dynamically, compute it in the constructor.  This reduced
5965         memory usage by 1697 KB.
5966
5967         * driver.cs: Use --pause to pause at the end.
5968
5969 2003-07-17  Peter Williams  <peter@newton.cx>
5970
5971         * Makefile: Change the name of the test target so that it doesn't
5972         conflict with the recursive test target.
5973
5974 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5975
5976         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5977         AddressOf): Do not use EmitThis, that was wrong, use the actual
5978         this pointer.
5979
5980 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5981
5982         * class.cs (MethodData.Define): While checking if a method is an
5983         interface implementation, improve the test: If we are not public
5984         (use new test here: use the computed MethodAttributes directly,
5985         instead of the parsed modifier flags) check if the `implementing'
5986         method comes from an interface or not.
5987
5988         * pending.cs (VerifyPendingMethods): Slightly better error
5989         message.
5990
5991         * makefile: add test target that does the mcs bootstrap.
5992
5993 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5994
5995         * interface.cs (Define): Do nothing here since there are no
5996         members to populate etc. Move the attribute emission out of here
5997         since this was just totally the wrong place to put it. Attribute
5998         application happens during the 'Emit' phase, not in the 'Define'
5999         phase.
6000
6001         (Emit): Add this method and move the attribute emission here
6002
6003         * rootcontext.cs (EmitCode): Call the Emit method on interface
6004         types too.
6005
6006 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6007
6008         * expression.cs (OverloadResolve): Report error only if Location
6009         is not 'Null' which means that there was a probe going on.
6010
6011 2003-07-14  Martin Baulig  <martin@ximian.com>
6012
6013         * expression.cs (ConditionalLogicalOperator): New public class to
6014         implement user defined conditional logical operators.
6015         This is section 14.11.2 in the spec and bug #40505.
6016
6017 2003-07-14  Martin Baulig  <martin@ximian.com>
6018
6019         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6020
6021 2003-07-14  Martin Baulig  <martin@ximian.com>
6022
6023         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6024
6025         * ecore.cs (IVariable.VerifyFixed): New interface method.
6026
6027         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6028         operator, check whether the variable is actually fixed.  Fixes bug
6029         #36055.  Set a variable definitely assigned when taking its
6030         address as required by the spec.
6031
6032         * statement.cs (LocalInfo.IsFixed): New field.
6033         (LocalInfo.MakePinned): Set `IsFixed' to true.
6034
6035 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6036
6037         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6038         for .ctors, ensure that we only ask for members declared in the
6039         attribute type (BindingFlags.DeclaredOnly).
6040
6041         Fixes bug #43632.
6042
6043         * expression.cs (Error_WrongNumArguments): Report error 1501
6044         correctly the way CSC does.
6045
6046 2003-07-13  Martin Baulig  <martin@ximian.com>
6047
6048         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6049         lookup on the fully qualified name, to make things like "X.X" work
6050         where "X.X" is a fully qualified type name, but we also have a
6051         namespace "X" in the using list.  Fixes #41975.
6052
6053 2003-07-13  Martin Baulig  <martin@ximian.com>
6054
6055         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6056         function. If we're a CompoundAssign, we need to create an embedded
6057         CompoundAssign, not an embedded Assign.
6058         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6059         Fixes #45854.
6060
6061 2003-07-13  Martin Baulig  <martin@ximian.com>
6062
6063         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6064         work to fix bug #46088.
6065
6066 2003-07-13  Ravi Pratap <ravi@ximian.com>
6067
6068         * class.cs (Operator.Emit): Do not emit attributes here - it is
6069         taken care of by the Method class that we delegate too. This takes
6070         care of bug #45876.
6071
6072 2003-07-10  Martin Baulig  <martin@ximian.com>
6073
6074         * expression.cs (TypeOfVoid): New class.
6075         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6076
6077 2003-07-10  Martin Baulig  <martin@ximian.com>
6078
6079         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6080         bug #35957.
6081
6082 2003-07-10  Martin Baulig  <martin@ximian.com>
6083
6084         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6085         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6086
6087         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6088
6089         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6090
6091 2003-07-10  Martin Baulig  <martin@ximian.com>
6092
6093         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6094         of decimal.  Fixes #42850.
6095
6096         NOTE: I also fixed the created byte blob, but this doesn't work on
6097         the MS runtime and csc never produces any byte blobs for decimal
6098         arrays.
6099
6100 2003-07-10  Martin Baulig  <martin@ximian.com>
6101
6102         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6103         structs; fixes #32068.
6104         (Block.AddChildVariableNames): Fixed #44302.
6105
6106 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6107
6108         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6109
6110 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6111
6112         * attribute.cs: And this test is onger needed.
6113
6114 2003-07-08  Martin Baulig  <martin@ximian.com>
6115
6116         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6117         inaccessible types.  Fixes #36313.
6118
6119         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6120
6121         * namespace.cs (NamespaceEntry): Create implicit entries for all
6122         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6123         implicit entries for N1.N2 and N1.
6124
6125 2003-07-08  Martin Baulig  <martin@ximian.com>
6126
6127         Rewrote the handling of namespaces to fix a lot of the issues
6128         wrt. `using' aliases etc.
6129
6130         * namespace.cs (Namespace): Splitted this class into a
6131         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6132
6133         * typemanager.cs (TypeManager.IsNamespace): Removed.
6134         (TypeManager.ComputeNamespaces): Only compute namespaces from
6135         loaded assemblies here, not the namespaces from the assembly we're
6136         currently compiling.
6137
6138 2003-07-08  Martin Baulig  <martin@ximian.com>
6139
6140         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6141
6142 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6143
6144         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6145         already fixed it.  
6146
6147         I thought about the memory savings here, but LookupTypeReflection
6148         is used under already very constrained scenarios.  Compiling
6149         corlib or mcs only exposes one hit, so it would not really reduce
6150         any memory consumption.
6151
6152 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6153
6154         * typemanager.cs: fixes bug #45889 by only adding public types from
6155         other assemblies to the list of known types.
6156
6157 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6158
6159         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6160         on the type we resolved.
6161
6162 2003-07-05  Martin Baulig  <martin@ximian.com>
6163
6164         * pending.cs (PendingImplementation.ParentImplements): Don't
6165         create the proxy if the parent is abstract.
6166
6167         * class.cs (TypeContainer.DefineIndexers): Process explicit
6168         interface implementations first.  Fixes #37714.
6169
6170 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6171
6172         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6173         defined recursively;  but since we modify the input parameters
6174         (left is set to `this' temporarily), we reset this value if the
6175         left_is_explicit is false, which gives the original semantics to
6176         the code.  
6177
6178         * literal.cs (NullPointer): new class used to represent a null
6179         literal in a pointer context.
6180
6181         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6182         type is a pointer, use a NullPointer object instead of a
6183         NullLiteral.   Closes 43687
6184
6185         (ExplicitConversion): Convert pointer values using
6186         the conv opcode to the proper type.
6187
6188         * ecore.cs (New): change ValueTypeVariable property into a method,
6189         that returns whether the valuetype is suitable for being used.
6190
6191         * expression.cs (Binary.DoNumericPromotions): Only return if we
6192         the int constant was a valid uint, and we can return both left and
6193         right as uints.  If not, we continue processing, to trigger the
6194         type conversion.  This fixes 39018.
6195
6196         * statement.cs (Block.EmitMeta): During constant resolution, set
6197         the CurrentBlock property on the emitcontext, so that we resolve
6198         constants propertly.
6199
6200 2003-07-02  Martin Baulig  <martin@ximian.com>
6201
6202         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6203         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6204
6205         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6206         than emitting it here.
6207
6208         * statement.cs: Fixed some more flow analysis bugs.
6209
6210 2003-07-02  Martin Baulig  <martin@ximian.com>
6211
6212         * class.cs (MethodData.Define): When implementing interface
6213         methods, set Final unless we're Virtual.
6214
6215         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6216         check work for interface methods.
6217
6218 2003-07-01  Martin Baulig  <martin@ximian.com>
6219
6220         * ecore.cs (EmitContext.This): Replaced this property with a
6221         GetThis() method which takes a Location argument.  This ensures
6222         that we get the correct error location for a CS0188.
6223
6224 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6225
6226         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6227         ImplicitStandardConversion.
6228
6229         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6230
6231 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6232
6233         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6234         optimization.
6235
6236 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6237
6238         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6239         constructors.
6240
6241         (MethodData.Define): Turn off initlocals for unsafe methods.
6242
6243 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6244
6245         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6246         complete;  Fixes #37521.
6247
6248         * delegate.cs: Use Modifiers.TypeAttr to compute the
6249         TypeAttributes, instead of rolling our own.  This makes the flags
6250         correct for the delegates.
6251
6252 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6253
6254         * class.cs (Constructor.Define): Set the private flag for static
6255         constructors as well.
6256
6257         * cs-parser.jay (statement_expression): Set the return value to
6258         null, to avoid a crash when we catch an error.
6259
6260 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6261
6262         * cs-parser.jay: Applied patch from Jackson that adds support for
6263         extern and unsafe modifiers to destructor declarations.
6264
6265         * expression.cs: Report error 21 if the user is trying to index a
6266         System.Array.
6267
6268         * driver.cs: Add an error message, suggested by the bug report.
6269
6270         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6271         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6272
6273 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6274
6275         * namespace.cs: Add some information to reduce FAQs.
6276
6277 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6278
6279         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6280         underlying enumeration types.  Fixes #43915.
6281
6282         * expression.cs: Treat ushort/short as legal values to be used in
6283         bitwise operations.
6284
6285 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6286
6287         * delegate.cs: transfer custom attributes for paramenters from
6288         the delegate declaration to Invoke and BeginInvoke.
6289
6290 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6291
6292         * attribute.cs: handle custom marshalers and emit marshal info
6293         for fields, too.
6294
6295 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6296
6297         * makefile.gnu: Added anonymous.cs to the compiler sources.
6298
6299 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6300
6301         * iterators.cs: Change the name of the proxy class to include two
6302         underscores.
6303
6304         * cs-parser.jay: Update grammar to include anonymous methods.
6305
6306         * anonymous.cs: new file.
6307
6308 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6309
6310         * class.cs (Field.Define): Add missing test for pointers and
6311         safety. 
6312
6313 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6314
6315         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6316         we use the stobj opcode.
6317
6318         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6319         since it wasn't the correct fix. 
6320
6321         It still is puzzling that we are required to use stobj for IntPtr
6322         which seems to be a ValueType.
6323
6324 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6325
6326         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6327         during regular simple name resolution.   Now, the trick is that
6328         instead of returning for processing the simplename, we do a
6329         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6330         contextual lookup type).   If a match is found, return that, if
6331         not, return for further composition.
6332
6333         This fixes long-standing 30485.
6334
6335         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6336         using the address to initialize an object, do an Stobj instead of
6337         using the regular Stelem.
6338
6339         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6340         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6341         Because if we are a BaseIndexerAccess that value will be true.
6342         Fixes 43643.
6343
6344         * statement.cs (GotoCase.Resolve): Return after reporting an
6345         error, do not attempt to continue. 
6346
6347         * expression.cs (PointerArithmetic.Emit): If our operand is a
6348         long, convert our constants to match the operand before
6349         multiplying.  Convert to I type before adding.   Fixes 43670.
6350
6351 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6352
6353         * enum.cs (ImplicitConversionExists) : Rename to
6354         ImplicitEnumConversionExists to remove ambiguity. 
6355
6356         * ecore.cs (NullCast): New type of cast expression class which
6357         basically is very similar to EmptyCast with the difference being
6358         it still is a constant since it is used only to cast a null to
6359         something else
6360         (eg. (string) null)
6361
6362         * convert.cs (ImplicitReferenceConversion): When casting a null
6363         literal, we return a NullCast.
6364
6365         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6366         should be around anymore.
6367
6368         The renaming (reported was slightly wrong). Corrections:
6369
6370         ConvertImplicitStandard -> ImplicitConversionStandard
6371         ConvertExplicitStandard -> ExplicitConversionStandard
6372
6373         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6374         before passing them in !
6375
6376         * convert.cs (ImplicitConversionStandard): When comparing for
6377         equal expr and target types, ensure that expr is not a
6378         NullLiteral.
6379
6380         In general, we must not be checking (expr_type ==
6381         target_type) in the top level conversion methods
6382         (ImplicitConversion, ExplicitConversion etc). This checking is
6383         done in the methods that they delegate to.
6384
6385 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6386
6387         * convert.cs: Move Error_CannotConvertType,
6388         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6389         ImplicitNumericConversion, ImplicitConversionExists,
6390         ImplicitUserConversionExists, StandardConversionExists,
6391         FindMostEncompassedType, FindMostSpecificSource,
6392         FindMostSpecificTarget, ImplicitUserConversion,
6393         ExplicitUserConversion, GetConversionOperators,
6394         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6395         TryImplicitIntConversion, Error_CannotConvertImplicit,
6396         ConvertImplicitRequired, ConvertNumericExplicit,
6397         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6398         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6399         its own file.
6400
6401         Perform the following renames:
6402
6403         StandardConversionExists -> ImplicitStandardConversionExists
6404         ConvertImplicit -> ImplicitConversion
6405         ConvertImplicitStandard -> ImplicitStandardConversion
6406         TryImplicitIntConversion -> ImplicitIntConversion
6407         ConvertImplicitRequired -> ImplicitConversionRequired
6408         ConvertNumericExplicit -> ExplicitNumericConversion
6409         ConvertReferenceExplicit -> ExplicitReferenceConversion
6410         ConvertExplicit -> ExplicitConversion
6411         ConvertExplicitStandard -> ExplicitStandardConversion
6412
6413 2003-05-19  Martin Baulig  <martin@ximian.com>
6414
6415         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6416         (TypeInfo): Added support for structs having structs as fields.
6417
6418         * ecore.cs (FieldExpr): Implement IVariable.
6419         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6420         VariableInfo for the field.
6421
6422 2003-05-18  Martin Baulig  <martin@ximian.com>
6423
6424         * expression.cs (This.DoResolve): Report a CS0027 if we're
6425         emitting a field initializer.
6426
6427 2003-05-18  Martin Baulig  <martin@ximian.com>
6428
6429         * expression.cs (This.ResolveBase): New public function.
6430         (This.DoResolve): Check for CS0188.
6431
6432         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6433         This.Resolve().
6434
6435         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6436         `instance_expression' to null if we don't have any non-static
6437         methods.
6438
6439 2003-05-18  Martin Baulig  <martin@ximian.com>
6440
6441         Reworked the way how local variables and parameters are handled by
6442         the flow analysis code.
6443
6444         * statement.cs (TypeInfo, VariableMap): New public classes.
6445         (VariableInfo): New public class.  This is now responsible for
6446         checking whether a variable has been assigned.  It is used for
6447         parameters and local variables.
6448         (Block.EmitMeta): Take the InternalParameters as argument; compute
6449         the layout of the flow vectors here.
6450         (Block.LocalMap, Block.ParameterMap): New public properties.
6451         (FlowBranching): The .ctor doesn't get the InternalParameters
6452         anymore since Block.EmitMeta() now computes the layout of the flow
6453         vector.
6454         (MyStructInfo): This class is now known as `StructInfo' and nested
6455         in `TypeInfo'; we don't access this directly anymore.
6456
6457         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6458         property and removed IsAssigned(), IsFieldAssigned(),
6459         SetAssigned() and SetFieldAssigned(); we now call them on the
6460         VariableInfo so we don't need to duplicate this code everywhere.
6461
6462         * expression.cs (ParameterReference): Added `Block block' argument
6463         to the .ctor.
6464         (LocalVariableReference, ParameterReference, This): The new
6465         VariableInfo class is now responsible for all the definite
6466         assignment stuff.
6467
6468         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6469         IsParameterAssigned, SetParameterAssigned): Removed.
6470
6471 2003-05-18  Martin Baulig  <martin@ximian.com>
6472
6473         * typemanager.cs (InitCoreTypes): Try calling
6474         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6475         the 3-args-version.  Corlib now also needs our `void_type'.
6476         (GetMethod): Added overloaded version which takes an optional
6477         `bool report_errors' to allow lookups of optional methods.
6478
6479 2003-05-12  Martin Baulig  <martin@ximian.com>
6480
6481         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6482         only used for locals and not for parameters.
6483
6484 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6485
6486         * support.cs (InternalParameters.ParameterType): Return the
6487         ExternalType of the parameter.
6488
6489         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6490         they were unused.
6491
6492 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6493
6494         * class.cs (MethodData.Define): Do not set the `newslot' on
6495         interface members, if they are also flagged as "override".
6496
6497         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6498         better code for ++i and i++.  This only works for static fields
6499         and local variables.
6500
6501         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6502         want to pull the DeclSpace out of the builder_to_declspace instead
6503         of the TypeBuilder (like in TypeContainer.FindMembers).
6504
6505         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6506         instead of LookupTypeContainer.  Fixes the crash on .NET for
6507         looking up interface members.
6508
6509         * const.cs: Create our own emit context during the Definition
6510         stage, so that constants are evaluated in the proper context, when
6511         a recursive definition happens.
6512
6513 2003-05-11  Martin Baulig  <martin@ximian.com>
6514
6515         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6516         new block for a switch section.
6517         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6518         the adding/lookup in the switch block.  Fixes #39828.
6519
6520 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6521
6522         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6523         functionality: I needed to convert the data after I had performed
6524         the add/sub operation into the operands type size.
6525
6526         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6527         pass the type for the box operation, otherwise the resulting
6528         object would have been of type object.
6529
6530         (BoxedCast): Add constructor to specify the type to box as.
6531
6532 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6533
6534         * iterators.cs: I was reusing the `count' variable inadvertently,
6535         take steps to not allow this to happen.
6536
6537 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6538
6539         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6540         by creating an array at the point where the params starts and
6541         putting all those arguments there, then adjusting the size of the
6542         array.
6543
6544 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6545
6546         * expression.cs (New.AddressOf): Implement interface
6547         IMemoryLocation.  This is used when the `new' operator is used in
6548         the context of an invocation to a method on a value type.
6549
6550         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6551         example. 
6552
6553         * namespace.cs: Also check the using aliases here.
6554
6555         * driver.cs: Move the test for using validity after the types have
6556         been entered, so we do a single pass that also includes the using
6557         aliases. 
6558
6559         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6560         in the regular case.   CreateSiblingForFinally is doing extra
6561         error checking.
6562
6563         * attribute.cs (GetAttributeArgumentExpression): Store the result
6564         on an out value, and use the return value to indicate failure
6565         instead of using null (which is a valid return for Constant.GetValue).
6566
6567         * statement.cs: Perform the analysis flow for the increment
6568         portion after the statement, because this will be the real flow of
6569         execution.  Fixes #42385
6570
6571         * codegen.cs (EmitContext.EmitArgument,
6572         EmitContext.EmitStoreArgument): New helper functions when the
6573         RemapToProxy flag is set.
6574
6575         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6576         function.
6577
6578         Add support for remapping parameters. 
6579
6580         * iterators.cs: Propagate parameter values;  Store parameter
6581         values in the proxy classes.
6582
6583 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6584
6585         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6586         need a proxy reference;  I do not know what I was thinking
6587
6588         * cs-parser.jay (constructor_initializer): catch another error,
6589         and display nice message.
6590
6591         (field_declaration): catch void field declaration
6592         to flag a better error. 
6593
6594         * class.cs (MemberBase.CheckBase): Report an error instead of a
6595         warning if a new protected member is declared in a struct. 
6596         (Field.Define): catch the error of readonly/volatile.
6597
6598         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6599
6600         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6601         volatile variable is taken
6602
6603 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6604
6605         * statement.cs (Fixed.Resolve): Report an error if we are not in
6606         an unsafe context.
6607
6608 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6609
6610         * typemanager.cs: reuse the code that handles type clashes for
6611         delegates and enumerations.
6612
6613         * class.cs (Report28): Always report.
6614
6615         * expression.cs (EncodeAsAttribute): Allow nulls here.
6616
6617 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6618
6619         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6620         the functionality for testing whether an expression is valid for
6621         an attribute here.  Also handle the case of arrays of elements
6622         being stored. 
6623
6624         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6625         encoding a linear array into an array of objects that are suitable
6626         to be passed to an CustomAttributeBuilder.
6627
6628         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6629
6630         * ecore.cs: (FieldExpr): Handle field remapping here.
6631
6632         * iteratators.cs: Pass the instance variable (if the method is an
6633         instance method) to the constructors, so we can access the field
6634         variables on the class.
6635
6636         TODO: Test this with structs.  I think the THIS variable on
6637         structs might have to be a pointer, and not a refenrece
6638
6639 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6640
6641         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6642         local variables to fields in a proxy class.
6643
6644         * iterators.cs (PopulateProxy): Rename our internal fields to
6645         <XXX>.  
6646         Create a <THIS> field if we are an instance method, so we can
6647         reference our parent container variables.
6648         (MapVariable): Called back from the EmitContext code to enter a
6649         new variable to field mapping into the proxy class (we just create
6650         a FieldBuilder).
6651
6652         * expression.cs
6653         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6654         for using the remapped locals to fields.
6655
6656         I placed the code here, because that gives the same semantics to
6657         local variables, and only changes the Emit code.
6658
6659         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6660         statements inside iterators.
6661         (VariableInfo): Add a FieldBuilder for the cases when we are
6662         remapping local variables to fields in a proxy class
6663
6664         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6665         current_block != null.
6666
6667         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6668         not cope with strings, as it has been moved to the
6669         TableSwitchEmit.  Fixed bug in switch generation.
6670
6671         * expression.cs (New.DoResolve): Provide more context for the user
6672         when reporting an error.
6673
6674         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6675         pointers. 
6676
6677         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6678         check the permissions for it.  Note than in a type-resolution
6679         context the check was already present in DeclSpace.ResolveType,
6680         but was missing from the MemberAccess.
6681
6682         (ArrayCreation.CheckIndices): warn if the user has
6683         more nested levels of expressions, but there are no more
6684         dimensions specified.  Avoids crash on bug 41906.
6685
6686 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6687
6688         * statement.cs (Block): replace Implicit bool, for a generic
6689         flags.   
6690         New flag: `Unchecked'.  This is used during the EmitMeta phase
6691         (which is out-of-line with the regular Resolve/Emit process for a
6692         statement, as this is done ahead of time, but still gets a chance
6693         to call constant resolve).
6694
6695         (Block.Flags): new enum for adding a new flag.
6696
6697         (Block.EmitMeta): track the state of unchecked.
6698
6699         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6700         to enable constant resolution to work there as well.
6701
6702 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6703
6704         * typemanager.cs (ienumerable_type): Also look up
6705         System.Collections.IEnumerable. 
6706
6707 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6708
6709         TODO: Test more than one conditional per method.
6710
6711         * class.cs (Indexer.Define): Report the location where the user is
6712         referencing the unsupported feature.
6713
6714         (MethodData): Overload the use of `conditionals' to
6715         minimize the creation of needless ArrayLists.   This saves roughly
6716         212kb on my machine.
6717
6718         (Method): Implement the new IIteratorContainer interface.
6719         (Method.SetYields): Implement the method by setting the ModFlags
6720         to contain METHOD_YIELDS.
6721
6722         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6723         which just got set to null.
6724
6725         * iterators.cs: New file.
6726
6727         (Yield, YieldBreak): New statements.
6728
6729         * statement.cs (Return.Resolve): Flag an error if we are used in
6730         an iterator method.
6731
6732         * codegen.cs (InIterator): New flag set if the code is being
6733         compiled in an iterator method.
6734
6735         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6736         internal modifier, and we just use it to avoid adding extra
6737         fields, as this is seldom used.  
6738
6739         * cs-parser.jay: Add yield_statement (yield and yield break).
6740
6741         * driver.cs: New flag -v2 to turn on version 2 features. 
6742
6743         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6744         hashtable when v2 is enabled.
6745
6746 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6747
6748         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6749         there is already a namespace defined with this name.
6750
6751         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6752         people upgraded their corlibs.
6753
6754         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6755         always use fully qualified types, no need to use the compiler
6756         front end.
6757
6758         (TypeManager.IsNamespace): Use binarysearch.
6759
6760         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6761         AddDelegate): I did not quite use the new IsValid API properly: I
6762         have to pass the short-name and the fullname.  I was passing only
6763         the basename instead of the fullname sometimes. 
6764
6765         (TypeContainer.DefineType): call NamespaceClash.
6766
6767         * interface.cs (Interface.DefineType): use NamespaceClash before
6768         defining the type.
6769
6770         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6771         defining the type.
6772
6773         * enum.cs: (Enum.DefineType): use NamespaceClash before
6774         defining the type.
6775
6776         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6777         speed increase.  First, use the negative_hits cache when we get a
6778         negative.  Second, add the type with its full original name
6779         instead of the new . and + encoded name (reflection uses + to
6780         separate type from a nested type).  Use LookupTypeReflection
6781         directly which bypasses the type->name hashtable (that we already
6782         know does not contain the type.
6783
6784         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6785         location/container type. 
6786
6787         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6788
6789 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6790
6791         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6792
6793         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6794         method is being referenced in the method group from a static
6795         context, and report error 120 if so.
6796
6797         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6798         Error118. 
6799
6800         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6801         is created, we create the A namespace).
6802
6803         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6804         Fixes #41591
6805
6806 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6807
6808         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6809         invocation to ModuleBuilder.GetType with the same values will
6810         return a new type instance, so we need to cache its return
6811         values. 
6812
6813         * expression.cs (Binary.ResolveOperator): Only allow the compare
6814         operators on enums if they are of the same type.
6815
6816         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6817         types of ValueType on their own case.  Before we were giving them
6818         the same treatment as objects.
6819
6820         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6821         fullname.  Short name is used to compare against container name.
6822         Fullname is used to check against defined namespace names.
6823
6824         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6825         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6826
6827         (Method.CheckBase): Call parent.
6828         (MemberBase.CheckBase): Check for protected members on sealed
6829         classes.
6830         (PropertyBase.CheckBase): Call parent.
6831         (Field.Define): Call parent.
6832
6833         * report.cs: Negative error codes are now mapped to 8000 - code,
6834         so that the display is render more nicely.
6835
6836         * typemanager.cs: Do not use try/catch, instead report a regular
6837         error. 
6838
6839         (GetPointerType, GetReferenceType): These methods provide
6840         mechanisms to obtain the T* and T& from a T.  We had the code
6841         previously scattered around the code base, and it also used
6842         TypeManager.LookupType that would go through plenty of caches.
6843         This one goes directly to the type source.
6844
6845         In some places we did the Type.GetType followed by
6846         ModuleBuilder.GetType, but not in others, so this unifies the
6847         processing as well.
6848
6849         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6850         statements now that we have namespace information.
6851
6852         * typemanager.cs (IsNamespace): New method, returns whether the
6853         string presented is a namespace or not.
6854
6855         (ComputeNamespaces): New public entry point, computes the list of
6856         available namespaces, using the GetNamespaces API call in Mono, or
6857         the slower version in MS.NET.   
6858
6859         Now before we start the semantic analysis phase, we have a
6860         complete list of namespaces including everything that the user has
6861         provided.
6862
6863         Deleted old code to cache namespaces in .nsc files.
6864
6865 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6866
6867         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6868         class/struct location definition Location for the implicit
6869         constructor location.
6870
6871         (Operator.Define): Use the location of the operator for the
6872         implicit Method definition.
6873
6874         (Constructor.Emit): use the constructor location for the implicit
6875         base initializer constructor.
6876
6877         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6878         and the Expression class now contains two new methods:
6879
6880         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6881         isolate type lookup from the rest of the resolution process.
6882
6883         Since we use Expressions to hold type definitions due to the way
6884         we parse the input we have historically overloaded Resolve to
6885         perform the Type lookups if a special flag is passed.  Now this is
6886         eliminated and two methods take their place. 
6887
6888         The differences in the two methods between xStep and xTerminal is
6889         that xStep is involved in our current lookup system that uses
6890         SimpleNames to compose a name, while xTerminal is used just to
6891         catch the case where the simplename lookup failed.
6892
6893 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6894
6895         * expression.cs (ResolveMemberAccess): Remove redundant code.
6896         TypeExpr expressions are always born fully resolved.
6897
6898         * interface.cs (PopulateMethod): Do not lookup the types twice.
6899         We were doing it once during SemanticAnalysis and once during
6900         PopulateMethod.
6901
6902         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6903         in local variable type definitions, were being returned as a
6904         SimpleName (we decomposed everything into a string), that is
6905         because primary_expression was being used instead of a type in the
6906         grammar (reduce/reduce conflicts).
6907
6908         The part that was wrong is that we converted the expression into a
6909         string (an oversimplification in one hand, compounded with primary
6910         expressions doing string concatenation).
6911
6912         So things like:
6913
6914         A.B.C [] x;
6915
6916         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6917         using clauses from working on this particular context.  And a type
6918         was being matched directly against "A.B.C[]".
6919
6920         We now use the correct approach, and allow for ComposedCast to be
6921         part of the unary expression.  So the "A.B.C []" become a composed
6922         cast of "A.B.C" (as a nested group of MemberAccess with a
6923         SimpleName at the end) plus the rank composition "[]". 
6924
6925         Also fixes 35567
6926
6927 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6928
6929         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6930         for the access level checking.
6931
6932         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6933         `TypeContainer container', because I kept getting confused when I
6934         was debugging this code.
6935
6936         * expression.cs (Indexers): Instead of tracking getters/setters,
6937         we now track them in parallel.  We create one arraylist less, but
6938         most importantly it is possible now for the LValue code to find a
6939         matching get for a set.
6940
6941         (IndexerAccess.DoResolveLValue): Update the code.
6942         GetIndexersForType has been modified already to extract all the
6943         indexers from a type.  The code assumed it did not.
6944
6945         Also make the code set the correct return type for the indexer.
6946         This was fixed a long time ago for properties, but was missing for
6947         indexers.  It used to be void_type.
6948
6949         (Binary.Emit): Test first for doubles instead of
6950         floats, as they are more common.
6951
6952         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6953         when dealing with floats and the <=, >= operators.  This fixes bug
6954         #39314 
6955
6956         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6957         to load the array value by emitting a load on the foreach variable
6958         type.  This was incorrect.  
6959
6960         We now emit the code to load an element using the the array
6961         variable type, and then we emit the conversion operator.
6962
6963         Fixed #40176
6964
6965 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6966
6967         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6968
6969 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6970
6971         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6972         test for protection before we test for signatures. 
6973
6974         (MethodSignature.ToString): implement.
6975
6976         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6977         to the case where we reduced into a LongConstant.
6978
6979         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6980         depend on whether the information is acurrate, because the
6981         Microsoft runtime will always claim that the array type is public,
6982         regardless of the real state.
6983
6984         If the type is a pointer, another problem happens: the type is
6985         reported as non-public in Microsoft.  
6986
6987         In both cases we have to call CheckAccessLevel recursively with
6988         the underlying type as the argument to be tested.
6989
6990 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6991
6992         * assign.cs (Assign.Emit): If we are dealing with a compound
6993         assignment expression, we should use the code path that stores the
6994         intermediate result in a temporary value.  This fixes #40903.
6995
6996         *expression.cs (Indirection.ToString): Provide ToString method for
6997         debugging. 
6998
6999 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7000
7001         * class.cs: Null out fields holding references to Block objects so
7002         they can be garbage collected.
7003
7004         * expression.cs (OverloadResolve): Remove unused local.
7005
7006 2003-04-07  Martin Baulig  <martin@ximian.com>
7007
7008         * codegen.cs (EmitContext.CurrentFile): New public field.
7009         (EmitContext.Mark): Use the CurrentFile to check whether the
7010         location is in the correct file.
7011         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7012
7013 2003-04-07  Martin Baulig  <martin@ximian.com>
7014
7015         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7016
7017         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7018         location.  [FIXME: The location argument which gets passed to this
7019         method is sometimes wrong!]
7020
7021 2003-04-07  Nick Drochak <ndrochak@gol.com>
7022
7023         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7024
7025 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7026
7027         * expression.cs (Indirection.EmitAssign): We were using the
7028         temporary, but returning immediately instead of continuing the
7029         EmitAssing flow.
7030
7031 2003-04-06  Martin Baulig  <martin@ximian.com>
7032
7033         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7034         if it's a nested child, but also deriving from the outer class.
7035         See test 190.cs.
7036
7037         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7038         nested child, but also deriving from the outer class.  See
7039         test-190.cs.
7040         (FilterWithClosure): We may access private members of the outer
7041         class if we're a nested child and deriving from the outer class.
7042         (RealMemberLookup): Only set `closure_private_ok' if the
7043         `original_bf' contained BindingFlags.NonPublic.
7044
7045 2003-04-05  Martin Baulig  <martin@ximian.com>
7046
7047         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7048
7049 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7050
7051         * class.cs (Event.Define): Do not allow abstract events to have
7052         initializers. 
7053
7054 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7055
7056         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7057         block in event declarations.
7058
7059         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7060         value type, get its address.
7061
7062         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7063         leaving a class on the stack instead of a boolean value (int
7064         0/1).  Change the code so we compare against null, and then the
7065         result against zero.
7066
7067         * class.cs (TypeContainer.GetClassBases): We were checking for the
7068         parent class being sealed too late.
7069
7070         * expression.cs (Binary.Emit): For <= and >= when dealing with
7071         floating point values, use cgt.un and clt.un instead of cgt and
7072         clt alone.
7073
7074 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7075
7076         * statement.cs: Apply the same optimization as MS: skip the 
7077         GetEnumerator returning an IEnumerator, and use the one returning a 
7078         CharEnumerator instead. This allows us to avoid the try-finally block 
7079         and the boxing.
7080
7081 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7082
7083         * cs-parser.jay: Attributes cannot be applied to
7084                          namespaces. Fixes #40473
7085
7086 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7087
7088         * class.cs:
7089         (Add*): check if the name is valid using the full name for constants,
7090         fields, properties and events.
7091
7092 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7093
7094         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7095         char constants to be part of the enumeration.
7096
7097         * expression.cs (Conditional.DoResolve): Add support for operator
7098         true. Implements the missing functionality from 14.12
7099
7100         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7101         operator true/false as required by the spec.
7102
7103         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7104         implicit conversion to boolean.
7105
7106         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7107         also one where the type implements `operator true'. 
7108
7109         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7110         get an expression that will invoke operator true based on an
7111         expression.  
7112
7113         (GetConversionOperators): Removed the hack that called op_True
7114         here.  
7115
7116         (Expression.ResolveBoolean): Move this from Statement.
7117
7118 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7119
7120         * ecore.cs (FieldExpr): do not allow initialization of initonly
7121         fields on derived classes
7122
7123 2003-03-13  Martin Baulig  <martin@ximian.com>
7124
7125         * statement.cs (Block.Emit): Call ig.BeginScope() and
7126         ig.EndScope() when compiling with debugging info; call
7127         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7128
7129 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7130
7131         * expression.cs (Indexers): Do not construct immediately, allow
7132         for new members to be appended as we go.  Fixes 38143
7133
7134 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7135
7136         * expression.cs: save/restore context when resolving an unchecked
7137         expression.
7138
7139 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7140
7141         * cfold.cs: Catch division by zero in modulus operator during
7142         constant folding.
7143
7144 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7145
7146         * interface.cs (Interface.DefineMembers): Avoid defining members
7147         twice. 
7148
7149 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7150
7151         * driver.cs: handle the +/- options for -noconfig
7152
7153         * statement.cs (Unckeched.Resolve): Also track the state of
7154         unchecked in the Resolve phase.
7155
7156 2003-02-27  Martin Baulig  <martin@ximian.com>
7157
7158         * ecore.cs (Expression.MemberLookup): Don't create a
7159         MethodGroupExpr for something which is not a method.  Fixes #38291.
7160
7161 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7162
7163         * class.cs (MemberBase.CheckParameters): Also check that the type
7164         is unmanaged if it is a pointer.
7165
7166         * expression.cs (SizeOf.Resolve): Add location information.
7167
7168         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7169         a managed type is declared.
7170
7171         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7172         parameter modifiers as well.  Fixes bug 38606
7173
7174         * class.cs: Very sad.  Am backing out the speed up changes
7175         introduced by the ArrayList -> Array in the TypeContainer, as they
7176         were not actually that much faster, and introduced a bug (no error
7177         reports on duplicated methods).
7178
7179         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7180         source first, this will guarantee that we have a valid expression
7181         before calling in lower levels functions that will require a
7182         resolved object.  Then use this original_source in the
7183         target.ResolveLValue instead of the original source that was
7184         passed to us.
7185
7186         Another change.  Use target.Resolve instead of LValueResolve.
7187         Although we are resolving for LValues, we will let the Assign code
7188         take care of that (it will be called again from Resolve).  This
7189         basically allows code like this:
7190
7191         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7192         class Y { void A (X x) { x [0] += o; }
7193
7194         The problem was that the indexer was trying to resolve for
7195         set_Item (idx, object o) and never finding one.  The real set_Item
7196         was set_Item (idx, X).  By delaying the process we get the right
7197         semantics. 
7198
7199         Fixes bug 36505
7200
7201 2003-02-23  Martin Baulig  <martin@ximian.com>
7202
7203         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7204         while calling DoEmit ().
7205
7206         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7207         source files; if you use the #line directive inside a method, the
7208         compiler stops emitting line numbers for the debugger until it
7209         reaches the end of the method or another #line directive which
7210         restores the original file.
7211
7212 2003-02-23  Martin Baulig  <martin@ximian.com>
7213
7214         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7215
7216 2003-02-23  Martin Baulig  <martin@ximian.com>
7217
7218         * statement.cs (Block.AddChildVariableNames): We need to call this
7219         recursively, not just for our immediate children.
7220
7221 2003-02-23  Martin Baulig  <martin@ximian.com>
7222
7223         * class.cs (Event.Define): Always make the field private, like csc does.
7224
7225         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7226         actually work, fixes bug #37521.
7227
7228 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7229
7230         * delegate.cs: When creating the various temporary "Parameters"
7231         classes, make sure that we call the ComputeAndDefineParameterTypes
7232         on those new parameters (just like we do with the formal ones), to
7233         allow them to be resolved in the context of the DeclSpace.
7234
7235         This fixes the bug that Dick observed in Bugzilla #38530.
7236
7237 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7238
7239         * expression.cs (ResolveMemberAccess): When resolving a constant,
7240         do not attempt to pull a constant if the value was not able to
7241         generate a valid constant.
7242
7243         * const.cs (LookupConstantValue): Do not report more errors than required.
7244
7245 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7246
7247         * expression.cs: fixes bug #38328.
7248
7249 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7250
7251         * class.cs: Changed all the various members that can be part of a
7252         class from being an ArrayList to be an Array of the right type.
7253         During the DefineType type_list, interface_list, delegate_list and
7254         enum_list are turned into types, interfaces, delegates and enums
7255         arrays.  
7256
7257         And during the member population, indexer_list, event_list,
7258         constant_list, field_list, instance_constructor_list, method_list,
7259         operator_list and property_list are turned into their real arrays.
7260
7261         Although we could probably perform this operation earlier, for
7262         good error reporting we need to keep the lists and remove the
7263         lists for longer than required.
7264
7265         This optimization was triggered by Paolo profiling the compiler
7266         speed on the output of `gen-sample-program.pl' perl script. 
7267
7268         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7269         not crash in methods like MemberLookupFailed that use this field.  
7270
7271         This problem arises when the compiler fails to resolve a type
7272         during interface type definition for example.
7273
7274 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7275
7276         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7277         inherit from System.Object, so we have to stop at null, not only
7278         when reaching System.Object.
7279
7280 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7281
7282         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7283         DeclaredOnly because the parent indexer might have had a different
7284         name, but did not loop until the top of the hierarchy was reached.
7285
7286         The problem this one fixes is 35492: when a class implemented an
7287         indexer from an interface, we were getting the interface method
7288         (which was abstract) and we were flagging an error (can not invoke
7289         abstract method).
7290
7291         This also keeps bug 33089 functioning, and test-148 functioning.
7292
7293         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7294         out if a method is special is to see if it is declared in a
7295         property or event, or whether it is one of the predefined operator
7296         names.   This should fix correctly #36804.
7297
7298 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7299
7300         The goal here is to remove the dependency on EmptyCast.Peel ().
7301         Killing it completely.
7302
7303         The problem is that currently in a number of places where
7304         constants are expected, we have to "probe" for an EmptyCast, and
7305         Peel, which is not the correct thing to do, as this will be
7306         repetitive and will likely lead to errors. 
7307
7308         The idea is to remove any EmptyCasts that are used in casts that
7309         can be reduced to constants, so we only have to cope with
7310         constants. 
7311
7312         This bug hunt was triggered by Bug 37363 and the desire to remove
7313         the duplicate pattern where we were "peeling" emptycasts to check
7314         whether they were constants.  Now constants will always be
7315         constants.
7316
7317         * ecore.cs: Use an enumconstant here instead of wrapping with
7318         EmptyCast.  
7319
7320         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7321         throwing me off.  By handling this we can get rid of a few hacks.
7322
7323         * statement.cs (Switch): Removed Peel() code.
7324
7325 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7326
7327         * class.cs: Location information for error 508
7328
7329         * expression.cs (New.DoResolve): Add a guard against double
7330         resolution of an expression.  
7331
7332         The New DoResolve might be called twice when initializing field
7333         expressions (see EmitFieldInitializers, the call to
7334         GetInitializerExpression will perform a resolve on the expression,
7335         and later the assign will trigger another resolution
7336
7337         This leads to bugs (#37014)
7338
7339         * delegate.cs: The signature for EndInvoke should contain any ref
7340         or out parameters as well.  We were not doing this in the past. 
7341
7342         * class.cs (Field.Define): Do not overwrite the type definition
7343         inside the `volatile' group.  Turns out that volatile enumerations
7344         were changing the type here to perform a validity test, which
7345         broke conversions. 
7346
7347 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7348
7349         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7350         and structs, we do not want to load the instance variable
7351
7352         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7353         enum_type has to be handled like an object reference (implicit
7354         conversions exists from this to object), but the regular IsClass
7355         and IsValueType tests will never return true for this one.
7356
7357         Also we use TypeManager.IsValueType instead of type.IsValueType,
7358         just for consistency with the rest of the code (this is only
7359         needed if we ever use the construct exposed by test-180.cs inside
7360         corlib, which we dont today).
7361
7362 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7363
7364         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7365         just InternalCall.
7366
7367 2003-02-09  Martin Baulig  <martin@ximian.com>
7368
7369         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7370         (Namespace.DefineNamespaces): New static public method; this is
7371         called when we're compiling with debugging to add all namespaces
7372         to the symbol file.
7373
7374         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7375         pass it to the Namespace's .ctor.
7376
7377         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7378         and MethodBase arguments; pass the namespace ID to the symwriter;
7379         pass the MethodBase instead of the token to the symwriter.
7380         (SymbolWriter.DefineNamespace): New method to add a namespace to
7381         the symbol file.
7382
7383 2003-02-09  Martin Baulig  <martin@ximian.com>
7384
7385         * symbolwriter.cs: New file.  This is a wrapper around
7386         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7387         methods here in near future.
7388
7389 2003-02-09  Martin Baulig  <martin@ximian.com>
7390
7391         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7392         ILGenerator.MarkSequencePoint() which are actually used by the
7393         symbol writer.
7394
7395 2003-02-09  Martin Baulig  <martin@ximian.com>
7396
7397         * location.cs (SourceFile): New public sealed class.  This
7398         contains the name and an index which is used in the location's token.
7399         (Location): Reserve an appropriate number of bits in the token for
7400         the source file instead of walking over that list, this gives us a
7401         really huge performance improvement when compiling with debugging.
7402
7403         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7404         `SourceFile' argument instead of a string.
7405         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7406         but don't parse/tokenize here, we need to generate the list of all
7407         source files before we do that.
7408         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7409         the files.
7410
7411         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7412         instead of a string.
7413
7414         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7415         of a string.
7416
7417 2003-02-09  Martin Baulig  <martin@ximian.com>
7418
7419         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7420         filename on `#line default'.
7421
7422 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7423
7424         * statement.cs: don't clear the pinned var when the fixed statement
7425         returns from the method (fixes bug#37752).
7426
7427 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7428
7429         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7430         to IsValueType.
7431
7432 2003-02-07  Martin Baulig  <martin@ximian.com>
7433
7434         * driver.cs: Removed the `--debug-args' command line argument.
7435
7436         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7437         automatically by the AsssemblyBuilder.
7438         (CodeGen.InitializeSymbolWriter): We don't need to call any
7439         initialization function on the symbol writer anymore.  This method
7440         doesn't take any arguments.
7441
7442 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7443
7444         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7445         from referenced assemblies as well.
7446
7447 2003-02-02  Martin Baulig  <martin@ximian.com>
7448
7449         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7450
7451 2003-02-02  Martin Baulig  <martin@ximian.com>
7452
7453         * class.cs (Constructor.Emit): Open the symbol writer before
7454         emitting the constructor initializer.
7455         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7456         single-stepping through constructor initializers.
7457
7458 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7459
7460         * class.cs: Handle error 549: do not allow virtual methods in
7461         sealed classes. 
7462
7463 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7464
7465         * decl.cs: Check access levels when resolving types
7466
7467 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7468
7469         * statement.cs: Add parameters and locals set in catch blocks that might 
7470         return to set vector
7471
7472 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7473
7474         * class.cs (Operator): Set the SpecialName flags for operators.
7475
7476         * expression.cs (Invocation.DoResolve): Only block calls to
7477         accessors and operators on SpecialName methods.
7478
7479         (Cast.TryReduce): Handle conversions from char constants.
7480
7481
7482 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7483
7484         * statement.cs: small memory and time optimization in FlowBranching.
7485
7486 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7487
7488         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7489         problem that the last fix but in the other sid (Set).
7490
7491         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7492         access when there is no indexer in the hierarchy.
7493
7494 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7495
7496         * class.cs: Combine some if statements.
7497
7498 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7499
7500         * driver.cs: fixed bug #37187.
7501
7502 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7503
7504         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7505         any indexer, it's needed to build a list with all the indexers in the
7506         hierarchy (AllGetters), else we have problems. Fixes #35653.
7507
7508 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7509
7510         * class.cs (MethodData.Define): It is wrong for an interface
7511         implementation to be static in both cases: explicit and implicit.
7512         We were only handling this in one case.
7513
7514         Improve the if situation there to not have negations.
7515
7516         * class.cs (Field.Define): Turns out that we do not need to check
7517         the unsafe bit on field definition, only on usage.  Remove the test.
7518
7519 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7520
7521         * driver.cs: use assembly.Location instead of Codebase (the latest
7522         patch made mcs fail when using MS assemblies).
7523
7524 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7525
7526         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7527         get the path to *corlib.dll.
7528
7529 2003-01-21  Nick Drochak <ndrochak@gol.com>
7530
7531         * cs-tokenizer.cs:
7532         * pending.cs:
7533         * typemanager.cs: Remove compiler warnings
7534
7535 2003-01-20  Duncan Mak  <duncan@ximian.com>
7536
7537         * AssemblyInfo.cs: Bump the version number to 0.19.
7538
7539 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7540
7541         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7542
7543 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7544
7545         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7546
7547 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7548
7549         * cs-parser.jay: Small fix: we were not comparing the constructor
7550         name correctly.   Thanks to Zoltan for the initial pointer.
7551
7552 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7553
7554         * cs-tokenizer.cs: Set file name when specified with #line
7555
7556 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7557
7558         * cs-parser.jay: Only perform the constructor checks here if we
7559         are named like the class;  This will help provider a better
7560         error.  The constructor path is taken when a type definition is
7561         not found, but most likely the user forgot to add the type, so
7562         report that rather than the constructor error.
7563
7564 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7565
7566         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7567         allocations.
7568
7569 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7570
7571         * cs-parser.jay: Add cleanup call.
7572
7573 2003-01-13  Duncan Mak  <duncan@ximian.com>
7574
7575         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7576         consistent with other methods.
7577
7578 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7579
7580         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7581
7582 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7583
7584         * attribute.cs: only set GuidAttr to true when we have a
7585         GuidAttribute.
7586
7587 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7588
7589         * ecore.cs:
7590         * expression.cs:
7591         * typemanager.cs: fixes to allow mcs compile corlib with the new
7592         Type.IsSubclassOf fix.
7593
7594 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7595
7596         * expression.cs (LocalVariableReference.DoResolve): Classify a
7597         constant as a value, not as a variable.   Also, set the type for
7598         the variable.
7599
7600         * cs-parser.jay (fixed_statement): take a type instead of a
7601         pointer_type, so we can produce a better error message later.
7602
7603         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7604         as an error.  
7605
7606         (For.DoEmit): Make inifinite loops have a
7607         non-conditional branch back.
7608
7609         (Fixed.DoEmit): First populate the pinned variables, then emit the
7610         statement, then clear the variables.  Before I was emitting the
7611         code once for each fixed piece.
7612
7613
7614 2003-01-08  Martin Baulig  <martin@ximian.com>
7615
7616         * statement.cs (FlowBranching.MergeChild): A break in a
7617         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7618
7619 2003-01-08  Martin Baulig  <martin@ximian.com>
7620
7621         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7622         lives in the same number space than `param_map'.  Fixes #36154.
7623
7624 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7625
7626         * cs-parser.jay (constructor_declaration): Set the
7627         Constructor.ModFlags before probing for it.  This makes the
7628         compiler report 514, 515 and 132 (the code was there, but got
7629         broken). 
7630
7631         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7632         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7633         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7634
7635 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7636
7637         * enum.cs: create the enum static fields using the enum type.
7638
7639 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7640
7641         * class.cs: don't try to create the ParamBuilder for the return
7642         type if it's not needed (and handle it breaking for the ms runtime
7643         anyway).
7644
7645 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7646
7647         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7648
7649 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7650
7651         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7652         the command.   This showed up while compiling the JANET source
7653         code, which used \r as its only newline separator.
7654
7655 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7656
7657         * class.cs (Method.Define): If we are an operator (because it
7658         reuses our code), then set the SpecialName and HideBySig.  #36128
7659
7660 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7661
7662         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7663         exception, report error 120 `object reference required'.
7664
7665         * driver.cs: Add --pause option, used during to measure the size
7666         of the process as it goes with --timestamp.
7667
7668         * expression.cs (Invocation.DoResolve): Do not allow methods with
7669         SpecialName to be invoked.
7670
7671 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7672
7673         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7674         number before adding it.
7675
7676 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7677
7678         * ecore.cs (StandardImplicitConversion): When in an unsafe
7679         context, we allow conversion between void * to any other pointer
7680         type. This fixes bug #35973.
7681
7682 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7683
7684         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7685         is not thrown when extensionless outputs are used 
7686
7687 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7688
7689         * rootcontext.cs: fixed compilation of corlib.
7690
7691 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7692
7693         * attribute.cs (Attributes.Contains): Add new method.
7694
7695         * class.cs (MethodCore.LabelParameters): if the parameter is an
7696         `out' parameter, check that no attribute `[In]' has been passed.
7697
7698         * enum.cs: Handle the `value__' name in an enumeration.
7699
7700 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7701
7702         * decl.cs: Added special case to allow overrides on "protected
7703         internal" methods
7704
7705 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7706
7707         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7708         since it makes much more sense.
7709
7710         (Attributes.ctor): Don't require a Location parameter.
7711
7712         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7713
7714         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7715         since we already have that information per attribute.
7716
7717         * everywhere : make appropriate changes.
7718
7719         * class.cs (LabelParameters): Write the code which actually
7720         applies attributes to the return type. We can't do this on the MS
7721         .NET runtime so we flag a warning in the case an exception is
7722         thrown.
7723
7724 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7725
7726         * const.cs: Handle implicit null conversions here too.
7727
7728 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7729
7730         * class.cs (MethodCore.LabelParameters): Remove the extra
7731         Type [] parameter since it is completely unnecessary. Instead
7732         pass in the method's attributes so that we can extract
7733         the "return" attribute.
7734
7735 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7736
7737         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7738         of ignoring it and letting the compile continue.
7739
7740         * typemanager.cs (ChangeType): use an extra argument to return an
7741         error condition instead of throwing an exception.
7742
7743 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7744
7745         * expression.cs (Unary.TryReduce): mimic the code for the regular
7746         code path.  Perform an implicit cast in the cases where we can
7747         implicitly convert to one of the integral types, and then reduce
7748         based on that constant.   This fixes bug #35483.
7749
7750 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7751
7752         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7753
7754 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7755
7756         * namespace.cs: fixed bug #35489.
7757
7758 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7759
7760         * class.cs: Remove some dead code.
7761
7762         * cs-parser.jay: Estimate the number of methods needed
7763         (RootContext.MethodCount);
7764
7765         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7766         numbers instead of StringBuilders.
7767
7768         * support.cs (PtrHashtable): Add constructor with initial size;
7769         We can now reduce reallocations of the method table.
7770
7771 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7772
7773         * attribute.cs (ApplyAttributes): Keep track of the emitted
7774         attributes on a per-target basis. This fixes bug #35413.
7775
7776 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7777
7778         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7779         default to the Windows 1252 encoding.
7780
7781         (UnixParseOption): Support version, thanks to Alp for the missing
7782         pointer. 
7783
7784         * AssemblyInfo.cs: Add nice assembly information.
7785
7786         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7787         (bug 35169).
7788
7789         * cs-parser.jay: Allow a trailing comma before the close bracked
7790         in the attribute_section production.
7791
7792         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7793         address of the instance was being taken, I will take this out,
7794         because we take the address of the object immediately here.
7795
7796 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7797
7798         * typemanager.cs (AreMultipleAllowed): Take care of the most
7799         obvious case where attribute type is not in the current assembly -
7800         stupid me ;-)
7801
7802 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7803
7804         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7805         definitions, instead of doing that afterwards.  
7806
7807         Also we use a nice little hack, depending on the constructor, we
7808         know if we are a "composed" name or a simple name.  Hence, we
7809         avoid the IndexOf test, and we avoid 
7810
7811         * codegen.cs: Add code to assist in a bug reporter to track down
7812         the source of a compiler crash. 
7813
7814 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7815
7816         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7817         types have been emitted for a given element and flag an error
7818         if something which does not have AllowMultiple set is used more
7819         than once.
7820
7821         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7822         attribute types and their corresponding AllowMultiple properties
7823
7824         (AreMultipleAllowed): Check the property for a given type.
7825
7826         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7827         property in the case we have a TypeContainer.
7828
7829         (Attributes.AddAttribute): Detect duplicates and just skip on
7830         adding them. This trivial fix catches a pretty gross error in our
7831         attribute emission - global attributes were being emitted twice!
7832
7833         Bugzilla bug #33187 is now fixed.
7834
7835 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7836
7837         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7838         instead of pp_and).
7839
7840         * expression.cs (Binary.ResolveOperator): I can only use the
7841         Concat (string, string, string) and Concat (string, string,
7842         string, string) if the child is actually a concatenation of
7843         strings. 
7844
7845 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7846
7847         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7848         context where we need a 2-character lookahead.
7849
7850         * pending.cs (PendingImplementation): Rework so we can keep track
7851         of interface types all the time, and flag those which were
7852         implemented by parents as optional.
7853
7854 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7855
7856         * expression.cs (Binary.ResolveOperator): Use
7857         String.Concat(string,string,string) or
7858         String.Concat(string,string,string,string) when possible. 
7859
7860         * typemanager: More helper methods.
7861
7862
7863 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7864
7865         * pending.cs: remove the bogus return from GetMissingInterfaces()
7866         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7867
7868 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7869
7870         * namespace.cs: avoid duplicated 'using xxx' being added to
7871         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7872         when we get more than one 'using' statement for the same namespace.
7873         Report a CS0105 warning for it.
7874
7875 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7876
7877         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7878         of calling getChar/putback, uses internal knowledge of it.    
7879
7880         (xtoken): Reorder tokenizer so most common patterns are checked
7881         first.  This reduces the compilation time in another 5% (from 8.11s
7882         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7883
7884         The parsing time is 22% of the compilation in mcs, and from that
7885         64% is spent on the tokenization process.  
7886
7887         I tried using a binary search for keywords, but this is slower
7888         than the hashtable.  Another option would be to do a couple of
7889         things:
7890
7891                 * Not use a StringBuilder, instead use an array of chars,
7892                   with a set value.  Notice that this way we could catch
7893                   the 645 error without having to do it *afterwards*.
7894
7895                 * We could write a hand-parser to avoid the hashtable
7896                   compares altogether.
7897
7898         The identifier consumption process takes 37% of the tokenization
7899         time.  Another 15% is spent on is_number.  56% of the time spent
7900         on is_number is spent on Int64.Parse:
7901
7902                 * We could probably choose based on the string length to
7903                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7904                   computations. 
7905
7906         Another 3% is spend on wrapping `xtoken' in the `token' function.
7907
7908         Handle 0xa0 as whitespace (#34752)
7909
7910 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7911
7912         * typemanager.cs (IsCLRType): New routine to tell whether a type
7913         is one of the builtin types.  
7914
7915         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7916         typecode in more places instead of doing pointer comparissions.
7917         We could leverage some knowledge about the way the typecodes are
7918         laid out.
7919
7920         New code to cache namespaces in assemblies, it is currently not
7921         invoked, to be used soon.
7922
7923         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7924
7925         * expression.cs (Binary.ResolveOperator): specially handle
7926         strings, and do not perform user-defined operator overloading for
7927         built-in types.
7928
7929 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7930
7931         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7932         internalcall as it is a pretty simple operation;  Avoid whenever
7933         possible to call Char.IsLetter.
7934
7935         (consume_identifier): Cut by half the number of
7936         hashtable calls by merging the is_keyword and GetKeyword behavior.
7937
7938         Do not short-circuit, because if we do, we
7939         report errors (ie, #if false && true would produce an invalid
7940         directive error);
7941
7942
7943 2002-11-24  Martin Baulig  <martin@ximian.com>
7944
7945         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7946         check constant ranges and report a CS0221.  Fixes #33186.
7947
7948 2002-11-24  Martin Baulig  <martin@ximian.com>
7949
7950         * cs-parser.jay: Make this work for uninitialized variable
7951         declarations in the `for' initializer.  Fixes #32416.
7952
7953 2002-11-24  Martin Baulig  <martin@ximian.com>
7954
7955         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7956         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7957
7958 2002-11-24  Martin Baulig  <martin@ximian.com>
7959
7960         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7961         argument; if true, we also check for user-defined conversions.
7962         This is only needed if both arguments are of a user-defined type.
7963         Fixes #30443, added test-175.cs.
7964         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7965
7966         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7967
7968 2002-11-24  Martin Baulig  <martin@ximian.com>
7969
7970         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7971         function to get the store opcode.
7972         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7973         only emit the Ldelema if the store opcode is Stobj.  You must run
7974         both test-34 and test-167 to test this.  Fixes #34529.
7975
7976 2002-11-23  Martin Baulig  <martin@ximian.com>
7977
7978         * ecore.cs (Expression.MemberLookup): Added additional
7979         `qualifier_type' argument which is used when we're being called
7980         from MemberAccess.DoResolve() and null if we're called from a
7981         SimpleName lookup.
7982         (Expression.MemberLookupFailed): New method to report errors; this
7983         does the CS1540 check and reports the correct error message.
7984
7985         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7986         argument for the CS1540 check and redone the way how we're dealing
7987         with private members.  See the comment in the source code for details.
7988         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7989         `closure_start_type' to `closure_qualifier_type' and check whether
7990         it's not null.  It was not this filter being broken, it was just
7991         being called with the wrong arguments.
7992
7993         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7994         and pass it the correct `qualifier_type'; this also does the error
7995         handling for us.
7996
7997 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7998
7999         * expression.cs (Invocation.EmitParams): If the we are dealing
8000         with a non-built-in value type, load its address as well.
8001
8002         (ArrayCreation): Use a a pretty constant instead
8003         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8004         static initializers.  
8005
8006         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8007         because they are not really value types, just glorified integers. 
8008
8009         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8010
8011         * ecore.cs: Remove redundant code for enumerations, make them use
8012         the same code path as everything else, fixes the casting issue
8013         with enumerations in Windows.Forms.
8014
8015         * attribute.cs: Do only cast to string if it is a string, the
8016         validation happens later.
8017
8018         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8019         people upgrade their corlibs.
8020
8021         * ecore.cs: Oops, enumerations were not following the entire code path
8022
8023 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8024
8025         * typemanager.cs (FilterWithClosure): Commented out the test for
8026         1540 in typemanager.cs, as it has problems when accessing
8027         protected methods from a parent class (see test-174.cs). 
8028
8029         * attribute.cs (Attribute.ValidateGuid): new method.
8030         (Attribute.Resolve): Use above.
8031
8032 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8033
8034         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8035
8036         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8037         handling for enumerations, as we only needed the TypeContainer
8038         functionality to begin with (this is required for the fix below to
8039         work for enums that reference constants in a container class for
8040         example). 
8041
8042         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8043
8044         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8045         a valid TypeBuilder to perform lookups on.o
8046
8047         * class.cs (InheritableMemberSignatureCompare): Use true in the
8048         call to GetGetMethod and GetSetMethod, because we are comparing
8049         the signature, and we need to get the methods *even* if they are
8050         private. 
8051
8052         (PropertyBase.CheckBase): ditto.
8053
8054         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8055         GotoCase.Resolve): Use Peel on EmpytCasts.
8056
8057         * ecore.cs (EmptyCast): drop child, add Peel method.
8058
8059 2002-11-17  Martin Baulig  <martin@ximian.com>
8060
8061         * ecore.cs (EmptyCast.Child): New public property.
8062
8063         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8064         label resolved to an EmptyCast.  Fixes #34162.
8065         (GotoCase.Resolve): Likewise.
8066         (Block.EmitMeta): Likewise.
8067
8068 2002-11-17  Martin Baulig  <martin@ximian.com>
8069
8070         * expression.cs (Invocation.BetterConversion): Prefer int over
8071         uint; short over ushort; long over ulong for integer literals.
8072         Use ImplicitConversionExists instead of StandardConversionExists
8073         since we also need to check for user-defined implicit conversions.
8074         Fixes #34165.  Added test-173.cs.
8075
8076 2002-11-16  Martin Baulig  <martin@ximian.com>
8077
8078         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8079         with the `true' and `false' literals.  Fixes #33151.
8080
8081 2002-11-16  Martin Baulig  <martin@ximian.com>
8082
8083         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8084         October 22nd; don't do the cs1540 check for static members.
8085
8086         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8087         now using our own filter here and doing the cs1540 check again.
8088
8089 2002-11-16  Martin Baulig  <martin@ximian.com>
8090
8091         * support.cs (InternalParameters): Don't crash if we don't have
8092         any fixed parameters.  Fixes #33532.
8093
8094 2002-11-16  Martin Baulig  <martin@ximian.com>
8095
8096         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8097         when looking up static methods to make this work on Windows.
8098         Fixes #33773.
8099
8100 2002-11-16  Martin Baulig  <martin@ximian.com>
8101
8102         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8103         a setter rather than using PropertyInfo.CanWrite.
8104
8105 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8106
8107         * class.cs: Allow acces to block member by subclasses. Fixes build
8108         breaker.
8109
8110 2002-11-14  Martin Baulig  <martin@ximian.com>
8111
8112         * class.cs (Constructor.Emit): Added the extern/block check.
8113         Fixes bug #33678.
8114
8115 2002-11-14  Martin Baulig  <martin@ximian.com>
8116
8117         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8118         iteration while looking for indexers, this is needed because the
8119         indexer may have a different name in our base classes.  Fixed the
8120         error reporting (no indexers at all, not get accessor, no
8121         overloaded match).  Fixes bug #33089.
8122         (IndexerAccess.DoResolveLValue): Likewise.
8123
8124 2002-11-14  Martin Baulig  <martin@ximian.com>
8125
8126         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8127         indexers.  Fixes the first part of bug #33089.
8128         (MethodSignature.InheritableMemberSignatureCompare): Added support
8129         for properties.
8130
8131 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8132
8133         * attribute.cs (Attribute.Resolve): Catch the
8134         NullReferenceException and report it since it isn't supposed to
8135         happen. 
8136
8137 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8138
8139         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8140         LogicalOr and LogicalAnd that can benefit from recursively
8141         handling EmitBranchable.  The code now should be nice for Paolo.
8142
8143 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8144
8145         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8146         the Type lookups, as we perform quite a number of lookups on
8147         non-Types.  This can be removed once we can deterministically tell
8148         whether we have a type or a namespace in advance.
8149
8150         But this might require special hacks from our corlib.
8151
8152         * TODO: updated.
8153
8154         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8155         and double which avoids a conversion from an integer to a double.
8156
8157         * expression.cs: tiny optimization, avoid calling IsConstant,
8158         because it effectively performs the lookup twice.
8159
8160 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8161
8162         But a bogus return here to keep the semantics of the old code
8163         until the Mono runtime is fixed.
8164
8165         * pending.cs (GetMissingInterfaces): New method used to remove all
8166         the interfaces that are already implemented by our parent
8167         classes from the list of pending methods. 
8168
8169         * interface.cs: Add checks for calls after ResolveTypeExpr.
8170
8171 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8172
8173         * class.cs (Class.Emit): Report warning 67: event not used if the
8174         warning level is beyond 3.
8175
8176         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8177         being a NullLiteral.
8178
8179         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8180         specifiers. 
8181
8182         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8183         path that might fail if a type can not be resolved.
8184
8185         * expression.cs (Binary.Emit): Emit unsigned versions of the
8186         operators. 
8187
8188         * driver.cs: use error 5.
8189
8190 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8191
8192         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8193
8194 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8195
8196         * cs-parser.jay (switch_section): A beautiful patch from Martin
8197         Baulig that fixed 33094.
8198
8199 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8200
8201         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8202         Check whether the base is abstract and report an error if so.
8203
8204         * expression.cs (IndexerAccess.DoResolveLValue,
8205         IndexerAccess.DoResolve): ditto. 
8206
8207         (Invocation.DoResolve): ditto.
8208
8209         (Invocation.FullMethodDesc): Improve the report string.
8210
8211         * statement.cs (Block): Eliminate IsVariableDefined as it is
8212         basically just a wrapper for GetVariableInfo.
8213
8214         * ecore.cs (SimpleName): Use new 
8215
8216         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8217         type, as we return the actual parameter ref/unref state on a
8218         different call.
8219
8220 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8221
8222         * support.cs: Return proper flags REF/OUT fixing the previous
8223         commit.  
8224
8225         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8226         not used to mean `ref' but `ref or out' in ParameterReference
8227
8228         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8229         full type signature instead of calling TypeManger.CSharpName
8230         ourselves. 
8231
8232         * support.cs (InternalParameters.ParameterDesc): Do not compare
8233         directly to the modflags, because REF/OUT will actually be bitsets
8234         if set. 
8235
8236         * delegate.cs (VerifyMethod): Check also the modifiers.
8237
8238         * cs-tokenizer.cs: Fix bug where floating point values with an
8239         exponent where a sign was missing was ignored.
8240
8241         * driver.cs: Allow multiple assemblies to be specified in a single
8242         /r: argument
8243
8244 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8245
8246         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8247         because identifiers after a parenthesis would end up in this kind
8248         of production, and we needed to desamiguate it for having casts
8249         like:
8250
8251                 (UserDefinedType *) xxx
8252
8253 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8254
8255         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8256         we should set on the Bindingflags.NonPublic, but not turn on
8257         private_ok.  private_ok controls whether a Private member is
8258         returned (this is chekced on the filter routine), while the
8259         BindingFlags.NonPublic just controls whether private/protected
8260         will be allowed.   This fixes the problem part of the problem of
8261         private properties being allowed to be used in derived classes.
8262
8263         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8264         so we can call the children DoResolveLValue method (this will
8265         properly signal errors on lvalue assignments to base properties)
8266
8267         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8268         getter are null, and we have a property info, we know that this
8269         happened because the lookup failed, so we report an error 122 for
8270         protection level violation.
8271
8272         We also silently return if setter and getter are null in the
8273         resolve functions, this condition only happens if we have flagged
8274         the error before.  This is the other half of the problem. 
8275
8276         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8277         not have accessibility information, that is why we were returning
8278         true in the filter function in typemanager.cs.
8279
8280         To properly report 122 (property is inaccessible because of its
8281         protection level) correctly, we report this error in ResolveAccess
8282         by failing if both the setter and the getter are lacking (ie, the
8283         lookup failed). 
8284
8285         DoResolve and DoLResolve have been modified to check for both
8286         setter/getter being null and returning silently, the reason being
8287         that I did not want to put the knowledge about this error in upper
8288         layers, like:
8289
8290         int old = Report.Errors;
8291         x = new PropertyExpr (...);
8292         if (old != Report.Errors)
8293                 return null;
8294         else
8295                 return x;
8296
8297         So the property expr is returned, but it is invalid, so the error
8298         will be flagged during the resolve process. 
8299
8300         * class.cs: Remove InheritablePropertySignatureCompare from the
8301         class, as we no longer depend on the property signature to compute
8302         whether it is possible to implement a method or not.
8303
8304         The reason is that calling PropertyInfo.GetGetMethod will return
8305         null (in .NET, in Mono it works, and we should change this), in
8306         cases where the Get Method does not exist in that particular
8307         class.
8308
8309         So this code:
8310
8311         class X { public virtual int A { get { return 1; } } }
8312         class Y : X { }
8313         class Z : Y { public override int A { get { return 2; } } }
8314
8315         Would fail in Z because the parent (Y) would not have the property
8316         defined.  So we avoid this completely now (because the alternative
8317         fix was ugly and slow), and we now depend exclusively on the
8318         method names.
8319
8320         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8321         reference method, instead of using the property.
8322
8323         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8324         routines are gone now.
8325
8326         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8327         names, they were incorrectly named.
8328
8329         * cs-tokenizer.cs: Return are more gentle token on failure. 
8330
8331         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8332         had an out-of-sync index variable, which caused it to remove from
8333         the list of pending methods the wrong method sometimes.
8334
8335 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8336
8337         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8338         CanWrite, because those refer to this particular instance of the
8339         property, and do not take into account the fact that we can
8340         override single members of a property.
8341
8342         Constructor requires an EmitContext.  The resolution process does
8343         not happen here, but we need to compute the accessors before,
8344         because the resolution does not always happen for properties.
8345
8346         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8347         subclass, before we did not update this flag, but we did update
8348         bindingflags. 
8349
8350         (GetAccessors): Drop this routine, as it did not work in the
8351         presence of partially overwritten set/get methods. 
8352
8353         Notice that this broke the cs1540 detection, but that will require
8354         more thinking. 
8355
8356 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8357
8358         * class.cs:
8359         * codegen.cs:
8360         * driver.cs: issue a warning instead of an error if we don't support
8361         debugging for the platform. Also ignore a couple of errors that may
8362         arise when trying to write the symbols. Undo my previous patch.
8363
8364 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8365
8366         * driver.cs: ignore /debug switch except for Unix platforms.
8367
8368 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8369
8370         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8371
8372 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8373
8374         * driver.cs: Do not make mcs-debug conditional, so we do not break
8375         builds that use it.
8376
8377         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8378         review this patch.  But basically after all the children variables
8379         have been merged, the value of "Breaks" was not being set to
8380         new_breaks for Switch blocks.  I think that it should be set after
8381         it has executed.  Currently I set this to the value of new_breaks,
8382         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8383         conservative, but I do not understand this code very well.
8384
8385         I did not break anything in the build, so that is good ;-)
8386
8387         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8388
8389 2002-10-20  Mark Crichton  <crichton@gimp.org>
8390
8391         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8392
8393 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8394
8395         * cfold.cs: Fixed compile blocker.
8396
8397 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8398
8399         * driver.cs: I was chekcing the key, not the file.
8400
8401 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8402
8403         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8404         message that we were generating - we just need to silently return
8405         a null.
8406
8407 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8408
8409         * class.cs (Event.Define): Change my previous commit, as this
8410         breaks the debugger.  This is a temporary hack, as it seems like
8411         the compiler is generating events incorrectly to begin with.
8412
8413         * expression.cs (Binary.ResolveOperator): Added support for 
8414         "U operator - (E x, E y)"
8415
8416         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8417         y)".
8418
8419         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8420         init-only variables, but this path did not take into account that
8421         there might be also instance readonly variables.  Correct this
8422         problem. 
8423
8424         This fixes bug 32253
8425
8426         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8427         delegates as well.
8428
8429         * driver.cs: Change the extension for modules to `netmodule'
8430
8431         * cs-parser.jay: Improved slightly the location tracking for
8432         the debugger symbols.
8433
8434         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8435         modifiers that were specified instead of the hardcoded value
8436         (FamAndAssem).  This was basically ignoring the static modifier,
8437         and others.  Fixes 32429.
8438
8439         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8440         fixed a bug in the process (32476)
8441
8442         * expression.cs (ArrayAccess.EmitAssign): Patch from
8443         hwang_rob@yahoo.ca that fixes bug 31834.3
8444
8445 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8446
8447         * driver.cs: Make the module extension .netmodule.
8448
8449 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8450
8451         * driver.cs: Report an error if the resource file is not found
8452         instead of crashing.
8453
8454         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8455         false, like Emit does.
8456
8457 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8458
8459         * typemanager.cs: Remove unused private member.  Also reported mcs
8460         bug to report this as a warning like csc.
8461
8462 2002-10-15  Martin Baulig  <martin@gnome.org>
8463
8464         * statement.cs (Statement.Emit): Made this a virtual method; emits
8465         the line number info and calls DoEmit().
8466         (Statement.DoEmit): New protected abstract method, formerly knows
8467         as Statement.Emit().
8468
8469         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8470
8471 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8472
8473         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8474         have fixed a remaining problem: not every AddXXXX was adding a
8475         fully qualified name.  
8476
8477         Now everyone registers a fully qualified name in the DeclSpace as
8478         being defined instead of the partial name.  
8479
8480         Downsides: we are slower than we need to be due to the excess
8481         copies and the names being registered this way.  
8482
8483         The reason for this is that we currently depend (on the corlib
8484         bootstrap for instance) that types are fully qualified, because
8485         we dump all the types in the namespace, and we should really have
8486         types inserted into the proper namespace, so we can only store the
8487         basenames in the defined_names array.
8488
8489 2002-10-10  Martin Baulig  <martin@gnome.org>
8490
8491         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8492         from bug #31834, see the bug report for a testcase which is
8493         miscompiled.
8494
8495 2002-10-10  Martin Baulig  <martin@gnome.org>
8496
8497         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8498         flow analysis code for this.
8499
8500         * statement.cs (Do, While, For): Tell the flow analysis code about
8501         infinite loops.
8502         (FlowBranching.UsageVector): Added support for infinite loops.
8503         (Block.Resolve): Moved the dead code elimination here and use flow
8504         analysis to do it.
8505
8506 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8507
8508         * class.cs (Field.Define): Catch cycles on struct type
8509         definitions. 
8510
8511         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8512         fields if the fields are static.  We only need to check instance
8513         fields. 
8514
8515         * expression.cs (As.DoResolve): Test for reference type.
8516
8517         * statement.cs (Using.ResolveExpression): Use
8518         ConvertImplicitRequired, not ConvertImplicit which reports an
8519         error on failture
8520         (Using.ResolveLocalVariableDecls): ditto.
8521
8522         * expression.cs (Binary.ResolveOperator): Report errors in a few
8523         places where we had to.
8524
8525         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8526
8527 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8528
8529         * expression.cs: Use StoreFromPtr instead of extracting the type
8530         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8531
8532         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8533         an enumeration value to a System.Enum, but System.Enum is not a
8534         value type, but an class type, so we need to box.
8535
8536         (Expression.ConvertExplicit): One codepath could return
8537         errors but not flag them.  Fix this.  Fixes #31853
8538
8539         * parameter.cs (Resolve): Do not allow void as a parameter type.
8540
8541 2002-10-06  Martin Baulig  <martin@gnome.org>
8542
8543         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8544         if it's a class type and not a struct.  Fixes #31815.
8545
8546 2002-10-06  Martin Baulig  <martin@gnome.org>
8547
8548         * statement.cs: Reworked the flow analysis code a bit to make it
8549         usable for dead code elimination.
8550
8551 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8552
8553         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8554
8555 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8556
8557         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8558         to fix the test 165, will investigate deeper.
8559
8560 2002-10-04  Martin Baulig  <martin@gnome.org>
8561
8562         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8563         finally blocks actually work.
8564         (Try.Resolve): We don't need to create a sibling for `finally' if
8565         there is no finally block.
8566
8567 2002-10-04  Martin Baulig  <martin@gnome.org>
8568
8569         * class.cs (Constructor.Define): The default accessibility for a
8570         non-default constructor is private, not public.
8571
8572 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8573
8574         * class.cs (Constructor): Make AllowedModifiers public, add
8575         EXTERN.
8576
8577         * cs-parser.jay: Perform the modifiers test here, as the
8578         constructor for the Constructor class usually receives a zero
8579         because of the way we create it (first we create, later we
8580         customize, and we were never checking the modifiers).
8581
8582         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8583         is a version of LookupTypeReflection that includes the type-name
8584         cache.  This can be used as a fast path for functions that know
8585         the fully qualified name and are only calling into *.GetType() to
8586         obtain a composed type.
8587
8588         This is also used by TypeManager.LookupType during its type
8589         composition.
8590
8591         (LookupType): We now also track the real type name, as sometimes
8592         we can get a quey for the real type name from things like
8593         ComposedCast.  This fixes bug 31422.
8594
8595         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8596         complete type fullname, it does not have to go through the type
8597         resolution system to obtain the composed version of the type (for
8598         obtaining arrays or pointers).
8599
8600         (Conditional.Emit): Use the EmitBoolExpression to
8601         generate nicer code, as requested by Paolo.
8602
8603         (ArrayCreation.CheckIndices): Use the patch from
8604         hwang_rob@yahoo.ca to validate the array initializers. 
8605
8606 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8607
8608         * class.cs (ConstructorInitializer.Emit): simplify code by using
8609         Invocation.EmitCall, and at the same time, fix the bugs in calling
8610         parent constructors that took variable arguments. 
8611
8612         * ecore.cs (Expression.ConvertNumericExplicit,
8613         Expression.ImplicitNumericConversion): Remove the code that
8614         manually wrapped decimal (InternalTypeConstructor call is now gone
8615         as well).
8616
8617         * expression.cs (Cast.TryReduce): Also handle decimal types when
8618         trying to perform a constant fold on the type.
8619
8620         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8621
8622         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8623         that only turned off an error report, and did nothing else. 
8624
8625 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8626
8627         * driver.cs: Handle and ignore /fullpaths
8628
8629 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8630
8631         * expression.cs (Binary.ResolveOperator): Catch the case where
8632         DoNumericPromotions returns true, 
8633
8634         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8635
8636 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8637
8638         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8639         report error 70.
8640
8641 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8642
8643         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8644         conversion exists, but it is also required that the conversion be
8645         performed.  This manifested in "(Type64Enum) 2".  
8646
8647         * class.cs (TypeManager.AddMethod): The fix is not to change
8648         AddEnum, because that one was using a fully qualified name (every
8649         DeclSpace derivative does), but to change the AddMethod routine
8650         that was using an un-namespaced name.  This now correctly reports
8651         the duplicated name.
8652
8653         Revert patch until I can properly fix it.  The issue
8654         is that we have a shared Type space across all namespaces
8655         currently, which is wrong.
8656
8657         Options include making the Namespace a DeclSpace, and merge
8658         current_namespace/current_container in the parser.
8659
8660 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8661
8662         * cs-parser.jay: Improve error reporting when we get a different
8663         kind of expression in local_variable_type and
8664         local_variable_pointer_type. 
8665
8666         Propagate this to avoid missleading errors being reported.
8667
8668         * ecore.cs (ImplicitReferenceConversion): treat
8669         TypeManager.value_type as a target just like object_type.   As
8670         code like this:
8671
8672         ValueType v = 1;
8673
8674         Is valid, and needs to result in the int 1 being boxed before it
8675         is assigned to the value type v.
8676
8677         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8678         to validate the enumeration name.
8679
8680         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8681         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8682         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8683
8684         * ecore.cs (TryImplicitIntConversion): When doing an
8685         implicit-enumeration-conversion, check if the type is 64-bits and
8686         perform a conversion before passing to EnumConstant.
8687
8688 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8689
8690         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8691         report ambiguous type references.  Unlike the MS version, we
8692         report what the ambiguity is.   Innovation at work ;-)
8693
8694         (DeclSpace.FindType): Require a location argument to
8695         display when we display an ambiguous error.
8696
8697         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8698
8699         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8700
8701         * expression.cs (EmitDynamicInitializers): Apply patch from
8702         hwang_rob@yahoo.ca that fixes the order in which we emit our
8703         initializers. 
8704
8705 2002-09-21  Martin Baulig  <martin@gnome.org>
8706
8707         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8708         delegate takes no arguments.
8709
8710 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8711
8712         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8713         from integers.
8714
8715         * expression.cs: Extract the underlying type.
8716
8717         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8718
8719         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8720
8721 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8722
8723         * class.cs (TypeContainer.DefineType): We can not use the nice
8724         PackingSize with the size set to 1 DefineType method, because it
8725         will not allow us to define the interfaces that the struct
8726         implements.
8727
8728         This completes the fixing of bug 27287
8729
8730         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8731         means also structs.  This fixes part of the problem. 
8732         (Expresion.ImplicitReferenceConversionExists): ditto.
8733
8734         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8735         error if there were no errors reported during the type lookup
8736         process, to avoid duplicates or redundant errors.  Without this
8737         you would get an ambiguous errors plus a type not found.  We have
8738         beaten the user enough with the first error.  
8739
8740         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8741         reference. 
8742
8743         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8744         during the resolution process, stop the lookup, this avoids
8745         repeated error reports (same error twice).
8746
8747         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8748
8749         * typemanager.cs (LookupType): Redo the type lookup code to match
8750         the needs of System.Reflection.  
8751
8752         The issue is that System.Reflection requires references to nested
8753         types to begin with a "+" sign instead of a dot.  So toplevel
8754         types look like: "NameSpace.TopLevelClass", and nested ones look
8755         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8756         levels. 
8757
8758 2002-09-19  Martin Baulig  <martin@gnome.org>
8759
8760         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8761         says that a method always returns or always throws an exception,
8762         don't report the CS0161.
8763
8764         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8765         set `Returns = new_returns'.
8766
8767 2002-09-19  Martin Baulig  <martin@gnome.org>
8768
8769         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8770         to an enum constant, check for a CS0176.
8771
8772 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8773
8774         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8775         for operators that must be in pairs and report errors.
8776
8777         * ecore.cs (SimpleName.DoResolveType): During the initial type
8778         resolution process, when we define types recursively, we must
8779         check first for types in our current scope before we perform
8780         lookups in the enclosing scopes.
8781
8782         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8783
8784         (Invocation.VerifyArgumentsCompat): Call
8785         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8786         I thought we were supposed to always call this, but there are a
8787         few places in the code where we dont do it.
8788
8789 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8790
8791         * driver.cs: Add support in -linkres and -resource to specify the
8792         name of the identifier.
8793
8794 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8795
8796         * ecore.cs (StandardConversionExists): Sync with the conversion
8797         code: allow anything-* to void* conversions.
8798
8799         (FindMostSpecificSource): Use an Expression argument
8800         instead of a Type, because we might be handed over a Literal which
8801         gets a few more implicit conversions that plain types do not.  So
8802         this information was being lost.
8803
8804         Also, we drop the temporary type-holder expression when not
8805         required.
8806
8807 2002-09-17  Martin Baulig  <martin@gnome.org>
8808
8809         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8810         this is an explicit interface implementation.
8811
8812 2002-09-17  Martin Baulig  <martin@gnome.org>
8813
8814         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8815         different `IndexerName' attributes.
8816
8817         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8818         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8819         virtual CommonResolve().
8820
8821 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8822
8823         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8824         and convert that to the UnderlyingType.
8825
8826         * statement.cs (Foreach.Resolve): Indexers are just like variables
8827         or PropertyAccesses.
8828
8829         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8830         inside quoted strings, we were not doing this before.
8831
8832 2002-09-16  Martin Baulig  <martin@gnome.org>
8833
8834         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8835         resolve it.  This is needed for the definite assignment check of the
8836         instance expression, fixes bug #29846.
8837         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8838
8839 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8840
8841         * parameter.cs: Fix compile error.  Cannot reference static member
8842         from an instance object.  Is this an mcs bug?
8843
8844 2002-09-14  Martin Baulig  <martin@gnome.org>
8845
8846         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8847         multiple times.  Fixes bug #30295, added test-166.cs.
8848
8849 2002-09-14  Martin Baulig  <martin@gnome.org>
8850
8851         * statement.cs (Block.Emit): Don't emit unreachable code.
8852         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8853         `break' statements.
8854         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8855
8856 2002-09-14  Martin Baulig  <martin@gnome.org>
8857
8858         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8859         is set.
8860
8861 2002-09-14  Martin Baulig  <martin@gnome.org>
8862
8863         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8864         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8865         be false on the ms runtime.
8866
8867 2002-09-13  Martin Baulig  <martin@gnome.org>
8868
8869         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8870         the CS0038 error message.
8871
8872 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8873
8874         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8875         constant inside, return it.
8876
8877 2002-09-12  Martin Baulig  <martin@gnome.org>
8878
8879         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8880         implicit conversion can be done between enum types.
8881
8882         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8883         check whether an implicit conversion to the current enum's UnderlyingType
8884         exists and report an error if not.
8885
8886         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8887         without debugging support.
8888
8889         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8890         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8891
8892 2002-09-12  Martin Baulig  <martin@gnome.org>
8893
8894         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8895
8896         * ecore.cs (IMemberExpr.DeclaringType): New property.
8897         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8898         nonstatic member of an outer type (CS0038).
8899
8900 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8901
8902         * driver.cs: Activate the using-error detector at warning level
8903         4 (at least for MS-compatible APIs).
8904
8905         * namespace.cs (VerifyUsing): Small buglett fix.
8906
8907         * pending.cs (PendingImplementation): pass the container pointer. 
8908
8909         * interface.cs (GetMethods): Allow for recursive definition.  Long
8910         term, I would like to move every type to support recursive
8911         definitions, not the current ordering mechanism that we have right
8912         now.
8913
8914         The situation is this: Attributes are handled before interfaces,
8915         so we can apply attributes to interfaces.  But some attributes
8916         implement interfaces, we will now handle the simple cases
8917         (recursive definitions will just get an error).  
8918
8919         * parameter.cs: Only invalidate types at the end if we fail to
8920         lookup all types.  
8921
8922 2002-09-09  Martin Baulig  <martin@gnome.org>
8923
8924         * ecore.cs (PropertyExpr.Emit): Also check for
8925         TypeManager.system_int_array_get_length so this'll also work when
8926         compiling corlib.  Fixes #30003.
8927
8928 2002-09-09  Martin Baulig  <martin@gnome.org>
8929
8930         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8931         and throw an exception if we can't get the type's size.  Fixed #30040,
8932         added test-165.cs.
8933
8934 2002-09-09  Martin Baulig  <martin@gnome.org>
8935
8936         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8937
8938         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8939         context.  Fixes bug #30027.
8940
8941         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8942         virtual functions.  Fixes bug #30043, added test-164.cs.
8943
8944 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8945
8946         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8947
8948 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8949
8950         * driver.cs: Use an object to get the windows codepage since it's not a
8951         static property.
8952
8953 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8954
8955         * statement.cs (For.Emit): for infinite loops (test == null)
8956         return whether there is a break inside, not always "true".
8957
8958         * namespace.cs (UsingEntry): New struct to hold the name of the
8959         using definition, the location where it is defined, and whether it
8960         has been used in a successful type lookup.
8961
8962         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8963         strings.
8964
8965         * decl.cs: ditto.
8966
8967 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8968
8969         * attribute.cs : Fix incorrect code which relied on catching
8970         a NullReferenceException to detect a null being passed in
8971         where an object was expected.
8972
8973 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8974
8975         * statement.cs (Try): flag the catch variable as assigned
8976
8977         * expression.cs (Cast): Simplified by using ResolveType instead of
8978         manually resolving.
8979
8980         * statement.cs (Catch): Fix bug by using ResolveType.
8981
8982 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8983
8984         * expression.cs (BetterConversion): Special case for when we have
8985         a NullLiteral as the argument and we have to choose between string
8986         and object types - we choose string the way csc does.
8987
8988         * attribute.cs (Attribute.Resolve): Catch the
8989         NullReferenceException and report error #182 since the Mono
8990         runtime no more has the bug and having this exception raised means
8991         we tried to select a constructor which takes an object and is
8992         passed a null.
8993
8994 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8995
8996         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8997         message (1502, 1503) when we can't locate a method after overload
8998         resolution. This is much more informative and closes the bug
8999         Miguel reported.
9000
9001         * interface.cs (PopulateMethod): Return if there are no argument
9002         types. Fixes a NullReferenceException bug.
9003
9004         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9005         expressions too. Previously we were checking only in one place for
9006         positional arguments leaving out named arguments.
9007
9008         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9009         type to the enum type is not allowed. Remove code corresponding to
9010         that.
9011
9012         (ConvertNumericExplicit): Allow explicit conversions from
9013         the underlying type to enum type. This precisely follows the spec
9014         and closes a bug filed by Gonzalo.
9015
9016 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9017
9018         * compiler.csproj:
9019         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9020
9021 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9022
9023         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9024         it was important that we stored the right value after the
9025         reduction in `converted'.
9026
9027 2002-09-04  Martin Baulig  <martin@gnome.org>
9028
9029         * location.cs (Location.SymbolDocument): Use full pathnames for the
9030         source files.
9031
9032 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9033
9034         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9035         of the expression resolve mechanism, because that will catch the
9036         SimpleName error failures.
9037
9038         (Conditional): If we can not resolve the
9039         expression, return, do not crash.
9040
9041 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9042
9043         * cs-tokenizer.cs:
9044         (location): display token name instead of its number.
9045
9046 2002-08-28  Martin Baulig  <martin@gnome.org>
9047
9048         * expression.cs (Binary.ResolveOperator): Don't silently return
9049         but return an error if an operator cannot be applied between two
9050         enum types.
9051
9052 2002-08-28  Martin Baulig  <martin@gnome.org>
9053
9054         * class.cs (Constructor.Define): Set the permission attributes
9055         correctly instead of making all constructors public.
9056
9057 2002-08-28  Martin Baulig  <martin@gnome.org>
9058
9059         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9060         for private members before reporting a CS0103; if we find anything,
9061         it's a CS0122.
9062
9063 2002-08-28  Martin Baulig  <martin@gnome.org>
9064
9065         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9066         to check whether `closure_start_type == closure_invocation_type',
9067         we also need to check whether `m.DeclaringType == closure_invocation_type'
9068         before bypassing the permission checks.  We might be accessing
9069         protected/private members from the base class.
9070         (TypeManager.RealMemberLookup): Only set private_ok if private
9071         members were requested via BindingFlags.NonPublic.
9072
9073         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9074
9075         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9076         MethodGroupExpr.IsExplicitImpl if appropriate.
9077         (Invocation.DoResolve): Don't report the CS0120 for explicit
9078         interface implementations.
9079
9080 2002-08-27  Martin Baulig  <martin@gnome.org>
9081
9082         * expression.cs (Invocation.DoResolve): If this is a static
9083         method and we don't have an InstanceExpression, we must report
9084         a CS0120.
9085
9086 2002-08-25  Martin Baulig  <martin@gnome.org>
9087
9088         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9089         `==' between a valuetype and an object.
9090
9091 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9092
9093         * ecore.cs (TypeExpr): Provide a ToString method.
9094
9095 2002-08-24  Martin Baulig  <martin@gnome.org>
9096
9097         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9098         now called proggie.dbg and it's a binary file.
9099
9100 2002-08-23  Martin Baulig  <martin@gnome.org>
9101
9102         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9103
9104 2002-08-23  Martin Baulig  <martin@gnome.org>
9105
9106         * struct.cs (MyStructInfo.ctor): Make this work with empty
9107         structs; it's not allowed to use foreach() on null.
9108
9109 2002-08-23  Martin Baulig  <martin@gnome.org>
9110
9111         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9112         writer the full pathname of the generated assembly.
9113
9114 2002-08-23  Martin Baulig  <martin@gnome.org>
9115
9116         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9117         A `finally' block never returns or breaks; improved handling of
9118         unreachable code.
9119
9120 2002-08-23  Martin Baulig  <martin@gnome.org>
9121
9122         * statement.cs (Throw.Resolve): Allow `throw null'.
9123
9124 2002-08-23  Martin Baulig  <martin@gnome.org>
9125
9126         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9127         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9128         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9129         MemberLookup would return a wrong event if this is an explicit
9130         interface implementation and the class has an event with the same
9131         name.
9132
9133 2002-08-23  Martin Baulig  <martin@gnome.org>
9134
9135         * statement.cs (Block.AddChildVariableNames): New public method.
9136         (Block.AddChildVariableName): Likewise.
9137         (Block.IsVariableNameUsedInChildBlock): Likewise.
9138         (Block.AddVariable): Check whether a variable name has already
9139         been used in a child block.
9140
9141         * cs-parser.jay (declare_local_variables): Mark all variable names
9142         from the current block as being used in a child block in the
9143         implicit block.
9144
9145 2002-08-23  Martin Baulig  <martin@gnome.org>
9146
9147         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9148         find the symbol writer.
9149
9150         * driver.cs: csc also allows the arguments to /define being
9151         separated by commas, not only by semicolons.
9152
9153 2002-08-23  Martin Baulig  <martin@gnome.org>
9154
9155         * interface.cs (Interface.GetMembers): Added static check for events.
9156
9157 2002-08-15  Martin Baulig  <martin@gnome.org>
9158
9159         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9160         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9161
9162         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9163         why the MethodData.EmitDestructor() change was necessary.
9164
9165 2002-08-20  Martin Baulig  <martin@gnome.org>
9166
9167         * class.cs (TypeContainer.FindMembers): Added static check for events.
9168
9169         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9170
9171         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9172         use Type.GetEvents(), not Type.FindMembers().
9173
9174 2002-08-20  Martin Baulig  <martin@gnome.org>
9175
9176         * decl.cs (MemberCache): Added a special method cache which will
9177         be used for method-only searched.  This ensures that a method
9178         search will return a MethodInfo with the correct ReflectedType for
9179         inherited methods.      
9180
9181 2002-08-20  Martin Baulig  <martin@gnome.org>
9182
9183         * decl.cs (DeclSpace.FindMembers): Made this public.
9184
9185 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9186
9187         * delegate.cs: fixed build on windows.
9188         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9189
9190 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9191
9192         * ecore.cs (StandardConversionExists): Return a false
9193         if we are trying to convert the void type to anything else
9194         since that is not allowed.
9195
9196         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9197         we flag error 70 in the event an event is trying to be accessed
9198         directly from outside the declaring type.
9199
9200 2002-08-20  Martin Baulig  <martin@gnome.org>
9201
9202         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9203         MemberCache from typemanager.cs to decl.cs.
9204
9205 2002-08-19  Martin Baulig  <martin@gnome.org>
9206
9207         * class.cs (TypeContainer): Implement IMemberContainer.
9208         (TypeContainer.DefineMembers): Create the MemberCache.
9209         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9210         return public members if BindingFlags.Public was given, check
9211         whether members are static.
9212
9213 2002-08-16  Martin Baulig  <martin@gnome.org>
9214
9215         * decl.cs (DeclSpace.Define): Splitted this in Define and
9216         DefineMembers.  DefineMembers is called first and initializes the
9217         MemberCache.
9218
9219         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9220         DefineMembers() on all our DeclSpaces.
9221
9222         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9223         but call DefineMembers() on all nested interfaces.  We call their
9224         Define() in our new Define() function.
9225
9226         * interface.cs (Interface): Implement IMemberContainer.
9227         (Interface.Define): Moved all code except the attribute stuf to
9228         DefineMembers().
9229         (Interface.DefineMembers): Initialize the member cache.
9230
9231         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9232         need this anymore since we can use MemberCache.FindMembers directly.
9233
9234 2002-08-19  Martin Baulig  <martin@gnome.org>
9235
9236         * typemanager.cs (MemberCache): When creating the cache for an
9237         interface type, add all inherited members.
9238         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9239         to `out bool used_cache' and documented it.
9240         (TypeManager.MemberLookup): If we already used the cache in the first
9241         iteration, we don't need to do the interfaces check.
9242
9243 2002-08-19  Martin Baulig  <martin@gnome.org>
9244
9245         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9246         here from IMemberFinder and don't implement this interface anymore.
9247         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9248
9249         * typemanager.cs (IMemberFinder): This interface is now only used by
9250         classes which actually support the member cache.
9251         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9252         since we only put DeclSpaces into this Hashtable.
9253         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9254         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9255
9256 2002-08-16  Martin Baulig  <martin@gnome.org>
9257
9258         * typemanager.cs (ICachingMemberFinder): Removed.
9259         (IMemberFinder.MemberCache): New property.
9260         (TypeManager.FindMembers): Merged this with RealFindMembers().
9261         This function will never be called from TypeManager.MemberLookup()
9262         so we can't use the cache here, just the IMemberFinder.
9263         (TypeManager.MemberLookup_FindMembers): Check whether the
9264         IMemberFinder has a MemberCache and call the cache's FindMembers
9265         function.
9266         (MemberCache): Rewrote larger parts of this yet another time and
9267         cleaned it up a bit.
9268
9269 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9270
9271         * driver.cs (LoadArgs): Support quoting.
9272
9273         (Usage): Show the CSC-like command line arguments.
9274
9275         Improved a few error messages.
9276
9277 2002-08-15  Martin Baulig  <martin@gnome.org>
9278
9279         * typemanager.cs (IMemberContainer.Type): New property.
9280         (IMemberContainer.IsInterface): New property.
9281
9282         The following changes are conditional to BROKEN_RUNTIME, which is
9283         defined at the top of the file.
9284
9285         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9286         class'es members, but add all members from TypeHandle.ObjectType
9287         if we're an interface.
9288         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9289         is the current type.
9290         (MemberCache.CacheEntry.Container): Removed this field.
9291         (TypeHandle.GetMembers): Include inherited members.
9292
9293 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9294
9295         * typemanager.cs: fixed compilation and added a comment on a field that
9296         is never used.
9297
9298 2002-08-15  Martin Baulig  <martin@gnome.org>
9299
9300         * class.cs (ConstructorInitializer.Resolve): In the
9301         Expression.MemberLookup call, use the queried_type as
9302         invocation_type.
9303
9304         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9305         declared' attribute, it's always true.
9306         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9307         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9308         temporary wrapper for FindMembers which tells MemberLookup whether
9309         members from the base classes are included in the return value.
9310         This will go away soon.
9311         (TypeManager.MemberLookup): Use this temporary hack here; once the
9312         new MemberCache is completed, we don't need to do the DeclaredOnly
9313         looping here anymore since the MemberCache will take care of this.
9314         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9315         (MemberCache): When creating the MemberCache for a class, get
9316         members from the current class and all its base classes.
9317         (MemberCache.CacheEntry.Container): New field.  This is a
9318         temporary hack until the Mono runtime is fixed to distinguish
9319         between ReflectedType and DeclaringType.  It allows us to use MCS
9320         with both the MS runtime and the unfixed Mono runtime without
9321         problems and without accecting performance.
9322         (MemberCache.SearchMembers): The DeclaredOnly looping from
9323         TypeManager.MemberLookup is now done here.      
9324
9325 2002-08-14  Martin Baulig  <martin@gnome.org>
9326
9327         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9328         Type.GetFields on dynamic types but get the fields from the
9329         corresponding TypeContainer.
9330         (MyStructInfo.GetStructInfo): Added check for enum types.
9331
9332         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9333         (MemberList.SyncRoot): Implemented.
9334         (TypeManager.FilterWithClosure): No need to check permissions if
9335         closure_start_type == closure_invocation_type, don't crash if
9336         closure_invocation_type is null.
9337
9338 2002-08-13  Martin Baulig  <martin@gnome.org>
9339
9340         Rewrote TypeContainer.FindMembers to use a member cache.  This
9341         gives us a speed increase of about 35% for the self-hosting MCS
9342         build and of about 15-20% for the class libs (both on GNU/Linux).
9343
9344         * report.cs (Timer): New class to get enhanced profiling.  This
9345         whole class is "TIMER" conditional since it remarkably slows down
9346         compilation speed.
9347
9348         * class.cs (MemberList): New class.  This is an IList wrapper
9349         which we're now using instead of passing MemberInfo[]'s around to
9350         avoid copying this array unnecessarily.
9351         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9352         (ICachingMemberFinder, IMemberContainer): New interface.
9353         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9354         has already been checked, otherwise use it for the name comparision.
9355         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9356         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9357         if possible.  Returns a MemberList, not a MemberInfo [].
9358         (TypeHandle): New class, implements IMemberContainer.  We create
9359         one instance of this class per type, it contains a MemberCache
9360         which is used to do the member lookups.
9361         (MemberCache): New class.  Each instance of this class contains
9362         all members of a type and a name-based hash table.
9363         (MemberCache.FindMembers): This is our new member lookup
9364         function.  First, it looks up all members of the requested name in
9365         the hash table.  Then, it walks this list and sorts out all
9366         applicable members and returns them.
9367
9368 2002-08-13  Martin Baulig  <martin@gnome.org>
9369
9370         In addition to a nice code cleanup, this gives us a performance
9371         increase of about 1.4% on GNU/Linux - not much, but it's already
9372         half a second for the self-hosting MCS compilation.
9373
9374         * typemanager.cs (IMemberFinder): New interface.  It is used by
9375         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9376         Enum, Delegate or Interface.
9377         (TypeManager.finder_to_member_finder): New PtrHashtable.
9378         (TypeManager.finder_to_container): Removed.
9379         (TypeManager.finder_to_delegate): Removed.
9380         (TypeManager.finder_to_interface): Removed.
9381         (TypeManager.finder_to_enum): Removed.
9382
9383         * interface.cs (Interface): Implement IMemberFinder.
9384
9385         * delegate.cs (Delegate): Implement IMemberFinder.
9386
9387         * enum.cs (Enum): Implement IMemberFinder.
9388
9389         * class.cs (TypeContainer): Implement IMemberFinder.
9390
9391 2002-08-12  Martin Baulig  <martin@gnome.org>
9392
9393         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9394
9395 2002-08-12  Martin Baulig  <martin@gnome.org>
9396
9397         * ecore.cs (ITypeExpression): New interface for expressions which
9398         resolve to a type.
9399         (TypeExpression): Renamed to TypeLookupExpression.
9400         (Expression.DoResolve): If we're doing a types-only lookup, the
9401         expression must implement the ITypeExpression interface and we
9402         call DoResolveType() on it.
9403         (SimpleName): Implement the new ITypeExpression interface.
9404         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9405         hack, the situation that we're only looking up types can't happen
9406         anymore when this method is called.  Moved the type lookup code to
9407         DoResolveType() and call it.
9408         (SimpleName.DoResolveType): This ITypeExpression interface method
9409         is now doing the types-only lookup.
9410         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9411         (ResolveFlags): Added MaskExprClass.
9412
9413         * expression.cs (MemberAccess): Implement the ITypeExpression
9414         interface.
9415         (MemberAccess.DoResolve): Added support for a types-only lookup
9416         when we're called via ITypeExpression.DoResolveType().
9417         (ComposedCast): Implement the ITypeExpression interface.
9418
9419         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9420         Expression.Resolve() with ResolveFlags.Type instead.
9421
9422 2002-08-12  Martin Baulig  <martin@gnome.org>
9423
9424         * interface.cs (Interface.Define): Apply attributes.
9425
9426         * attribute.cs (Attribute.ApplyAttributes): Added support for
9427         interface attributes.
9428
9429 2002-08-11  Martin Baulig  <martin@gnome.org>
9430
9431         * statement.cs (Block.Emit): Only check the "this" variable if we
9432         do not always throw an exception.
9433
9434         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9435         whether the property has a set accessor.
9436
9437 2002-08-11  Martin Baulig  <martin@gnome.org>
9438
9439         Added control flow analysis support for structs.
9440
9441         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9442         with control flow analysis turned off.
9443         (IVariable): New interface.
9444         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9445         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9446         (FieldExpr.DoResolve): Resolve the instance expression with flow
9447         analysis turned off and do the definite assignment check after the
9448         resolving when we know what the expression will resolve to.
9449
9450         * expression.cs (LocalVariableReference, ParameterReference):
9451         Implement the new IVariable interface, only call the flow analysis
9452         code if ec.DoFlowAnalysis is true.
9453         (This): Added constructor which takes a Block argument.  Implement
9454         the new IVariable interface.
9455         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9456         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9457         This does the definite assignment checks for struct members.
9458
9459         * class.cs (Constructor.Emit): If this is a non-static `struct'
9460         constructor which doesn't have any initializer, call
9461         Block.AddThisVariable() to tell the flow analysis code that all
9462         struct elements must be initialized before control returns from
9463         the constructor.
9464
9465         * statement.cs (MyStructInfo): New public class.
9466         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9467         argument to this indexer.  If non-zero, check an individual struct
9468         member, not the whole struct.
9469         (FlowBranching.CheckOutParameters): Check struct members.
9470         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9471         overloaded versions of these methods which take an additional
9472         `int field_idx' argument to check struct members.
9473         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9474         overloaded versions of these methods which take an additional
9475         `string field_name' argument to check struct member.s
9476         (VariableInfo): Implement the IVariable interface.
9477         (VariableInfo.StructInfo): New public property.  Returns the
9478         MyStructInfo instance of the variable if it's a struct or null.
9479         (Block.AddThisVariable): New public method.  This is called from
9480         Constructor.Emit() for non-static `struct' constructor which do
9481         not have any initializer.  It creates a special variable for the
9482         "this" instance variable which will be checked by the flow
9483         analysis code to ensure that all of the struct's fields are
9484         initialized before control returns from the constructor.
9485         (UsageVector): Added support for struct members.  If a
9486         variable/parameter is a struct with N members, we reserve a slot
9487         in the usage vector for each member.  A struct is considered fully
9488         initialized if either the struct itself (slot 0) or all its
9489         members are initialized.
9490
9491 2002-08-08  Martin Baulig  <martin@gnome.org>
9492
9493         * driver.cs (Driver.MainDriver): Only report an error CS5001
9494         if there were no compilation errors.
9495
9496         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9497         `UnsafeContext' property to determine whether the parent is in
9498         unsafe context rather than checking the parent's ModFlags:
9499         classes nested in an unsafe class are unsafe as well.
9500
9501 2002-08-08  Martin Baulig  <martin@gnome.org>
9502
9503         * statement.cs (UsageVector.MergeChildren): Distinguish between
9504         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9505         we return.  Added test17() and test18() to test-154.cs.
9506
9507 2002-08-08  Martin Baulig  <martin@gnome.org>
9508
9509         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9510         Family access, make sure the invoking type isn't a subclass of the
9511         queried type (that'd be a CS1540).
9512
9513         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9514         this method which takes an additional `Type invocation_type'.
9515
9516         * expression.cs (BaseAccess.DoResolve): Use the base type as
9517         invocation and query type.
9518         (MemberAccess.DoResolve): If the lookup failed and we're about to
9519         report a CS0122, try a lookup with the ec.ContainerType - if this
9520         succeeds, we must report a CS1540.
9521
9522 2002-08-08  Martin Baulig  <martin@gnome.org>
9523
9524         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9525         (MethodGroupExpr): Implement the IMemberExpr interface.
9526
9527         * expression (MemberAccess.ResolveMemberAccess): No need to have
9528         any special code for MethodGroupExprs anymore, they're now
9529         IMemberExprs.   
9530
9531 2002-08-08  Martin Baulig  <martin@gnome.org>
9532
9533         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9534         Family, FamANDAssem and FamORAssem permissions.
9535         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9536
9537 2002-08-08  Martin Baulig  <martin@gnome.org>
9538
9539         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9540         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9541         or loop block.
9542
9543 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9544
9545         * driver.cs: implemented /resource option to embed managed resources.
9546
9547 2002-08-07  Martin Baulig  <martin@gnome.org>
9548
9549         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9550         (FieldBase.HasFieldInitializer): New public property.
9551         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9552         returns the field initializer and makes sure it is only resolved once.
9553         (TypeContainer.EmitFieldInitializers): Call
9554         FieldBase.GetInitializerExpression to get the initializer, this ensures
9555         that it isn't resolved multiple times.
9556
9557         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9558         the resolving process (SimpleName/MemberLookup) that we're currently
9559         emitting a field initializer (which must not access any instance members,
9560         this is an error CS0236).
9561
9562         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9563         argument, if the `IsFieldInitializer' flag is set, we must report and
9564         error CS0236 and not an error CS0120.   
9565
9566 2002-08-07  Martin Baulig  <martin@gnome.org>
9567
9568         * ecore.cs (IMemberExpr): New public interface.
9569         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9570         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9571         if the expression is an IMemberExpr.
9572
9573         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9574         to be null, implicitly default to `this' if we're non-static in
9575         this case.  Simplified the code a lot by using the new IMemberExpr
9576         interface.  Also fixed bug #28176 here.
9577
9578 2002-08-06  Martin Baulig  <martin@gnome.org>
9579
9580         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9581         ParameterReferences during semantic analysis so that we can do a
9582         type-only search when resolving Cast, TypeOf and SizeOf.
9583         (block): Pass the `current_local_parameters' to the Block's
9584         constructor.
9585
9586         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9587         argument to the constructor.
9588         (ConstructorInitializer.Resolve): Create a temporary implicit
9589         block with the parameters.
9590
9591         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9592         references here if we aren't doing a type-only search.
9593
9594         * statement.cs (Block): Added constructor which takes a
9595         `Parameters parameters' argument.
9596         (Block.Parameters): New public property.
9597
9598         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9599         to `Parameters' and made it public readonly.
9600
9601 2002-08-06  Martin Baulig  <martin@gnome.org>
9602
9603         * ecore.cs (Expression.Warning): Made this public as well.
9604
9605         * report.cs (Report.Debug): Print the contents of collections.
9606
9607 2002-08-06  Martin Baulig  <martin@gnome.org>
9608
9609         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9610         used to tell Resolve() which kinds of expressions it may return.
9611         (Expression.Resolve): Added overloaded version of this method which
9612         takes a `ResolveFlags flags' argument.  This can be used to tell
9613         Resolve() which kinds of expressions it may return.  Reports a
9614         CS0118 on error.
9615         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9616         ResolveFlags.SimpleName.
9617         (Expression.Error118): Added overloaded version of this method which
9618         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9619         which kinds of expressions are allowed.
9620
9621         * expression.cs (Argument.ResolveMethodGroup): New public method.
9622         Resolves an argument, but allows a MethodGroup to be returned.
9623         This is used when invoking a delegate.
9624
9625         * TODO: Updated a bit.
9626
9627 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9628
9629         Fixed compilation with csc.
9630
9631         * ecore.cs: Expression.Error made public. Is this correct? Should
9632         Warning be made public too?
9633
9634         * expression.cs: use ea.Location instead of ea.loc.
9635         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9636
9637 2002-08-06  Martin Baulig  <martin@gnome.org>
9638
9639         * ecore.cs (Expression.loc): Moved the location here instead of
9640         duplicating it in all derived classes.
9641         (Expression.Location): New public property.
9642         (Expression.Error, Expression.Warning): Made them non-static and
9643         removed the location argument.
9644         (Expression.Warning): Added overloaded version which takes an
9645         `int level' argument.
9646         (Expression.Error118): Make this non-static and removed the
9647         expression and location arguments.
9648         (TypeExpr): Added location argument to the constructor.
9649
9650         * expression.cs (StaticCallExpr): Added location argument to
9651         the constructor.
9652         (Indirection, PointerArithmetic): Likewise.
9653         (CheckedExpr, UnCheckedExpr): Likewise.
9654         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9655         (StringPtr): Likewise.
9656
9657
9658 2002-08-05  Martin Baulig  <martin@gnome.org>
9659
9660         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9661
9662         * assign.cs (Assign.DoResolve): Check whether the source
9663         expression is a value or variable.
9664
9665         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9666         while resolving the corresponding blocks.
9667
9668         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9669         an error, don't silently return null.
9670
9671         * statement.cs (Block.AddVariable): Do the error reporting here
9672         and distinguish between CS0128 and CS0136.
9673         (Block.DoResolve): Report all unused labels (warning CS0164).
9674         (LabeledStatement): Pass the location to the constructor.
9675         (LabeledStatement.HasBeenReferenced): New property.
9676         (LabeledStatement.Resolve): Set it to true here.
9677
9678         * statement.cs (Return.Emit): Return success even after reporting
9679         a type mismatch error (CS0126 or CS0127), this is what csc does and
9680         it avoids confusing the users with any consecutive errors.
9681
9682 2002-08-05  Martin Baulig  <martin@gnome.org>
9683
9684         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9685
9686         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9687
9688         * expression.cs (MemberAccess.DoResolve): Silently return if an
9689         error has already been reported.
9690
9691         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9692         error has already been reported.
9693
9694 2002-08-05  Martin Baulig  <martin@gnome.org>
9695
9696         * statement.cs (UsageVector): Only initialize the `parameters'
9697         vector if we actually have any "out" parameters.
9698
9699 2002-08-05  Martin Baulig  <martin@gnome.org>
9700
9701         * expression.cs (Binary.ResolveOperator): When combining delegates,
9702         they must have the same type.
9703
9704 2002-08-05  Martin Baulig  <martin@gnome.org>
9705
9706         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9707         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9708         work with the ms runtime and we also don't need it: if we're a
9709         PropertyBuilder and not in the `indexer_arguments' hash, then we
9710         are a property and not an indexer.
9711
9712         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9713         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9714         since the latter one doesn't work with the ms runtime.
9715
9716 2002-08-03  Martin Baulig  <martin@gnome.org>
9717
9718         Fixed bugs #27998 and #22735.
9719
9720         * class.cs (Method.IsOperator): New public field.
9721         (Method.CheckBase): Report CS0111 if there's already a method
9722         with the same parameters in the current class.  Report CS0508 when
9723         attempting to change the return type of an inherited method.
9724         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9725         and it's not marked abstract or extern.
9726         (PropertyBase): New abstract base class for Property and Indexer.
9727         (PropertyBase.CheckBase): Moved here from Property and made it work
9728         for indexers.
9729         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9730         the same so we can reuse it there.
9731         (Property, Indexer): Derive from PropertyBase.
9732         (MethodSignature.inheritable_property_signature_filter): New delegate
9733         to find properties and indexers.
9734
9735         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9736         argument and improved error reporting.
9737
9738         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9739         EmptyReadOnlyParameters and made it a property.
9740
9741         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9742         version of this method which takes a `PropertyInfo indexer'.
9743         (TypeManager.RegisterIndexer): New method.
9744
9745         * class.cs: Added myself as author of this file :-)
9746
9747 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9748
9749         * class.cs: fixed compilation on windoze.
9750
9751 2002-08-03  Martin Baulig  <martin@gnome.org>
9752
9753         * interface.cs (Interface.GetInterfaceBases): Check whether all
9754         base interfaces are at least as accessible than the current one.
9755
9756         * class.cs (TypeContainer.GetClassBases): Check whether base types
9757         are at least as accessible than the current type.
9758         (TypeContainer.AsAccessible): Implemented and made non-static.
9759         (MemberBase.CheckParameters): Report errors if the accessibility
9760         checks fail.
9761
9762         * delegate.cs (Delegate.Delegate): The default visibility is
9763         internal for top-level types and private for nested types.
9764         (Delegate.Define): Report errors if the accessibility checks fail.
9765
9766         * enum.cs (Enum.Enum): The default visibility is internal for
9767         top-level types and private for nested types.
9768         (Enum.DefineType): Compute the correct visibility.
9769
9770         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9771         function which takes a `bool is_toplevel' instead of a TypeContainer.
9772
9773         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9774         builtin type.
9775
9776 2002-08-02  Martin Baulig  <martin@gnome.org>
9777
9778         * expression.cs (LocalVariableReferenc): Added constructor which
9779         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9780         (LocalVariableReference.IsReadOnly): New property.
9781         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9782         variable is readonly, use our own readonly flag to do this; you can
9783         use the new constructor to get a writable reference to a read-only
9784         variable.
9785
9786         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9787         reference to the local variable.
9788
9789 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9790
9791         * rootcontext.cs (ResolveCore): Also include System.Exception
9792
9793         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9794         we reach an EmptyStatement.
9795
9796         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9797         is also fine.
9798
9799         * expression.cs (Binary.ResolveOperator): Check error result in
9800         two places.
9801
9802         use brtrue/brfalse directly and avoid compares to null.
9803
9804 2002-08-02  Martin Baulig  <martin@gnome.org>
9805
9806         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9807         Fixes bug #28407, added test-155.cs.
9808
9809 2002-08-01  Martin Baulig  <martin@gnome.org>
9810
9811         * class.cs (Event.EmitDefaultMethod): Make this work with static
9812         events.  Fixes #28311, added verify-3.cs.
9813
9814 2002-08-01  Martin Baulig  <martin@gnome.org>
9815
9816         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9817         `is_disposable' fields.
9818         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9819         `hm.is_disposable' if we're using the collection pattern.
9820         (Foreach.EmitCollectionForeach): Use the correct type for the
9821         enumerator's local variable, only emit the try/finally block if
9822         necessary (fixes #27713).
9823
9824 2002-08-01  Martin Baulig  <martin@gnome.org>
9825
9826         * ecore.cs (Expression.report118): Renamed to Error118 and made
9827         it public static.
9828
9829         * statement.cs (Throw.Resolve): Check whether the expression is of
9830         the correct type (CS0118) and whether the type derives from
9831         System.Exception (CS0155).
9832         (Catch.Resolve): New method.  Do the type lookup here and check
9833         whether it derives from System.Exception (CS0155).
9834         (Catch.CatchType, Catch.IsGeneral): New public properties.
9835
9836         * typemanager.cs (TypeManager.exception_type): Added.
9837
9838 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9839
9840         * driver.cs: Updated About function.
9841
9842 2002-07-31  Martin Baulig  <martin@gnome.org>
9843
9844         Implemented Control Flow Analysis.
9845
9846         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9847         (EmitContext.CurrentBranching): Added.
9848         (EmitContext.StartFlowBranching): Added.
9849         (EmitContext.EndFlowBranching): Added.
9850         (EmitContext.KillFlowBranching): Added.
9851         (EmitContext.IsVariableAssigned): Added.
9852         (EmitContext.SetVariableAssigned): Added.
9853         (EmitContext.IsParameterAssigned): Added.
9854         (EmitContext.SetParameterAssigned): Added.
9855         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9856         Added control flow analysis stuff here.
9857
9858         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9859         resolve the expression as lvalue.
9860         (LocalVariableReference.DoResolve): Check whether the variable has
9861         already been assigned.
9862         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9863         the parameter as assigned here.
9864         (ParameterReference.DoResolve): Check whether the parameter has already
9865         been assigned.
9866         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9867         expression as lvalue.
9868
9869         * statement.cs (FlowBranching): New class for the flow analysis code.
9870         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9871         (LabeledStatement.IsDefined): New public property.
9872         (LabeledStatement.AddUsageVector): New public method to tell flow
9873         analyis that the label may be reached via a forward jump.
9874         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9875         flow analysis.
9876         (VariableInfo.Number): New public field.  This is used by flow analysis
9877         to number all locals of a block.
9878         (Block.CountVariables): New public property.  This is the number of
9879         local variables in this block (including the locals from all parent
9880         blocks).
9881         (Block.EmitMeta): Number all the variables.
9882
9883         * statement.cs: Added flow analysis support to all classes.
9884
9885 2002-07-31  Martin Baulig  <martin@gnome.org>
9886
9887         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9888         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9889         then use this argument.
9890
9891         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9892
9893         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9894         use this to specify /define options.
9895
9896 2002-07-29  Martin Baulig  <martin@gnome.org>
9897
9898         * statement.cs (Fixed): Moved all code that does variable lookups
9899         and resolvings from Emit to Resolve.
9900
9901         * statement.cs (For): Moved all code that does variable lookups
9902         and resolvings from Emit to Resolve.
9903
9904         * statement.cs (Using): Moved all code that does variable lookups
9905         and resolvings from Emit to Resolve.
9906
9907 2002-07-29  Martin Baulig  <martin@gnome.org>
9908
9909         * attribute.cs (Attribute.Resolve): Explicitly catch a
9910         System.NullReferenceException when creating the
9911         CustromAttributeBuilder and report a different warning message.
9912
9913 2002-07-29  Martin Baulig  <martin@gnome.org>
9914
9915         * support.cs (ParameterData.ParameterName): Added method to
9916         get the name of a parameter.
9917
9918         * typemanager.cs (TypeManager.IsValueType): New public method.
9919
9920 2002-07-29  Martin Baulig  <martin@gnome.org>
9921
9922         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9923         is a flag which specifies that it's either ref or out.
9924         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9925         the out parameter to `out Parameter.Modifier mod', also set the
9926         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9927
9928         * support.cs (InternalParameters.ParameterModifier): Distinguish
9929         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9930         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9931
9932         * expression.cs (Argument.GetParameterModifier): Distinguish
9933         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9934         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9935
9936 2002-07-29  Martin Baulig  <martin@gnome.org>
9937
9938         * expression.cs (ParameterReference.ParameterReference): Added
9939         `Location loc' argument to the constructor.
9940
9941         * cs-parser.jay: Pass location to ParameterReference.
9942
9943 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9944
9945         * statement.cs (Try): Initialize the location.
9946
9947         * cs-parser.jay: pass location to Try.
9948
9949         * expression.cs (Unary.Reduce): Change the prototype to return
9950         whether a constant fold could be performed or not.  The result is
9951         returned in an out parameters.  In the case of Indirection and
9952         AddressOf, we want to perform the full tests.
9953
9954 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9955
9956         * statement.cs (Statement.Emit): Flag dead code.
9957
9958 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9959
9960         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9961
9962 2002-07-27  Martin Baulig  <martin@gnome.org>
9963
9964         * class.cs (MethodData.Define): Put back call to
9965         TypeManager.AddMethod(), accidentally commented this out.
9966
9967         * report.cs (Debug): New public method to print debugging information,
9968         this is `[Conditional ("DEBUG")]'.
9969
9970 2002-07-26  Martin Baulig  <martin@gnome.org>
9971
9972         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9973         (switch_statement): Push the current_block to the switch_stack and
9974         pop it again when we're done with the switch.
9975         (switch_section): The new block is a child of the current_block.
9976         Fixes bug #24007, added test-152.cs.
9977
9978 2002-07-27  Martin Baulig  <martin@gnome.org>
9979
9980         * expression.cs (Invocation.EmitArguments): When calling a varargs
9981         function with only its fixed arguments, we need to pass an empty
9982         array.
9983
9984 2002-07-27  Martin Baulig  <martin@gnome.org>
9985
9986         Mono 0.13 has been released.
9987
9988 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9989
9990         * driver.cs: Rename --resource to --linkres, because that is what
9991         we do currently, we dont support --resource yet.
9992
9993         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9994
9995 2002-07-25  Martin Baulig  <martin@gnome.org>
9996
9997         * class.cs (MethodData): New public class.  This is a `method builder'
9998         class for a method or one accessor of a Property/Indexer/Event.
9999         (MethodData.GetMethodFlags): Moved here from MemberBase.
10000         (MethodData.ApplyAttributes): Likewise.
10001         (MethodData.ApplyObsoleteAttribute): Likewise.
10002         (MethodData.ApplyConditionalAttribute): Likewise.
10003         (MethodData.ApplyDllImportAttribute): Likewise.
10004         (MethodData.CheckAbstractAndExternal): Likewise.
10005         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10006         (MethodData.Emit): Formerly known as Method.Emit().
10007         (MemberBase): Moved everything which was specific to a single
10008         accessor/method to MethodData.
10009         (Method): Create a new MethodData and call Define() and Emit() on it.
10010         (Property, Indexer, Event): Create a new MethodData objects for each
10011         accessor and call Define() and Emit() on them.
10012
10013 2002-07-25  Martin Baulig  <martin@gnome.org>
10014
10015         Made MethodCore derive from MemberBase to reuse the code from there.
10016         MemberBase now also checks for attributes.
10017
10018         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10019         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10020         as virtual.
10021         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10022         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10023         (MemberBase.ApplyAttributes): New virtual method; applies the
10024         attributes to a method or accessor.
10025         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10026         (MemberBase.ApplyConditionalAttribute): Likewise.
10027         (MemberBase.ApplyDllImportAttribute): Likewise.
10028         (MemberBase.CheckAbstractAndExternal): Likewise.
10029         (MethodCore.ParameterTypes): This is now a property instead of a
10030         method, it's initialized from DoDefineParameters().
10031         (MethodCore.ParameterInfo): Removed the set accessor.
10032         (MethodCore.DoDefineParameters): New protected virtual method to
10033         initialize ParameterTypes and ParameterInfo.
10034         (Method.GetReturnType): We can now simply return the MemberType.
10035         (Method.GetMethodFlags): Override the MemberBase version and add
10036         the conditional flags.
10037         (Method.CheckBase): Moved some code from Define() here, call
10038         DoDefineParameters() here.
10039         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10040         here to avoid some larger code duplication.
10041         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10042         ensure that abstract and external accessors don't declare a body.
10043
10044         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10045         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10046         lookup in the attribute's parent classes, so we need to abort as soon
10047         as we found the first match.
10048         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10049         the attribute has no arguments.
10050
10051         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10052         of a Method.
10053
10054 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10055
10056         * cs-parser.jay: reverted previous patch.
10057
10058 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10059
10060         * cs-parser.jay: fixed bug #22119.
10061
10062 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10063
10064         * attribute.cs: fixed compilation. The error was:
10065         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10066         be assigned to before control leaves the current method."
10067         [FIXME:  Filed as bug #28186: MCS must report this error.]
10068
10069 2002-07-25  Martin Baulig  <martin@gnome.org>
10070
10071         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10072         method to pull the condition name ouf of a Conditional attribute.
10073         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10074         the obsolete message and error flag out of an Obsolete attribute.
10075
10076         * class.cs (Method.GetMethodFlags): New public method to get the
10077         TypeManager.MethodFlags for this method.
10078         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10079         private methods.
10080         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10081         if we're overriding a virtual function, set the new private variable
10082         `parent_method'; call the new TypeManager.AddMethod().
10083
10084         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10085         the MethodBuilder and the Method in a PtrHashtable.
10086         (TypeManager.builder_to_method): Added for this purpose.
10087         (TypeManager.MethodFlags): Added IsObsoleteError.
10088         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10089         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10090         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10091         the message from the attribute.
10092
10093 2002-07-24  Martin Baulig  <martin@gnome.org>
10094
10095         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10096         preprocessor directives, ensure that the argument to #define/#undef is
10097         exactly one identifier and that it's actually an identifier.
10098
10099         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10100         did not work ....
10101
10102 2002-07-24  Martin Baulig  <martin@gnome.org>
10103
10104         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10105         initialize it to TypeManager.object_type in the constructor.
10106         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10107         of the `hm.get_current' method if we're using the collection pattern.
10108         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10109         for the explicit conversion to make it work when we're using the collection
10110         pattern and the `Current' property has a different return type than `object'.
10111         Fixes #27713.
10112
10113 2002-07-24  Martin Baulig  <martin@gnome.org>
10114
10115         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10116         does not match, but don't report any errors.  This method is called in
10117         order for all methods in a MethodGroupExpr until a matching method is
10118         found, so we don't want to bail out if the first method doesn't match.
10119         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10120         matches, report the 123.  Fixes #28070.
10121
10122 2002-07-24  Martin Baulig  <martin@gnome.org>
10123
10124         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10125         TypeManager.TypeToCoreType() to the top of the method so the
10126         following equality checks will work.  Fixes #28107.
10127
10128 2002-07-24  Martin Baulig  <martin@gnome.org>
10129
10130         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10131         operand is of type uint, and the other operand is of type sbyte,
10132         short or int, the operands are converted to type long." -
10133         Actually do what this comment already told us.  Fixes bug #28106,
10134         added test-150.cs.
10135
10136 2002-07-24  Martin Baulig  <martin@gnome.org>
10137
10138         * class.cs (MethodBase): New abstract class.  This is now a base
10139         class for Property, Indexer and Event to avoid some code duplication
10140         in their Define() and DefineMethods() methods.
10141         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10142         generic methods for Define() and DefineMethods().
10143         (FieldBase): Derive from MemberBase, not MemberCore.
10144         (Property): Derive from MemberBase, not MemberCore.
10145         (Property.DefineMethod): Moved all the code from this method to the
10146         new MethodBase.DefineAccessor(), just call it with appropriate
10147         argumetnts.
10148         (Property.Define): Call the new Property.DoDefine(), this does some
10149         sanity checks and we don't need to duplicate the code everywhere.
10150         (Event): Derive from MemberBase, not MemberCore.
10151         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10152         accessors, this will also make them work with interface events.
10153         (Indexer): Derive from MemberBase, not MemberCore.
10154         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10155         (Indexer.Define): Use the new MethodBase functions.
10156
10157         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10158         argument to the constructor.
10159         (Interface.FindMembers): Added support for interface events.
10160         (Interface.PopluateEvent): Implemented.
10161
10162         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10163
10164 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10165
10166         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10167         but this is required to check for a method name being the same as
10168         the containing class.  
10169
10170         Handle this now.
10171
10172 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10173
10174         * interface.cs: initialize variable.
10175
10176 2002-07-23  Martin Baulig  <martin@gnome.org>
10177
10178         Implemented the IndexerName attribute in interfaces.
10179
10180         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10181         name if this is an explicit interface implementation.
10182         (Indexer.InterfaceIndexerName): New public variable.  If we're
10183         implementing an interface indexer, this is the IndexerName in that
10184         interface.  Otherwise, it's the IndexerName.
10185         (Indexer.DefineMethod): If we're implementing interface indexer,
10186         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10187         and Pending.ImplementIndexer methods.
10188         (Indexer.Define): Also define the PropertyBuilder if we're
10189         implementing an interface indexer and this is neither an explicit
10190         interface implementation nor do the IndexerName match the one in
10191         the interface.
10192
10193         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10194         If a method is defined here, then we always need to create a proxy
10195         for it.  This is used when implementing interface indexers.
10196         (Pending.IsInterfaceIndexer): New public method.
10197         (Pending.ImplementIndexer): New public method.
10198         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10199         This is used when implementing interface indexers to define a proxy
10200         if necessary.
10201         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10202         define a proxy if necessary.
10203
10204         * interface.cs (Interface.IndexerName): New public variable.
10205         (Interface.PopulateIndexer): Set the IndexerName.
10206         (Interface.DefineIndexers): New private method.  Populate all the
10207         indexers and make sure their IndexerNames match.
10208
10209         * typemanager.cs (IndexerPropertyName): Added support for interface
10210         indexers.
10211
10212 2002-07-22  Martin Baulig  <martin@gnome.org>
10213
10214         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10215         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10216         ret if HasReturnLabel.
10217         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10218         variables.
10219
10220         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10221         and set the ec.LoopBeginTryCatchLevel.
10222         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10223         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10224         the current ec.TryCatchLevel, the branch goes out of an exception
10225         block.  In this case, we need to use Leave and not Br.
10226
10227 2002-07-22  Martin Baulig  <martin@gnome.org>
10228
10229         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10230         block unless the block does not always return or it is contained in
10231         another try { ... } catch { ... } block.  Fixes bug #26506.
10232         Added verify-1.cs to the test suite.
10233
10234 2002-07-22  Martin Baulig  <martin@gnome.org>
10235
10236         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10237         then we do not always return.  Fixes bug #24985.
10238
10239 2002-07-22  Martin Baulig  <martin@gnome.org>
10240
10241         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10242         lookup on a per-class level; ie. walk up the class hierarchy until we
10243         found at least one applicable method, then choose the best among them.
10244         Fixes bug #24463 and test-29.cs.
10245
10246 2002-07-22  Martin Baulig  <martin@gnome.org>
10247
10248         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10249         return types of the methods.  The return type is not part of the
10250         signature and we must not check it to make the `new' modifier work.
10251         Fixes bug #27999, also added test-147.cs.
10252         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10253
10254         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10255         on the method's return type.
10256
10257 2002-07-21  Martin Baulig  <martin@gnome.org>
10258
10259         * assign.cs: Make this work if the rightmost source is a constant and
10260         we need to do an implicit type conversion.  Also adding a few more tests
10261         to test-38.cs which should have caught this.
10262
10263         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10264         target in the makefile for this.  The makefile.gnu is primarily intended
10265         for end-users who don't want to debug the compiler.
10266
10267 2002-07-21  Martin Baulig  <martin@gnome.org>
10268
10269         * assign.cs: Improved the Assign class so it can now handle embedded
10270         assignments (X = Y = Z = something).  As a side-effect this'll now also
10271         consume less local variables.  test-38.cs now passes with MCS, added
10272         a few new test cases to that test.
10273
10274 2002-07-20  Martin Baulig  <martin@gnome.org>
10275
10276         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10277         instructions.  Fixes bug #27977, also added test-146.cs.
10278
10279 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10280
10281         * cs-tokenizer.cs: fixed getHex ().
10282
10283 2002-07-19  Martin Baulig  <martin@gnome.org>
10284
10285         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10286         not Type.GetType() to lookup the array type.  This is needed when
10287         we're constructing an array of a user-defined type.
10288         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10289         single-dimensional arrays, but also for single-dimensial arrays of
10290         type decimal.
10291
10292 2002-07-19  Martin Baulig  <martin@gnome.org>
10293
10294         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10295         this function is called, it's not allowed to share LocalBuilders
10296         among ILGenerators.
10297
10298 2002-07-19  Martin Baulig  <martin@gnome.org>
10299
10300         * expression.cs (Argument.Resolve): Report an error 118 when trying
10301         to pass a type as argument.
10302
10303 2002-07-18  Martin Baulig  <martin@gnome.org>
10304
10305         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10306         Conv_R_Un for the signed `long' type.
10307
10308 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10309
10310         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10311         `expr' for the temporary result, as that will fail if we do
10312         multiple resolves on the same expression.
10313
10314 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10315
10316         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10317         ec.TypeContainer for looking up aliases. 
10318
10319         * class.cs (TypeContainer): Remove LookupAlias from here.
10320
10321         * decl.cs (DeclSpace); Move here.
10322
10323 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10324
10325         * class.cs (FindMembers): Only call filter if the constructor
10326         bulider is not null.
10327
10328         Also handle delegates in `NestedTypes' now.  Now we will perform
10329         type lookups using the standard resolution process.  This also
10330         fixes a bug.
10331
10332         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10333         This uses Expressions (the limited kind that can be parsed by the
10334         tree) instead of strings.
10335
10336         * expression.cs (ComposedCast.ToString): Implement, used to flag
10337         errors since now we have to render expressions.
10338
10339         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10340         FormArrayType. 
10341
10342         * ecore.cs (SimpleName.ToString): ditto.
10343
10344         * cs-parser.jay: Instead of using strings to assemble types, use
10345         Expressions to assemble the type (using SimpleName, ComposedCast,
10346         MemberAccess).  This should fix the type lookups in declarations,
10347         because we were using a different code path for this.
10348
10349         * statement.cs (Block.Resolve): Continue processing statements
10350         even when there is an error.
10351
10352 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10353
10354         * class.cs (Event.Define): Also remove the `remove' method from
10355         the list of pending items.
10356
10357         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10358         generate more compact code. 
10359
10360 2002-07-17  Martin Baulig  <martin@gnome.org>
10361
10362         * const.cs (Const.LookupConstantValue): Add support for constant
10363         `unchecked' and `checked' expressions.
10364         Also adding test case test-140.cs for this.
10365
10366 2002-07-17  Martin Baulig  <martin@gnome.org>
10367
10368         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10369         check whether mi.ReturnType implements the IEnumerator interface; the
10370         `==' and the IsAssignableFrom() will fail in this situation.
10371
10372 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10373
10374         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10375         here too.
10376
10377 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10378
10379         * expression.cs: fixed bug #27811.
10380
10381 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10382
10383         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10384         Molaro: when we are a ref, the value already contains a pointer
10385         value, do not take the address of it.
10386
10387 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10388         * removed mb-parser.jay and mb-tokenizer.cs
10389
10390 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10391
10392         * expression.cs: check against the building corlib void type.
10393
10394 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10395
10396         * ecore.cs: fix for valuetype static readonly fields: when 
10397         initializing them, we need their address, not the address of a copy.
10398
10399 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10400
10401         * typemanager.cs: register also enum_type in corlib.
10402
10403 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10404
10405         * class.cs: allow calling this (but not base) initializers in structs.
10406
10407 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10408
10409         * ecore.cs: make sure we compare against the building base types
10410         in GetTypeSize ().
10411
10412 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10413
10414         * typemanager.cs: fix TypeToCoreType() to handle void and object
10415         (corlib gets no more typerefs after this change).
10416
10417 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10418
10419         * expression.cs (ArrayCreation.EmitArrayArguments): use
10420         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10421
10422         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10423         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10424         array indexes, the runtime actually forbids them.
10425
10426         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10427         for array arguments here.
10428
10429         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10430         instead of the default for ValueTypes.
10431
10432         (New.DoEmit): Use IsValueType instead of
10433         IsSubclassOf (value_type)
10434         (New.DoResolve): ditto.
10435         (Invocation.EmitCall): ditto.
10436
10437         * assign.cs (Assign): ditto.
10438
10439         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10440         Statements *are* currently doing part of their resolution during
10441         Emit.  
10442
10443         Expressions do always resolve during resolve, but statements are
10444         only required to propagate resolution to their children.
10445
10446 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10447
10448         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10449
10450         (LoadAssembly): Do not add the dll if it is already specified
10451
10452         (MainDriver): Add the System directory to the link path at the end,
10453         after all the other -L arguments. 
10454
10455         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10456         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10457         ldelem.u1) and using the opposite for sbytes.
10458
10459         This fixes Digger, and we can finally run it.
10460
10461         * driver.cs (UnixParseOption): Move the option parsing here.  
10462         (CSCParseOption): Implement CSC-like parsing of options.
10463
10464         We now support both modes of operation, the old Unix way, and the
10465         new CSC-like way.  This should help those who wanted to make cross
10466         platform makefiles.
10467
10468         The only thing broken is that /r:, /reference: and /lib: are not
10469         implemented, because I want to make those have the same semantics
10470         as the CSC compiler has, and kill once and for all the confussion
10471         around this.   Will be doing this tomorrow.
10472
10473         * statement.cs (Unsafe.Resolve): The state is checked during
10474         resolve, not emit, so we have to set the flags for IsUnsfe here.
10475
10476 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10477
10478         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10479         not catch the Error_ObjectRefRequired in SimpleName (as it is
10480         possible to have a class/instance variable name that later gets
10481         deambiguated), we have to check this here.      
10482
10483 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10484
10485         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10486         make static and put into Expression.
10487
10488         (Event.Define): Register the private field of the event with the 
10489         TypeManager so that GetFieldFromEvent can get at it.
10490
10491         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10492         keep track of the private field associated with an event which
10493         has no accessors.
10494
10495         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10496         private field.
10497
10498         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10499
10500 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10501
10502         * expression.cs (Binary.EmitBranchable): this routine emits the
10503         Binary expression in a branchable context.  This basically means:
10504         we need to branch somewhere, not just get the value on the stack.
10505
10506         This works together with Statement.EmitBoolExpression.
10507
10508         * statement.cs (Statement.EmitBoolExpression): Use
10509         EmitBranchable. 
10510
10511 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10512
10513         * statement.cs (For): Reduce the number of jumps in loops.
10514
10515         (For): Implement loop inversion for the For statement.
10516
10517         (Break): We can be breaking out of a Try/Catch controlled section
10518         (foreach might have an implicit try/catch clause), so we need to
10519         use Leave instead of Br.
10520
10521         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10522         now).  If the instace expression supports IMemoryLocation, we use
10523         the AddressOf method from the IMemoryLocation to extract the
10524         address instead of emitting the instance.
10525
10526         This showed up with `This', as we were emitting the instance
10527         always (Emit) instead of the Address of This.  Particularly
10528         interesting when This is a value type, as we dont want the Emit
10529         effect (which was to load the object).
10530
10531 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10532
10533         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10534
10535         * statement.cs (Checked): Set the CheckedState during the resolve
10536         process too, as the ConvCast operations track the checked state on
10537         the resolve process, and not emit.
10538
10539         * cs-parser.jay (namespace_member_declaration): Flag that we have
10540         found a declaration when we do.  This is used to flag error 1529
10541
10542         * driver.cs: Report ok when we display the help only.
10543
10544 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10545
10546         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10547
10548 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10549
10550         * cs-tokenizer.cs (define): We also have to track locally the
10551         defines.  AllDefines is just used for the Conditional Attribute,
10552         but we also need the local defines for the current source code. 
10553
10554 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10555
10556         * statement.cs (While, For, Do): These loops can exit through a
10557         Break statement, use this information to tell whether the
10558         statement is the last piece of code.
10559
10560         (Break): Flag that we break.
10561
10562         * codegen.cs (EmitContexts): New `Breaks' state variable.
10563
10564 2002-07-03  Martin Baulig  <martin@gnome.org>
10565
10566         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10567         modifiers in method declarations in structs.  Otherwise, you won't
10568         be able to override things like Object.Equals().
10569
10570 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10571
10572         * class.cs (Method, Property, Indexer): Do not allow the public
10573         modifier to be used in explicit interface implementations.
10574
10575         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10576         override modifiers in method declarations in structs
10577
10578 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10579
10580         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10581         integer or real overflow, report an error
10582
10583 2002-07-02  Martin Baulig  <martin@gnome.org>
10584
10585         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10586         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10587         to tell the runtime about our newly created System.Object and
10588         System.ValueType types.
10589
10590 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10591
10592         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10593         struct instead of Ldarg/Starg.
10594
10595 2002-07-02  Martin Baulig  <martin@gnome.org>
10596
10597         * expression.cs (Indirection.Indirection): Call
10598         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10599
10600 2002-07-02  Martin Baulig  <martin@gnome.org>
10601
10602         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10603         ValueType, call TypeManager.TypeToCoreType() on it.
10604         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10605         the OpCodes.Newarr argument.
10606
10607 2002-07-02  Martin Baulig  <martin@gnome.org>
10608
10609         * expression.cs (Invocation.EmitCall): When compiling corlib,
10610         replace all calls to the system's System.Array type to calls to
10611         the newly created one.
10612
10613         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10614         System.Array methods.
10615         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10616         from the system's System.Array type which must be replaced.
10617
10618 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10619
10620         * typemanager.cs: load unverifiable_code_ctor so we can build
10621         corlib using the correct type. Avoid using GetTypeCode() with
10622         TypeBuilders.
10623         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10624         TypeManager.object_type to allow building corlib.
10625
10626 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10627
10628         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10629
10630 2002-07-01  Martin Baulig  <martin@gnome.org>
10631
10632         * class.cs: Make the last change actually work, we need to check
10633         whether `ifaces != null' to avoid a crash.
10634
10635 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10636
10637         * class.cs: when we build structs without fields that implement
10638         interfaces, we need to add the interfaces separately, since there is
10639         no API to both set the size and add the interfaces at type creation
10640         time.
10641
10642 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10643
10644         * expression.cs: the dimension arguments to the array constructors
10645         need to be converted if they are a long.
10646
10647 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10648
10649         * class.cs: don't emit ldarg.0 if there is no parent constructor
10650         (fixes showstopper for corlib).
10651
10652 2002-06-29  Martin Baulig  <martin@gnome.org>
10653
10654         MCS now compiles corlib on GNU/Linux :-)
10655
10656         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10657         ie. check for MethodImplOptions.InternalCall.
10658
10659         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10660         and TypeManager.attribute_type are null, so we must explicitly check
10661         whether parent is not null to find out whether it's an attribute type.
10662         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10663         and SetBuilder, not only if the property is neither abstract nor external.
10664         This is necessary to set the MethodImplOptions on the accessor methods.
10665         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10666         SetBuilder, see Property.Emit().
10667
10668         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10669         populate "System.Object", "System.ValueType" and "System.Attribute" since
10670         they've already been populated from BootCorlib_PopulateCoreTypes().
10671
10672 2002-06-29  Martin Baulig  <martin@gnome.org>
10673
10674         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10675         is the NullLiteral, we also need to make sure that target_type is not
10676         an enum type.   
10677
10678 2002-06-29  Martin Baulig  <martin@gnome.org>
10679
10680         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10681         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10682         before calling BootstrapCorlib_ResolveDelegate ().
10683
10684 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10685
10686         * statement.cs: fixed build-breaker. All tests passed ok.
10687
10688 2002-06-27  Martin Baulig  <martin@gnome.org>
10689
10690         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10691         for System.Decimal when compiling corlib.
10692
10693 2002-06-27  Martin Baulig  <martin@gnome.org>
10694
10695         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10696         switch blocks which contain nothing but a default clause.
10697
10698 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10699
10700        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10701
10702 2002-06-27  Martin Baulig  <martin@gnome.org>
10703
10704         * ecore.cs (PropertyExpr.PropertyExpr): Call
10705         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10706
10707         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10708         is already a TypeBuilder.
10709
10710 2002-06-27  Martin Baulig  <martin@gnome.org>
10711
10712         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10713         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10714         the "from an array-type to System.Array" case.  This makes it work
10715         when compiling corlib.
10716
10717 2002-06-27  Martin Baulig  <martin@gnome.org>
10718
10719         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10720         non-static PropertyExpr, set its InstanceExpression.  This makes
10721         the `ICollection.Count' property work in System/Array.cs.
10722
10723 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10724
10725         * driver.cs: Made error handling more consistent.  Errors now
10726         tracked by Report class, so many methods which used to return int
10727         now return void.  Main() now prints success/failure and 
10728         errors/warnings message.
10729
10730         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10731         the magic number return values (123 and 124).  Now, if the
10732         expected error occurs, the compiler exits with success (exit value
10733         0).  If the compilation completes without seeing that particular
10734         error, the compiler exits with failure (exit value 1).  The
10735         makefile in mcs/errors has been changed to handle the new behaviour.
10736
10737         * report.cs: Made 'expected error' number a property and renamed
10738         it from 'Probe' to 'ExpectedError'.
10739
10740         * genericparser.cs: Removed error handling support, since it is
10741         now all done by Report class.
10742
10743         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10744         class, so parse() no longer returns an int.
10745
10746         * namespace.cs: Use Report.Error instead of GenericParser.error
10747
10748 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10749
10750         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10751         TypeContainer.AddOperator): At the front of the list put the
10752         explicit implementations, so they get resolved/defined first. 
10753
10754 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10755
10756         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10757         interface type is implemented by this TypeContainer.  Used during
10758         explicit interface implementation.
10759
10760         (Property.Define, Indexer.Define, Method.Define): Validate that
10761         the given interface in the explicit implementation is one of the
10762         base classes for the containing type.
10763
10764         Also if we are explicitly implementing an interface, but there is
10765         no match in the pending implementation table, report an error.
10766
10767         (Property.Define): Only define the property if we are
10768         not explicitly implementing a property from an interface.  Use the
10769         correct name also for those properties (the same CSC uses,
10770         although that is really not needed).
10771
10772         (Property.Emit): Do not emit attributes for explicitly implemented
10773         properties, as there is no TypeBuilder.
10774
10775         (Indexer.Emit): ditto.
10776
10777         Hiding then means that we do not really *implement* a pending
10778         implementation, which makes code fail.
10779
10780 2002-06-22  Martin Baulig  <martin@gnome.org>
10781
10782         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10783         the return value of Object.GetType().  [FIXME: we need to do this whenever
10784         we get a type back from the reflection library].
10785
10786 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10787
10788         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10789
10790 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10791
10792         * attribute.cs: Return null if we can not look up the type.
10793
10794         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10795         the interface types found.
10796
10797         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10798         interface types found.
10799
10800         * typemanager.cs (GetInterfaces): Make this routine returns alll
10801         the interfaces and work around the lame differences between
10802         System.Type and System.Reflection.Emit.TypeBuilder in the results
10803         result for GetInterfaces.
10804
10805         (ExpandInterfaces): Given an array of interface types, expand and
10806         eliminate repeated ocurrences of an interface.  This expands in
10807         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10808         be IA, IB, IC.
10809
10810 2002-06-21  Martin Baulig  <martin@gnome.org>
10811
10812         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10813         on System.Enum.
10814
10815 2002-06-21  Martin Baulig  <martin@gnome.org>
10816
10817         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10818         and called with one of the core types, return the corresponding typebuilder for
10819         that type.
10820
10821         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10822         element type.
10823
10824 2002-06-21  Martin Baulig  <martin@gnome.org>
10825
10826         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10827         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10828         (Expression.ConvertReferenceExplicit): Likewise.
10829
10830         * expression.cs (ElementAccess.DoResolve): Likewise.
10831         (ElementAccess.DoResolveLValue): Likewise.
10832
10833 2002-06-10  Martin Baulig  <martin@gnome.org>
10834
10835         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10836         add the "value" parameter to the parameter list.
10837
10838         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10839         to our caller.
10840
10841 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10842
10843         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10844         the argument to an int, uint, long or ulong, per the spec.  Also
10845         catch negative constants in array creation.
10846
10847 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10848
10849         * class.cs: do not allow the same interface to appear twice in
10850         the definition list.
10851
10852 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10853
10854         * ecore.cs: don't use ldlen with System.Array.
10855
10856 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10857
10858         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10859
10860 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10861
10862         * modifiers.cs: produce correct field attributes for protected
10863         internal. Easy fix so miguel can work on ther harder stuff:-)
10864
10865 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10866
10867         * pending.cs: New file.  Move the code from class.cs here.
10868         Support clearning the pending flag for all methods (when not doing
10869         explicit interface implementation).
10870
10871 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10872
10873         * rootcontext.cs: added a couple more types needed to bootstrap.
10874
10875 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10876
10877         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10878         constructor in the type, instead of any constructor in the type
10879         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10880         a bug in the Mono runtime when applying the params attribute). 
10881
10882 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10883         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10884
10885 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10886
10887         * expression.cs (Unary.ResolveOperator): Use TypeManager
10888         to resolve the type.
10889
10890 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10891
10892         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10893         attached.
10894
10895         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10896         with each member too.
10897
10898         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10899         field builders too - this takes care of the enum member case.
10900
10901 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10902
10903         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10904         address-of operator on both value types and pointers.
10905
10906 2002-06-10  Martin Baulig  <martin@gnome.org>
10907
10908         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10909         PropertyBuilder to the `property_builders' list.
10910
10911         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10912         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10913         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10914         find any indexers which are inherited from an interface.
10915
10916 2002-06-09  Martin Baulig  <martin@gnome.org>
10917
10918         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10919         the same type as the constant if necessary.  There's also a test-130.cs
10920         for this.
10921
10922         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10923
10924         * typemanager.cs (TypeManager.ChangeType): Previously known as
10925         Enum.ChangeEnumType().
10926
10927 2002-06-09  Martin Baulig  <martin@gnome.org>
10928
10929         * expression.cs (Cast.TryReduce): Added support for consts.
10930
10931 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10932
10933         * class.cs (Accessor): Hold attributes information so we can pass
10934         it along.
10935
10936         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10937         Modify to pass in attributes attached to the methods.
10938
10939         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10940
10941         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10942         to handle the Accessor kind :-)
10943
10944         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10945
10946 2002-06-08  Martin Baulig  <martin@gnome.org>
10947
10948         * expression.cs (Unary.TryReduceNegative): Added support for
10949         ULongConstants.
10950
10951 2002-06-08  Martin Baulig  <martin@gnome.org>
10952
10953         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10954         name can't be found in the `defined_names' - the caller will do a
10955         MemberLookup in this case and thus find methods in System.Enum
10956         such as Enum.IsDefined().
10957
10958 2002-06-08  Martin Baulig  <martin@gnome.org>
10959
10960         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10961         Convert.ChangeType() which works with TypeBuilder created types.
10962         (Enum.LookupEnumValue, Enum.Define): Use it here.
10963
10964         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10965         `TypeBuilder.BaseType != null' check.
10966         (TypeContainer.FindMembers): Only lookup parent members if we
10967         actually have a parent.
10968         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10969         (ConstructorInitializer.Resolve): Likewise.
10970
10971         * interface.cs (Interface.FindMembers): Added
10972         `TypeBuilder.BaseType != null' check.
10973
10974         * rootcontext.cs (RootContext.ResolveCore): Added
10975         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10976         classes_second_stage.
10977
10978         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10979         debug_type and trace_type when compiling with --nostdlib.       
10980
10981 2002-06-07  Martin Baulig  <martin@gnome.org>
10982
10983         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10984         (AddField): Set it to true when adding a non-static field.
10985         (DefineType): Use `have_nonstatic_fields' to find out whether we
10986         have non-static fields, not `Fields != null'.
10987
10988 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10989
10990         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10991         dereferencing a null on the static-field code path)
10992
10993 2002-05-30  Martin Baulig  <martin@gnome.org>
10994
10995         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10996         to take command line arguments.  Use reflection to call the new
10997         custom `Initialize' function on the symbol writer and pass it the
10998         command line arguments.
10999
11000         * driver.cs (--debug-args): New command line argument to pass command
11001         line arguments to the symbol writer.
11002
11003 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11004
11005         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11006         the target type for indexers and properties.  Thanks to Joe for
11007         catching this.
11008
11009 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11010
11011         * typemanager.cs (MethodFlags): returns the method flags
11012         (Obsolete/ShouldIgnore) that control warning emission and whether
11013         the invocation should be made, or ignored. 
11014
11015         * expression.cs (Invocation.Emit): Remove previous hack, we should
11016         not do this on matching a base type, we should do this based on an attribute
11017
11018         Only emit calls to System.Diagnostics.Debug and
11019         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11020         on the command line.
11021
11022         * rootcontext.cs: Global settings for tracing and debugging.
11023
11024         * cs-tokenizer.cs (define): New utility function to track
11025         defines.   Set the global settings for TRACE and DEBUG if found.
11026
11027 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11028
11029         * interface.cs (Populate*): Pass in the TypeContainer as well as
11030         the DeclSpace as parameters so that we can create EmitContexts and
11031         then use that to apply attributes etc.
11032
11033         (PopulateMethod, PopulateEvent, PopulateProperty)
11034         (PopulateIndexer): Apply attributes everywhere.
11035
11036         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11037         etc.
11038
11039         (ApplyAttributes): Update accordingly.
11040
11041         We now apply interface attributes for all members too.
11042
11043 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11044
11045         * class.cs (Indexer.Define); Correctly check if we are explicit
11046         implementation (instead of checking the Name for a ".", we
11047         directly look up if the InterfaceType was specified).
11048
11049         Delay the creation of the PropertyBuilder.
11050
11051         Only create the PropertyBuilder if we are not an explicit
11052         interface implementation.   This means that explicit interface
11053         implementation members do not participate in regular function
11054         lookups, and hence fixes another major ambiguity problem in
11055         overload resolution (that was the visible effect).
11056
11057         (DefineMethod): Return whether we are doing an interface
11058         implementation. 
11059
11060         * typemanager.cs: Temporary hack until we get attributes in
11061         interfaces (Ravi is working on that) and we get IndexerName
11062         support in interfaces.
11063
11064         * interface.cs: Register the indexers as properties.
11065
11066         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11067         warning, I have verified that this is a bug in the .NET runtime
11068         (JavaScript suffers of the same problem).
11069
11070         * typemanager.cs (MemberLookup): When looking up members for
11071         interfaces, the parent of an interface is the implicit
11072         System.Object (so we succeed in searches of Object methods in an
11073         interface method invocation.  Example:  IEnumerable x;  x.ToString
11074         ()) 
11075
11076 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11077
11078         * class.cs (Event): Events should also register if they do
11079         implement the methods that an interface requires.
11080
11081         * typemanager.cs (MemberLookup); use the new GetInterfaces
11082         method. 
11083
11084         (GetInterfaces): The code used to lookup interfaces for a type is
11085         used in more than one place, factor it here. 
11086
11087         * driver.cs: Track the errors at the bottom of the file, we kept
11088         on going.
11089
11090         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11091         instance if the method we are calling is static!
11092
11093 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11094
11095         * attribute.cs (ApplyAttributes): Make this function filter out
11096         the IndexerName attribute (as that attribute in reality is never
11097         applied) and return the string constant for the IndexerName
11098         attribute. 
11099
11100         * class.cs (TypeContainer.Emit): Validate that all the indexers
11101         have the same IndexerName attribute, and if so, set the
11102         DefaultName attribute on the class. 
11103
11104         * typemanager.cs: The return value might contain other stuff (not
11105         only methods).  For instance, consider a method with an "Item"
11106         property and an Item method.
11107
11108         * class.cs: If there is a problem with the parameter types,
11109         return. 
11110
11111 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11112
11113         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11114         looks at user defined conversion after making a call to 
11115         StandardConversionExists - we need this for overload resolution.
11116
11117         * expression.cs : Update accordingly the various method calls.
11118
11119         This fixes 2 bugs filed against implicit user defined conversions 
11120
11121 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11122
11123         * statement.cs: Track the result of the assignment.
11124
11125 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11126
11127         * expression.cs (MemberAccess): Improved error reporting for
11128         inaccessible members.
11129
11130 2002-05-22  Martin Baulig  <martin@gnome.org>
11131
11132         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11133         itself with debugging support.
11134
11135 2002-05-22  Martin Baulig  <martin@gnome.org>
11136
11137         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11138         Removed, this isn't needed anymore.
11139
11140 2002-05-20  Martin Baulig  <martin@gnome.org>
11141
11142         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11143         be underlying type for an enum.
11144
11145 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11146
11147         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11148         that splits out the loading of just the core types.
11149
11150         * rootcontext.cs (ResolveCore): Split the struct resolution in
11151         two, so we can load the enumeration underlying types before any
11152         enums are used.
11153
11154         * expression.cs (Is): Bandaid until we fix properly Switch (see
11155         bug #24985 for details).
11156
11157         * typemanager.cs (ImplementsInterface): The hashtable will contain
11158         a null if there are no interfaces implemented.
11159
11160 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11161
11162         * cs-parser.jay (indexer_declarator): It is fine to have array
11163         parameters
11164
11165 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11166
11167         * typemanager.cs: (RegisterBuilder): New function used to register
11168         TypeBuilders that implement interfaces.  Since
11169         TypeBuilder.GetInterfaces (as usual) does not work with lame
11170         Reflection.Emit. 
11171         (AddUserType): register interfaces.
11172
11173         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11174         dealing with TypeBuilder.  Also, arrays are showing up as
11175         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11176         methods can not be invoked on them!
11177
11178         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11179         (ImplicitReferenceConversionExists): Split out from
11180         StandardConversionExists. 
11181
11182         * expression.cs (As): We were only implementing one of the three
11183         cases for the as operator.  We now implement them all.
11184         (Is): Implement the various other cases for Is as well.
11185
11186         * typemanager.cs (CACHE): New define used to control if we want or
11187         not the FindMembers cache.  Seems to have a negative impact on
11188         performance currently
11189
11190         (MemberLookup): Nested types have full acess to
11191         enclosing type members
11192
11193         Remove code that coped with instance/static returns for events, we
11194         now catch this in RealFindMembers.
11195
11196         (RealFindMembers): only perform static lookup if the instance
11197         lookup did not return a type or an event.  
11198
11199 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11200
11201         * assign.cs (CompoundAssign): We pass more semantic information
11202         now to Compound Assignments than we did before: now we have all
11203         the information at hand, and now we resolve the target *before* we
11204         do the expression expansion, which allows the "CacheValue" method
11205         to have the effect we intended (before, a [x] += 1 would generate
11206         two differen ArrayAccess expressions from the ElementAccess,
11207         during the resolution process).
11208
11209         (CompoundAssign.DoResolve): Resolve target and original_source here.
11210
11211 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11212
11213         * expression.cs (ArrayAccess): dropped debugging information. 
11214
11215         * typemanager.cs: Small bug fix: I was always returning i_members,
11216         instead of one of i_members or s_members (depending on which had
11217         the content).
11218
11219         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11220         method is invoked before any code generation takes place, and it
11221         is a mechanism to inform that the expression will be invoked more
11222         than once, and that the method should use temporary values to
11223         avoid having side effects
11224
11225         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11226
11227         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11228         implementation.
11229
11230         * expression.cs (Indirection, ArrayAccess): Add support for
11231         CacheTemporaries in these two bad boys. 
11232
11233         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11234         ldobj or ldind_ref.  
11235         (StoreFromPtr): Handle stobj as well.
11236
11237         * expression.cs (UnaryMutator): Share more code.
11238
11239         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11240         down: I was not tracking the Filter function as well, which
11241         was affecting the results of the cache.
11242
11243 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11244
11245         * attribute.cs: Remove the hack to handle the CharSet property on
11246         StructLayouts. 
11247
11248 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11249
11250         * attribute.cs (DoResolve): More uglyness, we now only try to
11251         resolve the attribute partially, to extract the CharSet
11252         information (only if we are a StructLayout attribute).  Otherwise 
11253
11254         (GetExtraTypeInfo): Add some code to conditionally kill in the
11255         future this.   I am more and more convinced that the .NET
11256         framework has special code to handle the attribute setting on
11257         certain elements.
11258
11259         * expression.cs (IsParamsMethodApplicable): Revert my previous
11260         foreach change here, it was wrong.
11261
11262 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11263
11264         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11265         (pp_expr): do not abort on unknown input, just return.
11266         (eval): abort if there are pending chars.
11267
11268         * attribute.cs (Attribute.Resolve): Positional parameters are
11269         optional.  Deal with that case.
11270
11271         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11272         the Ansi/Unicode/Auto information for the type.
11273
11274         (TypeContainer.DefineType): instantiate the EmitContext here, as
11275         we will be using it during the type definition (to resolve
11276         attributes) and during the emit phase.
11277
11278         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11279         to pull type information out of the attributes
11280
11281         (Attribute.Resolve): track the constructor builder, and allow for
11282         multiple invocations (structs and classes will use this).
11283
11284         * ecore.cs (MemberLookupFinal): new version with all the
11285         parameters customizable.
11286
11287         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11288         constructors.  Return if the result value is null (as the error
11289         would have been flagged already by MemberLookupFinal)
11290
11291         Do not allow instances of abstract classes or interfaces to be
11292         created.
11293
11294         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11295         We have to compare the assembly property here when dealing with
11296         FamANDAssem and Assembly access modifiers, because we might be
11297         creating an assembly from *modules* (that means that we are not
11298         getting TypeBuilders for types defined in other modules that are
11299         part of this assembly).
11300
11301         (Method.Emit): If the method is marked abstract and has a body,
11302         emit an error. 
11303
11304         (TypeContainer.DefineMembers): If both the defined member and the
11305         parent name match are methods, then do not emit any warnings: let
11306         the Method.Define routine take care of flagging warnings.  But if
11307         there is a mismatch (method overrides something else, or method is
11308         overriwritten by something, then emit warning).
11309
11310         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11311         set to null, this means `do not check for the return type on the
11312         signature'. 
11313
11314         (Method.Define): set the return type for the method signature to
11315         null, so that we get methods with the same name and parameters and
11316         different return types.  This is used to flag warning 114 (you are
11317         hiding a method, and you probably want to use the new/override
11318         keywords instead).
11319
11320         * typemanager.cs (MemberLookup): Implemented proper access
11321         control, closing a long standing set of bug reports.  The problem
11322         was that the Framework only has two bits: Public and NonPublic,
11323         and NonPublic includes private and protected methods, but we need
11324         to enforce the FamANDAssem, FamOrAssem and Family. 
11325
11326 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11327
11328         * statement.cs (GotoCase): Return true: Ammounts to giving up
11329         knowledge on whether we return or not, and letting the other case
11330         be responsible for it.
11331
11332 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11333
11334         * driver.cs: Do not load directories for each file processed, only
11335         do it if there is a pattern.
11336
11337         * ecore.cs: Report readonly assigns here as well, as we might have
11338         been resolved only by MemberAccess.
11339
11340         (SimpleName.SimpleNameResolve): Also be useful for LValue
11341         resolution.   We need this to propagate assign to local readonly variables
11342
11343         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11344         do not want to reuse potential criteria memory.
11345
11346         * class.cs (MyEventBuilder): Set reflected_type;
11347
11348         * ecore.cs (Constantify): Added support for constifying bools.
11349
11350         (RootContext.LookupType): Added a cache for values looked up in
11351         the declaration space.
11352
11353         * typemanager.cs (FindMembers): Now is a front-end to
11354         RealFindMembers, and provides a two-level hashtable-based cache to
11355         the request.  
11356
11357         15% performance improvement: from 22.5 to 19.2 seconds.
11358
11359         * expression.cs (IsParamsMethodApplicable): use foreach.
11360         (Invocation.DoResolve): ditto.
11361         (New.DoResolve): ditto.
11362         (ArrayCreation.DoResolve): ditto.
11363
11364         * ecore.cs (FindMostEncompassingType): use foreach.
11365
11366         * delegate.cs (NewDelegate.DoResolve): Use foreach
11367
11368         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11369         (RemoveMethods): use foreach.
11370
11371         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11372         nested foreach statements instead of for, and also break out of
11373         the inner loop once a match is found.
11374
11375         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11376
11377 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11378
11379         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11380         we actually unwrap the expression to allow for extra information
11381         to be extracted. 
11382
11383         * expression.cs: Use Shr_Un on unsigned operations. 
11384
11385 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11386
11387         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11388         applicable operators was not being considered correctly. This closes
11389         the bug Miguel reported.
11390
11391 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11392
11393         * attribute.cs: check that the type derives from System.Attribute
11394         and report the correct error in that case (moved the duplicate code to
11395         its own method, too).
11396
11397 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11398
11399         * attribute.cs: lookup attribute type name as the spec says: first the
11400         bare attribute name and then name + "Attribute" (nant compiles with
11401         mcs after this fix).
11402
11403 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11404
11405         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11406         Because of the way we parse things, we should try to see if a
11407         UIntConstant can fit in an integer.
11408
11409 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11410
11411         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11412         when we are in an explicit context.
11413
11414         (ConvertReferenceExplicit): When converting from Iface type S to Class
11415         T make sure the rules are implemented as an OR.
11416
11417         * parameter.cs (ParameterType): Make it a property for now although the
11418         purpose really isn't anything immediate.
11419
11420         * expression.cs (Is*Applicable): Do better checking on the parameter type
11421         of a ref/out parameter. The ones from the system assemblies are already 
11422         marked with the correct type so we don't need to do any correction.
11423
11424         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11425         the object type is standard too so include that.
11426
11427 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11428
11429         * ecore.cs (StandardConversionExists): Augment with missing code:
11430         deal with IntConstant, LongConstants and Enumerations.
11431
11432         * assign.cs: Report the error, instead of failing silently
11433
11434         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11435         typecontainer that they are declared, because the
11436         typecontainer/namespace will have the list of using clauses that
11437         need to be applied.
11438
11439         Assembly Attributes were escaping the normal registration
11440         mechanism. 
11441
11442         (EmitCode): Apply attributes within an EmitContext that represents
11443         the container they were declared on.
11444
11445         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11446
11447 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11448
11449         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11450         Revamp completely - make much cleaner as we now operate only
11451         on a set of Types.
11452
11453         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11454         to implement the logic detailed in the spec more correctly.
11455
11456         (UserDefinedConversion): Update accordingly.
11457
11458 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11459
11460         * statement.cs: Return flow analysis information up.
11461
11462         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11463         and the default.
11464
11465         (token): Do not consume an extra character before calling
11466         decimal_digits.
11467
11468 2002-05-06  Piers Haken <piersh@friskit.com>
11469
11470         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11471
11472 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11473
11474         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11475         EmitContext during the instance constructor initializer
11476         resolution, to stop access to instance variables.
11477
11478         This is mandated by the spec, last paragraph of the `constructor
11479         initializers' section. 
11480
11481 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11482
11483         * cs-parser.jay, class.cs (Accessor): new class used to represent
11484         an accessor (get or set).  In the past we used `null' to represent
11485         a missing accessor.  But this is ambiguous because there was no
11486         way to tell in abstract indexers/properties if one of them was
11487         specified.
11488
11489         Now there is a way of addressing that.
11490
11491         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11492         instead of FindMembers.
11493
11494         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11495         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11496
11497         * attribute.cs: Treat indexers and properties as the same in terms
11498         of applying attributes
11499
11500         * ecore.cs (FindMostEncompassedType): Use statically initialized
11501         EmptyExpressions()s like we do elsewhere to avoid creating useless
11502         objects (and we take this out of the tight loop).
11503
11504         (GetConversionOperators): Move the code to extract the actual
11505         operators to a separate routine to clean things up.
11506
11507 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11508
11509         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11510         events are always registered FieldBuilders.
11511
11512         * class.cs (FieldBase): New class shared by Fields 
11513
11514         * delegate.cs: If we are a toplevel delegate, use our full name.
11515         If we are a nested delegate, then only use our tail name.
11516
11517 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11518
11519         * expression.cs (IsApplicable): Ensure that we add the "&" to
11520         ref/out types before comparing it with the type of the argument.
11521
11522         (IsParamsMethodApplicable): Ditto.
11523
11524         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11525         silly me ;-)
11526
11527         * delegate.cs : Handle the case when we have more than one applicable
11528         method. Flag an error only when we finish checking all.
11529
11530 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11531
11532         * expression.cs: Add support for boolean static initializers.
11533
11534 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11535
11536         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11537
11538         * parameter.cs (ComputeParameterTypes,
11539         ComputeAndDefineParameterTypes): Better error handling: now we
11540         clear the `types' cache if we fail during any of the type lookups.
11541         We also return the status code correctly to our caller
11542
11543         * delegate.cs: If we fail to define a delegate, abort the extra
11544         steps. 
11545
11546         * expression.cs (Binary.ResolveOperator): for
11547         operator==(object,object) and operator !=(object, object) we also
11548         have to verify that there is an implicit conversion from one to
11549         the other.
11550
11551         (ArrayAccess.DoResolve): Array Access can operate on
11552         non-variables. 
11553
11554 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11555
11556         * assign.cs (CompoundAssign): A new class used as a "flag" that
11557         the assignment actually is happening as part of a compound
11558         assignment operator.
11559
11560         During compound assignment, a few new rules exist to enable things
11561         like:
11562
11563         byte b |= 1 + 2
11564
11565         From the spec:
11566
11567         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11568         to the type of x) if y is implicitly convertible to the type of x,
11569         and the operator is a builtin operator and the return type of the
11570         operator is explicitly convertible to the type of x. 
11571
11572         * rootcontext.cs: Reset warning level to 2.  4 catches various
11573         "interesting" features in mcs, we must clean this up at some
11574         point, but currently am trying to kill other bugs ;-)
11575
11576         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11577         in container classes as well.  
11578
11579         * expression.cs (Binary.ResolveOperator): Handle string case
11580         before anything else (as operator overloading does emit an error
11581         before doing anything else).
11582
11583         This code could go away when we move to a table driven model, but
11584         i could not come up with a good plan last night.
11585
11586 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11587
11588         * typemanager.cs (CSharpName): reimplementation using regex.
11589         * class.cs: added null check for fields in Emit
11590         * rootcontext.cs: set warninglevel to 4
11591
11592 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11593
11594         * typemanager.cs (CSharpName): reimplemented with Lupus
11595         suggestion.
11596
11597 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11598
11599         * statement.cs (If): correclty implement Resolve, because we were
11600         not catching sem errors in there.  The same process is needed
11601         everywhere else. 
11602         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11603
11604
11605         (Statement.Warning_DeadCodeFound): Factorize code.
11606         (While): Report dead code here too.
11607
11608         (Statement): Added Resolve virtual method to allow
11609         for resolution split from the emit code.
11610
11611 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11612
11613         * statement.cs (EmitBoolExpression): No longer try to resolve the
11614         expression here.    
11615         (MakeBoolean): New utility function that resolve, implicitly
11616         converts to boolean and tags the expression. 
11617
11618
11619         (If, Do): Implement dead code elimination.
11620         (While): Implement loop inversion
11621
11622         (Do, While, For, If): Resolve the expression prior to calling our
11623         code generation.
11624
11625 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11626
11627         * class.cs:
11628           - added method Report28 (warning: program has more than one entry point)
11629           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11630           - modified method Method.Define, the part at the end of the method
11631
11632         * rootcontext.cs: added static public Location EntryPointLocation;
11633           
11634         * ../errors/cs0028.cs : Add test case for the above warning.              
11635
11636         * typemanager.cs:
11637           - modified method CSharpName to allow arrays of primitive type to
11638             be printed nicely (e.g. instead of System.Int32[][] it now prints
11639             int[][])
11640           - added method CSharpSignature: returns the signature of a method
11641             in string format to be used in reporting errors, warnings, etc.
11642
11643         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11644         with String.Empty.
11645
11646 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11647
11648         * delegate.cs (Define): Fix extremely silly bug where I was
11649         setting the type of the 'object' parameter of the BeginInvoke
11650         method to System.IAsyncResult instead of System.Object ;-)
11651
11652 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11653
11654         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11655         here. 
11656
11657         (Constructor.Emit): return if we fail to initialize the
11658         constructor.  Another door closed!  
11659
11660         * expression.cs (New.DoResolve): Improve error message (from -6 to
11661         1501).  Use DeclaredOnly lookup to find the exact constructor.
11662
11663         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11664         loop.  This is useful.
11665
11666         * cs-parser.jay: Adjust the default parameters so that destructors
11667         have the proper signature.
11668
11669 2002-04-26  Martin Baulig  <martin@gnome.org>
11670
11671         * driver.cs (LoadAssembly): If `assembly' contains any characters
11672         which are only valid in path names and not in assembly names
11673         (currently slash, backslash and point), use Assembly.LoadFrom ()
11674         instead of Assembly.Load () on the `assembly' (before iteration
11675         over the link_paths).
11676
11677 2002-04-26  Martin Baulig  <martin@gnome.org>
11678
11679         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11680
11681 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11682
11683         * class.cs (Property): use the new typemanager.MemberLookup
11684
11685         (TypeContainer.MemberLookup): Implement using the
11686         TypeManager.MemberLookup now. 
11687
11688         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11689         and return MemberInfos, so that these can be used without an
11690         EmitContext (what we had before).
11691
11692 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11693
11694         * expression.cs: Fix the case where the argument to params if the
11695         type of the params.  I omitted handling this before.   Fixed
11696
11697 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11698
11699         * driver.cs: Call BootCorlib_PopulateCoreType
11700
11701         * class.cs (Property.CheckBase): Check for properties only, not
11702         for all members. 
11703
11704         * interface.cs: Temporary hack: try/catch around the
11705         CustomAttributeBuilder, because I am getting an exception that I
11706         do not understand.
11707
11708         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11709         types whose definitions are required to be there (attributes are
11710         defined before standard types).
11711
11712         Compute definitions as we boot the various types, as they are used
11713         immediately (value_type class will need object_type, but if we do
11714         not initialize object_type, we will pass a null, which will let
11715         the runtime pick the System.Object from the existing corlib, which
11716         is not what we want).
11717
11718 2002-04-22  Patrik Torstensson <totte@labs2.com>
11719
11720         * cs-tokenizer.cs: fixed a number of trim() issues.
11721
11722 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11723
11724         * expression.cs (Argument.Type): Ensure that we return the correct
11725         type when we have out or ref parameters [in which case we 
11726         append a "&"].
11727
11728 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11729
11730         * class.cs (Property, Indexer): Allow extern modifier in there. 
11731
11732         * typemanager.cs (InitBaseTypes): Initializes object_type and
11733         value_type, since those will be used early on during the bootstrap
11734         process to compile corlib.
11735
11736         (InitCoreTypes): Move code from here to InitBaseTypes.
11737
11738 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11739
11740         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11741         single-dimension arrays as using the ldlen opcode.  
11742
11743         Daniel Lewis discovered this optimization.  
11744
11745         * typemanager.cs: Add signature for System.Array::get_Length
11746
11747 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11748
11749         * statement.cs: report the error when the foreach does not apply to an
11750         array nor a collection.
11751
11752 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11753
11754         * expression.cs: Add implicit conversions to the operator ~.
11755
11756         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11757
11758         * typemanager.cs: Locate the decimal constructor.
11759
11760 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11761
11762         * attribute.cs: use the new property of TypeOf.
11763         * expression.cs: added 'get' property around typearg.
11764
11765         These changes fix a build breaker reported by NickD. Is this the
11766         correct way to fix?  If not, please, revert my changes and make it
11767         work :-).
11768
11769 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11770
11771         * attribute.cs: Add support for typeof in attribute invocations.
11772         I am not sure that this is right though.
11773
11774 2002-04-14  Duncan Mak  <duncan@ximian.com>
11775
11776         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11777         Binary.Operator.Division case.
11778
11779 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11780
11781         * class.cs (DefineType): Ensure that we do a proper check on
11782         attribute types and also register it with the TypeManager.
11783
11784         (TypeContainer.Targets): The default for attribute types is
11785         AttributeTargets.All.
11786
11787         * attribute.cs (ApplyAttributes): Registering the attribute type
11788         is done elsewhere, not when we discover we have a Usage attribute.
11789
11790 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11791
11792         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11793         and get rid of is_delegate parameter.
11794
11795         * everywhere : update.
11796
11797 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11798
11799         * cs-parser.jay (compilation_unit): Revamp completely to use
11800         some new ideas that I got from Rhys' grammar to solve the problems
11801         with assembly level attributes.
11802
11803         (outer_declaration): New grammar production.
11804
11805         (attribute_sections): Add.
11806
11807         (opt_attributes): Base on attribute_sections
11808
11809         (namespace_declaration): Allow opt_attributes to tackle the case
11810         when we have assembly level attributes - we are clever in this
11811         regard now ;-)
11812
11813         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11814         attributes in the non-global context.
11815
11816         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11817         instead of SetGlobalAttributes.
11818
11819         * class.cs, rootcontext.cs : Ensure we define and generate 
11820         attribute types before anything else.
11821
11822         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11823         and flag the new error -20 for the case when the attribute type
11824         does not have valid targets specified. csc does not catch this.
11825
11826         * ../errors/errors.txt : update for error # -20
11827
11828 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11829
11830         * support.cs (InternalParameters.ParameterModifier): Do some null
11831         checking and return sane values.
11832
11833         * class.cs (Method.Define): If we are a PInvoke method, ensure
11834         that we are static and extern. Report error # 601
11835
11836         * ../errors/cs0601.cs : Add test case for the above error.
11837
11838 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11839
11840         * rootcontext.cs (attribute_types): We need to keep type of
11841         all attribute types separately and emit code for them first.
11842
11843         (RegisterAttribute) : Implement.
11844
11845         * class.cs (DefineType): Check if the current Type is a custom
11846         attribute type and register it accordingly.
11847
11848         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11849         adding the first attribute twice and rename to
11850
11851         (SetGlobalAttributes): this.
11852
11853         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11854         lookups.
11855
11856         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11857         if we are processing global arguments. Hmm, I am unsure of this.
11858
11859 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11860
11861         * expression.cs: added static array of strings to avoid calling
11862         Enum.ToString () for Operator in Binary. Significant recover of
11863         performance.
11864
11865 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11866
11867         * class.cs (FindMembers): Allow the Builders of the various
11868         members to be null.  If they are skip them.  This only happens
11869         during the PInvoke declaration.
11870
11871 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11872
11873         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11874         failure, so we do not keep going afterwards.
11875
11876         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11877         wanted to pass `false' as the `is_delegate' argument.  If this is
11878         the case, why not use delegate_type == null to mean `is_delegate =
11879         false' and anything else as is_delegate = true.
11880
11881 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11882
11883         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11884         code for the section, not the beginning of the tests.
11885
11886 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11887
11888         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11889
11890         * expression.cs (Binary): same.  Warn about errors where we have
11891         Enum/Enum in operator + as well.
11892
11893 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11894
11895         * statement.cs:
11896                 - added support for switch(bool)
11897                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11898                 - add TableSwitchEmit() to handle table-based switch statements
11899
11900 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11901
11902         * expression.cs (Invocation.OverloadResolve): Factor out code which
11903         does parameter compatibility checking with arguments so that we can 
11904         re-use the code even from Delegate.VerifyApplicability
11905
11906         (VerifyArgumentsCompat): Move above code here.
11907
11908         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11909         and instead make a call to the above method.
11910
11911 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11912
11913         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11914         We use it to keep track of classes which are attribute types.
11915
11916 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11917
11918         * delegate.cs (Delegate.Define): Correctly define the types in the
11919         presence of fixed and array parameters.
11920
11921         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11922         doing FindMembers.
11923
11924         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11925         include NonPublic after the first iteration.
11926
11927         * class.cs (Indexer.CheckBase): Only check if both parents are
11928         non-null. 
11929
11930         * cs-parser.jay (accessor_body): If empty, set to null.
11931
11932         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11933         same code path here to resolve constants names that we did have in
11934         MemberAccess.DoResolve.  There is too much code duplicated here.
11935
11936 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11937
11938         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11939
11940         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11941         to MakeUnionSet.
11942
11943         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11944         tokens, numbers and strings.
11945
11946         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11947         parenthesis.
11948
11949         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11950         asyncronous parameters and the regular parameters.  
11951
11952         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11953         specify the target directory.
11954
11955         * expression.cs: (This.DoResolve): Simplify
11956         (As.Emit): Optimize, do not generate IsInst if the expression is
11957         always of the given type.
11958
11959         (Is.DoResolve): Bug fix, we were reporting both always/never for
11960         the is expression.
11961
11962         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11963         creating too many unnecessary arrays.
11964
11965 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11966
11967         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11968         fields instead of rolling our own initializer.   Takes care of all
11969         implicit conversions, and drops unnecessary static checks/argument.
11970
11971 2002-03-31  Dick Porter  <dick@ximian.com>
11972
11973         * driver.cs: use the GetDirectories() return values properly, and
11974         use "/" as path separator.
11975
11976 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11977
11978         * expression.cs (Unary): Optimize - - expr into expr.
11979         (Binary): Optimize a + (-b) into a -b.
11980
11981         * codegen.cs (CodeGen): Made all methods static.
11982
11983 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11984
11985         * rootcontext.cs: 
11986
11987         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11988         TypeBuilder property.
11989
11990         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11991         instead. 
11992
11993         * tree.cs: Removed the various RecordXXXX, and replaced with a
11994         single RecordDecl.  Removed all the accessor methods, and just
11995         left a single access point Type 
11996
11997         * enum.cs: Rename DefineEnum to DefineType.
11998
11999         * decl.cs: New abstract method `DefineType' used to unify the
12000         Defines for Enumerations, Interfaces, TypeContainers and
12001         Delegates.
12002
12003         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12004         LookupBaseClasses method that used to live in class.cs and
12005         interface.cs here, and renamed to FindType.
12006
12007         * delegate.cs: Implement DefineType.  Take advantage of the
12008         refactored pattern for locating the parent builder without taking
12009         the parent_builder argument (which we know does not work if we are
12010         nested, and triggering a toplevel definition).
12011
12012 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12013
12014         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12015         accessibility of a member has changed during override and report
12016         an error if so.
12017
12018         * class.cs (Method.Define, Property.Define): Only complain on
12019         overrides if the method is private, any other accessibility is
12020         fine (and since we just checked the permission is the same, we are
12021         good to go).
12022
12023         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12024         and elif are processed always.  The other pre-processing
12025         directives are only processed if we are "taking" the path
12026
12027 2002-03-29  Martin Baulig  <martin@gnome.org>
12028
12029         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12030         current location is not Null.
12031
12032         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12033         a separate method so we can profile it.
12034
12035         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12036         `span.Seconds' are just seconds, but no minutes or hours.
12037         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12038
12039 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12040
12041         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12042         Remove the gratuitous set of Final:
12043
12044                                 // If an interface implementation, then we can set Final.
12045                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12046                                     implementing.DeclaringType.IsInterface)
12047                                         flags |= MethodAttributes.Final;
12048
12049         I do not know what I was smoking when I used that.
12050
12051
12052         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12053         step into fixing the name resolution issues for delegates and
12054         unifying the toplevel name resolution.
12055
12056 2002-03-28  Martin Baulig  <martin@gnome.org>
12057
12058         * class.cs (Method.Emit): If we have a symbol writer, call its
12059         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12060         tell it about the current method.
12061
12062         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12063         writer that we're going to emit the first byte of IL code for a new
12064         statement (a new source line).
12065         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12066         EmitContext.Mark() before emitting any code.
12067
12068         * location.cs (SymbolDocument): Return null when we're Null.
12069
12070         * statement.cs (Statement): Moved the `Location loc' variable here.
12071         (Statement.EmitBoolExpression): If we have a symbol writer, call
12072         ec.Mark() before emitting any code to tell it that we're at the
12073         beginning of a new statement.
12074         (StatementExpression): Added `Location' argument to the constructor.
12075         (Block): Added public readonly variable `StartLocation' and public
12076         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12077         (Block): Added constructor which takes a start and end location.
12078         (Block.SetEndLocation): New method. This sets the end location.
12079         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12080         local variables we create.
12081         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12082         each statement and do also mark the begin and end of the block.
12083
12084         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12085         tell it the current lexer.Location, use Location.Null for the end of the
12086         block.
12087         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12088         current block, set its end location using SetEndLocation().
12089         (statement_expression): StatementExpression constructor now takes the
12090         lexer.Location as additional argument.
12091         (for_statement, declare_local_variables): Likewise.
12092         (declare_local_variables): When creating a new implicit block, use the
12093         new Block constructor and pass it the lexer.Location.
12094
12095 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12096
12097         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12098         members also on the parent interfaces recursively.
12099
12100 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12101
12102         * report.cs: Use new formats, since Gonzalo finished the missing
12103         bits. 
12104
12105         * expression.cs (Binary.ResolveOperator): added missing operator|
12106         operator& and operator^ for bool/bool.
12107
12108         * cs-parser.jay: CheckDef now takes a Location argument that is
12109         used to report errors more precisly (instead of reporting the end
12110         of a definition, we try to track something which is a lot closer
12111         to the source of the problem).
12112
12113         * cs-tokenizer.cs: Track global token use, so we can properly flag
12114         the use of #define/#undef after the first token has been seen.
12115
12116         Also, rename the reportXXXX to Error_DescriptiveName
12117
12118         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12119         TypeContainer, so that Enum and Interface can use this too.
12120
12121         * class.cs (TypeContainer.LookupInterfaceOrClass,
12122         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12123         `builder' argument.  Typically this was used to pass the parent
12124         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12125         the definition).  
12126
12127         The problem is that a nested class could trigger the definition of
12128         a toplevel class, and the builder would be obviously wrong in that
12129         case. 
12130
12131         So we drop this argument, and we compute dynamically the
12132         TypeBuilder/ModuleBuilder (the correct information was available
12133         to us anyways from DeclSpace.Parent)
12134
12135         * interface.cs (Interface.DefineInterface): Drop builder
12136         parameter cleanup like class.cs
12137
12138         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12139         like class.cs
12140
12141         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12142         values. 
12143
12144         (Try.Emit): Propagate the returns value from the statement.
12145
12146         (Return.Emit): Even if we are leavning 
12147
12148         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12149
12150         * modifiers.cs: Fix the computation of MethodAttributes flags.
12151
12152 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12153
12154         * driver.cs: allow compilation of files that start with '/'.
12155         Add a default case when checking the argument of --target.
12156
12157 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12158
12159         * interface.cs: Implement the same search algorithm for types in
12160         the interface code.
12161
12162         * delegate.cs: Do not allow multiple definition.
12163
12164         * Recovered ChangeLog that got accidentally amputated
12165
12166         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12167
12168         * rootcontext.cs: Load manually enum to allow core classes to
12169         contain enumerations.
12170
12171         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12172         Update to new static methods in TypeManager.
12173
12174         * typemanager.cs (GetMethod, GetConstructor): Use our
12175         implementation of FindMembers to find the members, since during
12176         corlib compilation, the types are TypeBuilders and GetMethod and
12177         GetConstructor do not work.
12178
12179         Make all methods in TypeManager static.
12180
12181         (InitCodeHelpers): Split the functionality from
12182         the InitCodeTypes function.
12183
12184         * driver.cs: Call InitCodeHelpers after we have populated the
12185         types. 
12186
12187         * cs-parser.jay (delegate_declaration): we did not used to compute
12188         the delegate name correctly for void delegates.
12189
12190 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12191
12192         * rootcontext.cs (RootContext): Init the interface_resolve_order
12193         and type_container_resolve_order always.
12194
12195         (ResolveCore, BootstrapCorlib_ResolveClass,
12196         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12197         compiler when compiling with --nostdlib
12198
12199         * class.cs (TypeContainer.DefineType): Check that our parent is
12200         not null.  This test is most important when we are bootstraping
12201         the core types.
12202
12203         * codegen.cs: Split out the symbol writing code.
12204
12205 2002-03-25  Martin Baulig  <martin@gnome.org>
12206
12207         * driver.cs (-g): Made -g an alias for --debug.
12208
12209 2002-03-24  Martin Baulig  <martin@gnome.org>
12210
12211         * codegen.cs (SymbolWriter): New public variable. Returns the
12212         current symbol writer.
12213         (CodeGen): Added `bool want_debugging_support' argument to the
12214          constructor. If true, tell the ModuleBuild that we want debugging
12215         support and ask it for the ISymbolWriter.
12216         (Save): If we have a symbol writer, call it's Close() method after
12217         saving the assembly.
12218
12219         * driver.c (--debug): New command line argument to create a
12220         debugger information file.
12221
12222         * location.cs (SymbolDocument): New public property. Returns an
12223         ISymbolDocumentWriter object for the current source file or null
12224         if we don't have a symbol writer.
12225
12226 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12227
12228         * driver.cs (LoadAssembly): Correctly return when all the paths
12229         have been tried and not before.
12230
12231         * statement.cs (Switch.Emit): return the actual coverage for this
12232         statement (returns/not-returns)
12233
12234         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12235         switch of the statement if we are the last switch section.  That
12236         kills two problems: try/catch problems (we used to emit an empty
12237         nop at the end) and switch statements where all branches would
12238         return. 
12239
12240 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12241
12242         * driver.cs: Add default assemblies (the equivalent to the
12243         Microsoft CSC.RSP file)
12244
12245         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12246         also update tokens_seen and set it to false.
12247
12248         * driver.cs: Implement --recurse for Mike.
12249
12250         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12251         correctly splitting out the paths.
12252
12253 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12254
12255         * interface.cs (Interface.PopulateProperty): Instead of using
12256         `parent' as the declaration space for the set parameters, use
12257         `this' 
12258
12259         * support.cs (InternalParameters): InternalParameters constructor
12260         takes a DeclSpace instead of a TypeContainer.
12261
12262         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12263         types are being initialized, load the address of it before calling
12264         the function.  
12265
12266         (New): Provide a mechanism to disable the generation of local
12267         value type temporaries when the caller will be providing us with
12268         an address to store it.
12269
12270         (ArrayCreation.EmitDynamicInitializers): Use it.
12271
12272 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12273
12274         * expression.cs (Invocation.EmitArguments): Only probe for array
12275         property if there is more than one argument.  Sorry about that.
12276
12277         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12278         empty param arrays.
12279
12280         * class.cs (Method.LabelParameters): Fix incorrect code path that
12281         prevented the `ParamArrayAttribute' from being applied to the
12282         params attribute.
12283
12284 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12285
12286         * support.cs (ReflectionParameters): Correctly compute whether the
12287         last argument is a params array.  Fixes the problem with
12288         string.Split ('a')
12289
12290         * typemanager.cs: Make the assemblies array always be non-null
12291         (empty, but non-null)
12292
12293         * tree.cs (RecordDecl): New function that abstracts the recording
12294         of names.  This reports error 101, and provides a pointer to the
12295         previous declaration.  Fixes a crash in the compiler.
12296
12297         * cs-parser.jay (constructor_declaration): Update to new grammar,
12298         and provide a constructor_body that can be empty.
12299
12300 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12301
12302         * driver.cs: Add support for --resources.
12303
12304         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12305         Make all types for the various array helper methods be integer.
12306
12307         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12308         CheckState to ConvCast.
12309
12310         (ConvCast): Now it takes a `checked' state argument, to avoid
12311         depending on the emit context for the conversion, and just using
12312         the resolve time setting.
12313
12314         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12315         instead of Invocation.EmitArguments.  We do not emit the original
12316         arguments, instead we emit those which have been converted to
12317         unsigned int expressions.
12318
12319         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12320
12321         * codegen.cs: ditto.
12322
12323         * expression.cs (LocalVariableReference): Drop the use of the
12324         Store function that depended on the variable index.
12325
12326         * statement.cs (VariableInfo): Drop the `Idx' property from this
12327         class, as this is not taking into account the indexes for
12328         temporaries tat we generate during the execution, getting the
12329         indexes wrong.
12330
12331         * class.cs: First emit class initializers, then call the parent
12332         constructor. 
12333
12334         * expression.cs (Binary): Fix opcode emision.
12335         (UnaryMutator.EmitCode): Support checked code generation
12336
12337         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12338         matches for events for both the Static and Instance scans,
12339         pointing to the same element.   Fix that.
12340
12341 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12342
12343         * rootcontext.cs (ResolveTree): Always set the
12344         interface_resolve_order, because nested interfaces will be calling
12345         into us.
12346
12347         * class.cs (GetInterfaceOrClass): Track the same resolution
12348         process used by TypeManager.LookupType.  This fixes the nested
12349         type lookups in class declarations (separate path from
12350         LookupType). 
12351
12352         (TypeContainer.DefineType): Also define nested interfaces.
12353         (TypeContainer.RegisterOrder): New public function used to
12354         register the order in which child interfaces need to be closed.
12355
12356         Nested interfaces need to be closed after their parents have been
12357         created. 
12358
12359         * interface.cs (InterfaceAttr): Put all the logic for computing
12360         the interface attribute here. 
12361
12362         (DefineInterface): Register our interface order with the
12363         RootContext or with the TypeContainer depending on the case.
12364
12365 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12366
12367         * cs-parser.jay: rework foreach statement to work with the new
12368         changes to the policy on SimpleNames.
12369
12370         * report.cs: support Stacktrace on warnings as well.
12371
12372         * makefile: drop --unsafe and /unsafe from the compile.
12373
12374 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12375
12376         * ecore.cs (StandardConversionExists): Modify to take an Expression
12377         as the first parameter. Ensure we do null -> reference type conversion
12378         checking.
12379
12380         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12381         temporary Expression objects.
12382
12383 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12384
12385         * interface.cs: workaround bug in method overloading resolution
12386         (there is already a bugzilla bug for it).
12387
12388 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12389
12390         We could also solve this problem by having a separate path for
12391         performing type lookups, instead of DoResolve, we could have a
12392         ResolveType entry point, and only participating pieces of the
12393         production (simplename, deref, array) would implement this. 
12394
12395         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12396         signal SimpleName to only resolve type names and not attempt to
12397         resolve anything else.
12398
12399         * expression.cs (Cast): Set the flag.
12400
12401         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12402
12403         * class.cs: Only report 108 if there is no `new' modifier.
12404
12405         * cs-parser.jay: rework foreach statement to work with the new
12406         changes to the policy on SimpleNames.
12407
12408         * report.cs: support Stacktrace on warnings as well.
12409
12410         * makefile: drop --unsafe and /unsafe from the compile.
12411
12412 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12413
12414         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12415         lookups here, instead of doing that at parse time.  This means
12416         that our grammar will not introduce `LocalVariableReferences' as
12417         expressions at this point.  That solves the problem of code like
12418         this:
12419
12420         class X {
12421            static void Main ()
12422            { int X = 1;
12423             { X x = null }}}
12424
12425         This is only half the fix.  The full fix requires parameters to
12426         also be handled in this way.
12427
12428         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12429         makes the use more obvious of the DeclSpace.  The
12430         ec.TypeContainer.TypeBuilder is now only used to pull the
12431         TypeBuilder for it.
12432
12433         My theory is that I can get rid of the TypeBuilder completely from
12434         the EmitContext, and have typecasts where it is used (from
12435         DeclSpace to where it matters).  
12436
12437         The only pending problem is that the code that implements Aliases
12438         is on TypeContainer, and probably should go in DeclSpace.
12439
12440         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12441         lookups here, instead of doing that at parse time.  This means
12442         that our grammar will not introduce `LocalVariableReferences' as
12443         expressions at this point.  That solves the problem of code like
12444         this:
12445
12446         class X {
12447            static void Main ()
12448            { int X = 1;
12449             { X x = null }}}
12450
12451         This is only half the fix.  The full fix requires parameters to
12452         also be handled in this way.
12453
12454         * class.cs (Property.DefineMethod): When implementing an interface
12455         method, set newslot, when implementing an abstract method, do not
12456         set the flag (before we tried never setting it, or always setting
12457         it, which is the difference).
12458         (Indexer.DefineMethod): same.
12459         (Method.DefineMethod): same.
12460
12461         * ecore.cs: Only set the status used flag if we get back a Field.
12462
12463         * attribute.cs: Temporary hack, so Paolo can keep working.
12464
12465 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12466
12467         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12468         the unmanaged type in the case we have a MarshalAs attribute.
12469
12470         (Resolve): Handle the case when we are parsing the special MarshalAs
12471         attribute [we need to store the unmanaged type to use later]
12472
12473         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12474         MarshalAs Attribute.
12475
12476         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12477         on parameters and accordingly set the marshalling info.
12478
12479 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12480
12481         * class.cs: Optimizing slightly by removing redundant code after
12482         we switched to the `NoTypes' return value.
12483         (Property.DefineMethod): use NoTypes here too.
12484
12485         This fixes the bug I introduced in my last batch of changes.
12486
12487 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12488
12489         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12490
12491         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12492         Enums since those are types too. 
12493
12494         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12495
12496         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12497         thanks to a call during the lookup process.
12498
12499 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12500
12501         * statement.cs (Foreach): Lots of work to accomodate a particular
12502         kind of foreach statement that I had not kept in mind.  It is
12503         possible to have foreachs on classes that provide a GetEnumerator
12504         method that return objects that implement the "pattern" for using
12505         a foreach, there is no need to support GetEnumerator
12506         specifically. 
12507
12508         This is needed to compile nant.
12509
12510         * decl.cs: Only report 114 if the member is not `Finalize' and if
12511         the warning level is at least 2.
12512
12513         * class.cs: Moved the compare function from Method to
12514         MethodSignature. 
12515
12516         (MethodSignature.InheritableMemberSignatureCompare): Add new
12517         filter function that is used to extract inheritable methods from a
12518         class. 
12519
12520         (Method.Define): Use the new `inheritable_method_signature_filter'
12521         delegate
12522
12523         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12524         command. 
12525
12526 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12527
12528         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12529
12530         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12531
12532         * expression.cs: Pass location information to
12533         ConvertImplicitStandard. 
12534
12535         * class.cs: Added debugging code to track return values from
12536         interfaces. 
12537
12538 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12539
12540         * expression.cs (Is.DoResolve): If either side of the `is' is an
12541         interface, do not flag the warning.
12542
12543         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12544         for interfaces
12545
12546         * report.cs: Allow for --fatal to be used with --probe.
12547
12548         * typemanager.cs (NoTypes): Move the definition for the empty Type
12549         array here. 
12550
12551         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12552         properties. 
12553         (TypeContainer.DefineProxy): New function used to proxy to parent
12554         implementations when implementing interfaces.
12555         (TypeContainer.ParentImplements): used to lookup if our parent
12556         implements a public function that is required by an interface.
12557         (TypeContainer.VerifyPendingMethods): Hook this up.
12558
12559         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12560         `modules' and `assemblies' arraylists into arrays.  We only grow
12561         these are the very early start up of the program, so this improves
12562         the speedof LookupType (nicely measured).
12563
12564         * expression.cs (MakeByteBlob): Replaced unsafe code with
12565         BitConverter, as suggested by Paolo.
12566
12567         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12568         folding of string concatenation, but if either side is a string,
12569         and the other is not, then return null, and let the runtime use
12570         the concatenation on the string plus the object (using
12571         `Object.ToString'). 
12572
12573 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12574
12575         Constant Folding has been implemented now.
12576
12577         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12578         the error instead on types that are not supported in one's
12579         complement. 
12580
12581         * constant.cs (Constant and all children): New set of functions to
12582         perform implict and explicit conversions.
12583
12584         * ecore.cs (EnumConstant): Implement the new functions to perform
12585         conversion by proxying to the child expression.
12586
12587         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12588         own separate setting that can not be turned off from the command
12589         line using --unchecked or --checked and is only controlled using
12590         the checked/unchecked statements and expressions.  This setting is
12591         used by the constant folder to flag errors.
12592
12593         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12594         ConstantCheckState as well.   
12595
12596         During Resolve, they also have to flag the state, because the
12597         constant folder runs completely in the Resolve phase.
12598
12599         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12600         well.
12601
12602 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12603
12604         * cfold.cs: New file, this file contains the constant folder.
12605
12606         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12607         argument to track whether we are using the resulting address to
12608         load or store a value and provide better error messages. 
12609
12610         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12611         new AddressOf arguments.
12612
12613         * statement.cs (Foreach.EmitCollectionForeach): Update
12614
12615         * expression.cs (Argument.Emit): Call AddressOf with proper
12616         arguments to track usage.
12617
12618         (New.DoEmit): Call AddressOf with new arguments.
12619
12620         (Unary.Emit): Adjust AddressOf call.
12621
12622 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12623
12624         * cs-parser.jay (member_access): Change the case for pre-defined types
12625         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12626         this suggestion.
12627
12628         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12629         a method body.
12630
12631         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12632         essentially like methods and apply attributes like MethodImplOptions to them too.
12633
12634         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12635         not being null.
12636
12637         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12638         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12639         is the DeclSpace.
12640
12641         * Update code everywhere accordingly.
12642
12643         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12644
12645         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12646
12647 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12648
12649         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12650         try performing lookups against those instead of jumping straight into using
12651         the 'using' clauses.
12652
12653         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12654
12655         (LookupType): Perform lookups in implicit parents too.
12656
12657         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12658         sequence as RootContext.LookupType. 
12659
12660         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12661         the various cases of namespace lookups into this method.
12662
12663 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12664
12665         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12666         in positional arguments)
12667
12668         * class.cs (Operator): Update the AllowedModifiers to contain
12669         extern. 
12670
12671         * cs-parser.jay: Update operator declaration to allow for the
12672         operator body to be empty.
12673
12674         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12675         values. 
12676
12677 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12678
12679         * class.cs (Method.Emit): Label parameters.
12680
12681         * driver.cs: Return 1 or 0 as the program exit code.
12682
12683 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12684
12685         * expression.cs: Special case the `null' object when trying to
12686         auto-compute the type, as anything can be explicitly converted to
12687         that. 
12688
12689         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12690         spotting this Paolo.
12691
12692         (Expression.ImplicitNumericConversion): Perform comparissions of
12693         the type using the underlying type in the case of an enumeration
12694         rather than using the enumeration type for the compare.
12695
12696         Cope with the underlying == type case, which is not possible to
12697         catch before. 
12698
12699         (Expression.ConvertNumericExplicit): Perform comparissions of
12700         the type using the underlying type in the case of an enumeration
12701         rather than using the enumeration type for the compare.
12702
12703         * driver.cs: If the user does not supply an extension, assume .exe
12704
12705         * cs-parser.jay (if_statement): Rewrote so that we can track the
12706         location for the if statement.
12707
12708         * expression.cs (Binary.ConstantFold): Only concat strings when
12709         the operation is "+", not everything ;-)
12710
12711         * statement.cs (Statement.EmitBoolExpression): Take a location
12712         argument. 
12713         (If, While, Do): Track location.
12714
12715         * expression.cs (Binary.ResolveOperator): In the object + string
12716         case, I was missing a call to ConvertImplicit
12717
12718 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12719
12720         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12721         Location arguments. Ensure we use RootContext.LookupType to do our work
12722         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12723
12724         * interface.cs (PopulateMethod): Handle the type of the parameter being
12725         null gracefully.
12726
12727         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12728         have a params method with no fixed arguments and a call is made with no
12729         arguments.
12730
12731 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12732
12733         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12734         the verbatim-string-literal
12735
12736         * support.cs (InternalParameters.ParameterModifier): handle null
12737         fixed parameters.
12738         (InternalParameters.ParameterType): ditto.
12739
12740         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12741         duplicating the name of the variable parameter.
12742         (GetParameterByName): Fix bug where we were not looking up array
12743         paramters if they were the only present (thanks Paolo!).
12744         (GetParameterInfo): We only have an empty set of types if both
12745         fixed and array are set to null.
12746         (GetParameterInfo-idx): Handle FixedParameter == null
12747
12748         * cs-parser.jay: Handle the case where there is no catch
12749         statements (missing null test).
12750
12751 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12752
12753         * driver.cs (MainDriver): Be conservative on our command line
12754         handling.
12755
12756         Catch DirectoryNotFoundException when calling GetFiles.
12757
12758         (SplitPathAndPattern): Used to split the input specification into
12759         a path and a pattern that we can feed to Directory.GetFiles.
12760
12761 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12762
12763         * statement.cs (Fixed): Implement the last case of the Fixed
12764         statement (string handling).
12765
12766         * expression.cs (StringPtr): New class used to return a char * to
12767         a string;  Used by the Fixed statement.
12768
12769         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12770
12771         * expression.cs (Binary.ResolveOperator): Remove redundant
12772         MemberLookup pn parent type.
12773         Optimize union call, we do not need a union if the types are the same.
12774         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12775         type.
12776
12777         Specialize the use of MemberLookup everywhere, instead of using
12778         the default settings. 
12779
12780         (StackAlloc): Implement stackalloc keyword.
12781
12782         * cs-parser.jay: Add rule to parse stackalloc.
12783
12784         * driver.cs: Handle /h, /help, /?
12785
12786         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12787         before we supported unsafe code.
12788
12789         * makefile: add --unsafe to the self compilation of mcs.
12790
12791 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12792
12793         * expression.cs (PointerArithmetic): New class that is used to
12794         perform pointer arithmetic.
12795         (Binary.Resolve): Handle pointer arithmetic
12796         Handle pointer comparission.
12797         (ArrayPtr): Utility expression class that is used to take the
12798         address of an array.
12799
12800         (ElementAccess): Implement array access for pointers
12801
12802         * statement.cs (Fixed): Implement fixed statement for arrays, we
12803         are missing one more case before we are done.
12804
12805         * expression.cs (Indirection): Implement EmitAssign and set the
12806         ExprClass to Variable.  This allows pointer dereferences to be
12807         treated as variables, and to have values assigned to them.
12808
12809         * ecore.cs (Expression.StoreFromPtr): New utility function to
12810         store values dereferencing.
12811
12812 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12813
12814         * expression.cs (Binary.ResolveOperator): Ensure that we are
12815         not trying to operate on a void type - this fixes the reported
12816         bug.
12817
12818         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12819         the parent implementation is sealed.
12820
12821         * ../errors/cs0239.cs : Add.
12822
12823         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12824
12825         * typemanager.cs (unverifiable_code_type): Corresponds to 
12826         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12827         which have unsafe code in them.
12828
12829         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12830         unsafe context.
12831
12832 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12833
12834         * cs-tokenizer.cs: Add support for @"litreal strings"
12835
12836         Make tokenizer accept pre-processor directives
12837         on any column (remove the old C-like limitation). 
12838
12839         * rootcontext.cs (EmitCode): Emit any global attributes.
12840         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12841
12842         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12843
12844         * cs-parser.jay: Add support for global attributes.  
12845
12846 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12847
12848         * expression.cs (Indirection): New helper class.  Unary will
12849         create Indirection classes to be able to implement the
12850         IMemoryLocation interface on it.
12851
12852 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12853
12854         * cs-parser.jay (fixed_statement): reference the right statement.
12855
12856         * statement.cs (Fixed.Emit): Finish implementing the fixed
12857         statement for the &x case.
12858
12859 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12860
12861         * class.cs (Property.Define, Method.Define): Remove newslot when
12862         `implementing'.  
12863
12864         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12865         wrong.  NewSlot should only be used if the `new' keyword is present.
12866
12867         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12868         locating our system dir.  Sorry about this.
12869
12870 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12871
12872         * driver.cs (GetSystemDir): Compute correctly the location of our
12873         system assemblies.  I was using the compiler directory instead of
12874         the library directory.
12875
12876 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12877
12878         * expression.cs (BetterFunction): Put back in what Miguel commented out
12879         since it is the correct fix. The problem is elsewhere ;-)
12880
12881         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12882         parameters of the parms method are themselves compatible or not !
12883
12884         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12885         to check that a class implements an interface before saying that an implicit
12886         conversion was allowed. Use ImplementsInterface to do the checking.
12887
12888 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12889
12890         * class.cs (Method.Define): Track whether we are an explicit
12891         implementation or not.  And only call DefineMethodOverride if we
12892         are an explicit implementation.
12893
12894         (Property.DefineMethod): Ditto.
12895
12896 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12897
12898         * expression.cs (BetterFunction): Catch hideous bug which was
12899          preventing us from detecting ambiguous calls due to implicit casts i.e
12900         cs0121.
12901
12902 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12903
12904         * support.cs (Pair): Remove un-needed method.  I figured why I was
12905         getting the error in cs-parser.jay, the variable in a foreach loop
12906         is readonly, and the compiler does not really treat this as a variable.
12907
12908         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12909         instead of EQUALS in grammar.  
12910
12911         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12912
12913         * expression.cs (Unary.DoResolve): Check whether the argument is
12914         managed or not.
12915
12916 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12917
12918         * support.cs: Api for Pair to set a value.  Despite the fact that
12919         the variables are public the MS C# compiler refuses to compile
12920         code that accesses the field if the variable is part of a foreach
12921         statement. 
12922
12923         * statement.cs (Fixed): Begin implementation of the fixed
12924         statement.
12925
12926         (Block.AddVariable): Return the VariableInfo on success and null
12927         on failure instead of true/false. 
12928
12929         * cs-parser.jay (foreach): Catch errors on variables already
12930         defined (we were ignoring this value before) and properly unwind
12931         the block hierarchy
12932
12933         (fixed_statement): grammar for the fixed statement.
12934
12935 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12936
12937         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12938         pointer types to be incretemented.
12939
12940         (SizeOf): Implement.
12941
12942         * cs-parser.jay (pointer_member_access): Implement
12943         expr->IDENTIFIER production.
12944
12945         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12946         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12947         on safe contexts.
12948
12949         (Unary): Implement indirection.
12950
12951         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12952         use in non-unsafe context).
12953
12954         (SimpleName.DoResolve): Check for pointers in field access on safe
12955         contexts. 
12956
12957         (Expression.LoadFromPtr): Factor the load-indirect code in this
12958         function.  This was duplicated in UnboxCast and ParameterReference
12959
12960 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12961
12962         * expression.cs (ComposedCast): report an error if a pointer cast
12963         is used in a safe region.
12964
12965         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12966         pointer type casts in unsafe context.
12967
12968         * codegen.cs (EmitContext): Set up IsUnsafe.
12969
12970         * cs-parser.jay (non_expression_type): Add productions for pointer
12971         casts. 
12972
12973         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12974         code.  We should not use force into static mode if the method is
12975         not virtual.  Fixes bug in MIS
12976
12977         * statement.cs (Do.Emit, While.Emit, For.Emit,
12978         Statement.EmitBoolExpression): Add support to Do and While to
12979         propagate infinite loop as `I do return' semantics.
12980
12981         Improve the For case to also test for boolean constants.
12982
12983         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12984         to the list of attributes we can add.
12985
12986         Remove `EmitContext' argument.
12987
12988         * class.cs (Method.Define): Apply parameter attributes.
12989         (Constructor.Define): Apply parameter attributes.
12990         (MethodCore.LabelParameters): Move here the core of labeling
12991         parameters. 
12992
12993         * support.cs (ReflectionParameters.ParameterModifier,
12994         InternalParameters.ParameterModifier): Use IsByRef on the type and
12995         only return the OUT bit for these parameters instead of in/out/ref
12996         flags.
12997
12998         This is because I miss-understood things.  The ParameterInfo.IsIn
12999         and IsOut represent whether the parameter has the [In] and [Out]
13000         attributes set.  
13001
13002 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13003
13004         * ecore.cs (FieldExpr.Emit): Release temporaries.
13005
13006         * assign.cs (LocalTemporary.Release): new function.
13007
13008         * codegen.cs (EmitContext.GetTemporaryStorage,
13009         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13010         temporary storage.  Now we can "put back" localbuilders when we
13011         are done with them
13012
13013 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13014
13015         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13016         need to make a copy of the variable to generate verifiable code.
13017
13018 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13019
13020         * driver.cs: Compute dynamically the system directory.
13021
13022         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13023         Slower, but more generally useful.  Used by the abstract
13024         registering implementation. 
13025
13026         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13027         the rules for the special rule on Type/instances.  First check if
13028         we have the same name, and if so, try that special static path
13029         rather than the instance path.
13030
13031 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13032
13033         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13034         for, while and if.
13035
13036         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13037         Enum, ValueType, Delegate or Array for non-corlib compiles.
13038
13039         * cs-tokenizer.cs: Catch long identifiers (645)
13040
13041         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13042         piece of code.
13043
13044         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13045         fix, we were returning too early, so we were not registering
13046         pending methods from abstract classes.
13047
13048         Do not register pending methods if the class is abstract.
13049
13050         * expression.cs (Conditional.DoResolve): Report circular implicit
13051         conversions when we neecd to compute it for conditional
13052         expressions. 
13053
13054         (Is.DoResolve): If the expression is always of the provided type,
13055         flag warning 183.  If the expression can not ever be of the
13056         provided type flag warning 184.
13057
13058         * class.cs: Catch 169 as well.
13059
13060         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13061         read. 
13062
13063 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13064
13065         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13066
13067 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13068
13069         * interface.cs: (PopulateMethod): Check for pointers being defined
13070         only if the unsafe context is active.
13071         (PopulateProperty): ditto.
13072         (PopulateIndexer): ditto.
13073
13074         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13075         specified.  If pointers are present, make sure that they are
13076         present in an unsafe context.
13077         (Constructor, Constructor.Define): ditto.
13078         (Field, Field.Define): ditto.
13079         (Property, Property.Define): ditto.
13080         (Event, Event.Define): ditto.
13081
13082         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13083         hashtable if there are classes or structs defined.
13084
13085         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13086         code, as the constant resolution moved.
13087
13088         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13089         the metadata, so we can flag error 133. 
13090
13091         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13092         pointer is being declared in an unsafe context.
13093
13094 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13095
13096         * modifiers.cs (Modifiers.Check): Require a Location argument.
13097         Report error 227 for Unsafe use.
13098
13099         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13100
13101         * statement.cs (For.Emit): If the test is null, then report that
13102         we do `return', as we wont reach anything afterwards.
13103
13104         (Switch.SwitchGoverningType): Track the expression that matched
13105         the conversion.
13106
13107         * driver.cs: Allow negative numbers as an error code to flag.
13108
13109         * cs-parser.jay: Handle 1551.
13110
13111         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13112
13113 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13114
13115         * cs-parser.jay: Report 1518 (type declaration can only contain
13116         class, struct, interface, enum or delegate)
13117
13118         (switch_label): Report 1523 (keywords `case' or `default' must
13119         preced code)
13120
13121         (opt_switch_sections): Report 1522 (empty switch)
13122
13123         * driver.cs: Report 1515 (response file specified multiple times)
13124         Report 1516 (Source file specified multiple times).
13125
13126         * expression.cs (Argument.Resolve): Signal 1510
13127
13128         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13129         access not allowed in static code)
13130
13131 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13132
13133         * typemanager.cs (IsPointerType): Utility method which we are going
13134         to need a lot.
13135
13136         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13137         the object type, so we take care of that.
13138
13139         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13140
13141         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13142         added to non-params parameters :-)
13143
13144         * typemanager.cs (CSharpName): Include 'void' type too. 
13145
13146         (void_ptr_type): Include in the set of core types.
13147
13148         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13149         duplicating code.
13150
13151         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13152         an unsafe context.
13153
13154         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13155         completely forgotten about it.
13156
13157 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13158
13159         * cs-parser.jay (pointer_type): Add. This begins our implementation
13160         of parsing rules for unsafe code.
13161
13162         (unsafe_statement): Implement.
13163
13164         (embedded_statement): Modify to include the above.
13165
13166         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13167
13168         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13169         if the current context is an unsafe one.
13170
13171         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13172         are handled differently, we need separate rules for them.
13173
13174         (local_variable_declaration): Update to use local_variable_pointer_type
13175         to allow variable declarations of unmanaged pointer types.
13176
13177         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13178         in unsafe contexts.
13179
13180         * ../errors/cs0214.cs : Add.
13181
13182 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13183
13184         * makefile: remove 'response' file when cleaning.
13185
13186 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13187
13188         * cs-parser.jay: Report 1524.
13189
13190 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13191
13192         * typemanager.cs (RegisterMethod): drop checking if we have
13193         registered this from here
13194
13195 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13196
13197         * class.cs (Method.EmitDestructor): Implement calling our base
13198         destructor. 
13199
13200         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13201         value of InFinally.
13202
13203         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13204         this routine and will wrap the call in a try/catch block.  Deal
13205         with the case.
13206
13207 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13208
13209         * ecore.cs (Expression.MemberLookup): instead of taking a
13210         parameter `same_type' that was used to tell whether we could
13211         access private members we compute our containing type from the
13212         EmitContext.
13213
13214         (FieldExpr): Added partial support for volatile fields.  This does
13215         not work for volatile fields exposed from assemblies, as I can not
13216         figure out how to extract the modreq from it.
13217
13218         Updated all the source files to use this.
13219
13220         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13221         because it is referenced by MemberLookup very often. 
13222
13223 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13224
13225         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13226         TypeBuilder.GetCustomAttributes to retrieve what we need.
13227
13228         Get rid of redundant default_member_attr_type as this is the same as
13229         default_member_type which already exists.
13230
13231         * interface.cs, attribute.cs : Update accordingly.
13232
13233 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13234
13235         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13236         work for TYpeBuilders though.  Ravi, can you please fix this?
13237
13238         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13239
13240         * expression.cs (Argument.Emit): Handle the case of ref objects
13241         being passed to ref functions;  
13242
13243         (ParameterReference.EmitLoad): Loads the content of the pointer
13244         without dereferencing.
13245
13246 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13247
13248         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13249
13250 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13251
13252         * class.cs (Indexer.DefineMethod): Incorporate the interface
13253         type in the name of the method if we are doing explicit interface
13254         implementation.
13255
13256         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13257
13258         (BetterConversion): Fix extremely trivial bug where we were referring to
13259         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13260         again !
13261
13262         * ../errors/bug16.cs : Add although we have fixed it.
13263
13264 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13265
13266         * expression.cs (BaseIndexer): Begin implementation.
13267
13268         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13269
13270         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13271         production directly to remove a shift/reduce, and implement
13272         explicit interface implementation.
13273
13274         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13275         after a floating point suffix.
13276
13277         * expression.cs (DoNumericPromotions): Improved the conversion for
13278         uint/uint.  If we have a constant, we avoid doing a typecast to a
13279         larger type.
13280
13281         * class.cs (Indexer): Implement explicit interface implementation
13282         for indexers.
13283
13284 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13285
13286         * class.cs: make the default instance constructor public and hidebysig.
13287
13288 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13289
13290         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13291         so we can call it from elsewhere.
13292
13293         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13294         we emit it internally if the class has a defined indexer; otherwise the user
13295         emits it by decorating the class definition with the DefaultMemberAttribute.
13296
13297         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13298         attribute is not used on a type which defines an indexer.
13299
13300         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13301         character when we skip whitespace.
13302
13303         * ../errors/cs0646.cs : Add.
13304
13305 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13306
13307         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13308         again. 
13309
13310         * makefile: Add practical target `mcs3.exe' which builds the third
13311         generation compiler. 
13312
13313         * expression.cs (New): Fix structures constructor calling.
13314
13315         * class.cs (Property, Method, Indexer): Emit Final flag on the
13316         method if we are an interface implementation and we are not
13317         abstract. 
13318
13319         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13320         whether this property is referencing a `base' method.
13321
13322         * expression.cs (Invocation.EmitCall): take an extra argument:
13323         is_base, this is used to determine whether the `call' or
13324         `callvirt' opcode should be used.
13325
13326
13327         * delegate.cs: update EmitCall.
13328
13329         * class.cs (Method.Define): Set NewSlot for the cases where we are
13330         not implementing an interface method.
13331
13332         (Property.Define): ditto.
13333
13334 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13335
13336         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13337         'r'.  Allows mcs to parse itself fully.
13338
13339 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13340
13341         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13342         of the number of initializers that require the InitializeArray method.
13343
13344         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13345         update the above field where necessary.
13346
13347         (MakeByteBlob): Update accordingly.
13348
13349         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13350         greater than 2.
13351
13352         (EmitDynamicInitializers): Update in accordance with the new optimization.
13353
13354         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13355         same OpCode applies.
13356
13357         * cs-parser.jay : Fix some glaring errors I introduced.
13358
13359 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13360
13361         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13362         so that we can check for name clashes there too.
13363
13364         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13365         for interface indexers.
13366
13367         * interfaces.cs (Define): Emit the default member attribute.
13368
13369         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13370         variable was being referred to while setting the value ;-)
13371
13372 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13373
13374         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13375         byte-by-byte information when we know the data is zero.
13376
13377         Make the block always a multiple of 4, because
13378         DefineInitializedData has a bug.
13379
13380         * assign.cs: Fix, we should assign from the temporary, not from
13381         the source. 
13382
13383         * expression.cs (MakeByteBlob): Fix my incorrect code.
13384
13385 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13386
13387         * typemanager.cs (EnumToUnderlying): This function is used to get
13388         the underlying type from an enumeration, because it does not
13389         always work. 
13390
13391         * constant.cs: Use the I4_S form for values between -128 and 127.
13392
13393         * statement.cs (Block.LookupLabel): Looks up a label.
13394         (Block): Drop support for labeled blocks.
13395
13396         (LabeledStatement): New kind of statement that represents a label
13397         only.
13398
13399         (Goto): Finally implement this bad boy.
13400
13401         * cs-parser.jay: Update to reflect new mechanism to implement
13402         labels.
13403
13404 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13405
13406         * codegen.cs (EmitContext.This): a codegen property that keeps the
13407         a single instance of this instead of creating many different this
13408         instances. 
13409
13410         * delegate.cs (Delegate.DoResolve): Update to use the property;
13411
13412         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13413
13414         * expression.cs (BaseAccess.DoResolve): Ditto.
13415
13416 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13417
13418         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13419         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13420
13421         (InitCoreTypes): Update accordingly.
13422
13423         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13424         so we can quickly store the state.
13425
13426         (ApplyAttributes): Set the correct implementation flags
13427         for InternalCall methods.
13428
13429 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13430
13431         * expression.cs (EmitCall): if a method is not virtual, then do
13432         not use callvirt on it.
13433
13434         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13435         user defined stuff) requires the use of stobj, which takes an
13436         address on the stack instead of an array and an index.  So emit
13437         the Ldelema operation for it.
13438
13439         (EmitStoreOpcode): Use stobj for valuetypes.
13440
13441         (UnaryMutator.EmitCode): Use the right 1 value depending on
13442         whether we are dealing with int64/uint64, float or doubles.
13443
13444         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13445         constructors that I implemented last night.
13446
13447         (Constructor.IsDefault): Fix to work properly for static
13448         constructors.
13449
13450         * cs-parser.jay (CheckDef): report method signature errors.
13451         Update error number 103 to be 132.
13452
13453         * decl.cs: New AdditionResult enumeration value: MethodExists.
13454         Although we do this check for methods later on in the semantic
13455         analysis, catching repeated default constructors is so easy that
13456         we catch these here. 
13457
13458         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13459         promotions code.
13460
13461         (ParameterReference.EmitAssign, Emit): handle
13462         bools as bytes.
13463
13464         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13465         (ArrayAccess.EmitStoreOpcode): ditto.
13466
13467         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13468
13469         * expression.cs (MakeByteBlob): Complete all the missing types
13470         (uint, short, ushort, byte, sbyte)
13471
13472         * class.cs: Only init instance field initializers on instance
13473         constructors. 
13474
13475         Rename `constructors' to instance_constructors. 
13476
13477         (TypeContainer.AddConstructor): Only add constructors to the list
13478         if it is not static.
13479
13480         Make sure that we handle default_static_constructor independently
13481         everywhere where we handle instance_constructors
13482
13483 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13484
13485         * class.cs: Do not lookup or create a base initializer for a
13486         static constructor.
13487
13488         (ConstructorInitializer.Resolve): use the proper type to lookup
13489         for constructors.
13490
13491         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13492
13493         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13494         in DeclSpace. 
13495
13496         * decl.cs: CloseType is now an virtual method, the default
13497         implementation just closes this type.
13498
13499 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13500
13501         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13502         to PreserveSig by default. Also emit HideBySig on such methods.
13503
13504         Basically, set the defaults to standard values.
13505
13506         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13507         argument, if candidate is better, it can't be worse than the best !
13508
13509         (Invocation): Re-write bits to differentiate between methods being
13510         applicable in their expanded form and their normal form - for params
13511         methods of course.
13512
13513         Get rid of use_standard everywhere as only standard conversions are allowed
13514         in overload resolution. 
13515
13516         More spec conformance.
13517
13518 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13519
13520         * driver.cs: Add --timestamp, to see where the compiler spends
13521         most of its time.
13522
13523         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13524         `this' in static code.
13525
13526         (SimpleName.DoResolve): Implement in terms of a helper function
13527         that allows static-references to be passed upstream to
13528         MemberAccess.
13529
13530         (Expression.ResolveWithSimpleName): Resolve specially simple
13531         names when called by MemberAccess to implement the special
13532         semantics. 
13533
13534         (Expression.ImplicitReferenceConversion): Handle conversions from
13535         Null to reference types before others, as Null's type is
13536         System.Object. 
13537
13538         * expression.cs (Invocation.EmitCall): Handle the special case of
13539         calling methods declared on a reference type from a ValueType
13540         (Base classes System.Object and System.Enum)
13541
13542         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13543         the left hand side is a TypeExpr, not on every enumeration. 
13544
13545         (Binary.Resolve): If types are reference types, then do a cast to
13546         object on operators != and == of both arguments.
13547
13548         * typemanager.cs (FindMembers): Extract instance and static
13549         members if requested.
13550
13551         * interface.cs (PopulateProperty): Use void_type instead of null
13552         as the return type for the setter method.
13553
13554         (PopulateIndexer): ditto.
13555
13556 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13557
13558         * support.cs (ReflectionParameters): Fix minor bug where we
13559         were examining the wrong parameter for the ParamArray attribute.
13560
13561         Cope with requests for the type of the parameter at position
13562         greater than the params parameter's. We now return the element
13563         type of the params array as that makes more sense.
13564
13565         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13566         accordingly as we no longer have to extract the element type
13567         ourselves.
13568
13569         (Invocation.OverloadResolve): Update.
13570
13571 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13572
13573         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13574         against IEnumerator, test whether the return value is a descendant
13575         of the IEnumerator interface.
13576
13577         * class.cs (Indexer.Define): Use an auxiliary method to implement
13578         the other bits of the method definition.  Begin support for
13579         explicit interface implementation.
13580
13581         (Property.DefineMethod): Use TypeManager.void_type instead of null
13582         for an empty return value.
13583
13584 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13585
13586         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13587         dealing with a FieldExpr which is composed of a FieldBuilder, in
13588         the code path we did extract the constant, but we should have
13589         obtained the underlying value to be able to cast it (otherwise we
13590         end up in an infinite loop, this is what Ravi was running into).
13591
13592         (ArrayCreation.UpdateIndices): Arrays might be empty.
13593
13594         (MemberAccess.ResolveMemberAccess): Add support for section
13595         14.5.4.1 that deals with the special case of E.I when E is a type
13596         and something else, that I can be a reference to a static member.
13597
13598         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13599         handle a particular array type to create byte blobs, it is just
13600         something we dont generate byteblobs for.
13601
13602         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13603         arguments. 
13604
13605         * location.cs (Push): remove the key from the hashtable that we
13606         are about to add.   This happens for empty files.
13607
13608         * driver.cs: Dispose files after we have parsed them.
13609
13610         (tokenize): new function that only runs the tokenizer on its
13611         input, for speed testing.
13612
13613 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13614
13615         * class.cs (Event.Define): Define the private field only if there
13616         are no accessors defined.
13617
13618         * expression.cs (ResolveMemberAccess): If there is no associated
13619         field with the event, that means we have an event defined with its
13620         own accessors and we should flag error cs0070 since transforming
13621         ourselves into a field is not valid in that case.
13622
13623         * ecore.cs (SimpleName.DoResolve): Same as above.
13624
13625         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13626         and charset to sane values.
13627
13628 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13629
13630         * assign.cs (DoResolve): Perform check on events only if they 
13631         are being accessed outside the declaring type.
13632
13633         * cs-parser.jay (event_declarations): Update rules to correctly
13634         set the type of the implicit parameter etc.
13635
13636         (add_accessor, remove_accessor): Set current local parameters.
13637
13638         * expression.cs (Binary): For delegate addition and subtraction,
13639         cast the return value from the method into the appropriate delegate
13640         type.
13641
13642 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13643
13644         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13645         of these as the workaround is unnecessary.
13646
13647         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13648         delegate data - none of that is needed at all.
13649
13650         Re-write bits to extract the instance expression and the delegate method
13651         correctly.
13652
13653         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13654         on delegates too.
13655
13656         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13657         of attaching attributes instead of duplicating code everywhere.
13658
13659         * everywhere : Update code to do attribute emission using the above method.
13660
13661 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13662
13663         * expression.cs (IsParamsMethodApplicable): if there are not
13664         parameters, return immediately.
13665
13666         * ecore.cs: The 0 literal can be implicity converted to an enum
13667         type. 
13668
13669         (SimpleName.DoResolve): First lookup the type, then lookup the
13670         members. 
13671
13672         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13673         want to get its address.  If the InstanceExpression is not
13674         addressable, store the result in a temporary variable, then get
13675         the address of it.
13676
13677         * codegen.cs: Only display 219 errors on warning level or above. 
13678
13679         * expression.cs (ArrayAccess): Make it implement the
13680         IMemoryLocation interface.
13681
13682         (Binary.DoResolve): handle the operator == (object a, object b)
13683         and operator != (object a, object b) without incurring into a
13684         BoxedCast (because 5 != o should never be performed).
13685
13686         Handle binary enumerator operators.
13687
13688         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13689         value type, otherwise use Ldelem_ref.
13690
13691         Use precomputed names;
13692
13693         (AddressOf): Implement address of
13694
13695         * cs-parser.jay (labeled_statement): Fix recursive block
13696         addition by reworking the production.
13697
13698         * expression.cs (New.DoEmit): New has a special case:
13699                 
13700                  If we are dealing with a ValueType, we have a few
13701                  situations to deal with:
13702                 
13703                     * The target of New is a ValueType variable, that is
13704                       easy, we just pass this as the variable reference
13705                 
13706                     * The target of New is being passed as an argument,
13707                       to a boxing operation or a function that takes a
13708                       ValueType.
13709                 
13710                       In this case, we need to create a temporary variable
13711                       that is the argument of New.
13712
13713
13714 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13715
13716         * rootcontext.cs (LookupType): Check that current_type is not null before
13717         going about looking at nested types.
13718
13719         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13720         not implement the IAssignMethod interface any more.
13721
13722         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13723         where we tranform them into FieldExprs if they are being resolved from within
13724         the declaring type.
13725
13726         * ecore.cs (SimpleName.DoResolve): Do the same here.
13727
13728         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13729
13730         * ../errors/bug10.cs : Add.
13731
13732         * ../errors/cs0070.cs : Add.
13733
13734         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13735
13736         * assign.cs : Get rid of EventIsLocal everywhere.
13737
13738 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13739
13740         * ecore.cs (ConvertIntLiteral): finished the implementation.
13741
13742         * statement.cs (SwitchLabel): Convert the value we are using as a
13743         key before looking up the table.
13744
13745 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13746
13747         * codegen.cs (EmitTopBlock): Require a Location argument now.
13748
13749         * cs-parser.jay (constructor_declarator): We need to setup
13750         current_local_parameters before we parse the
13751         opt_constructor_initializer, to allow the variables to be bound
13752         to the constructor arguments.
13753
13754         * rootcontext.cs (LookupType): First lookup nested classes in our
13755         class and our parents before we go looking outside our class.
13756
13757         * expression.cs (ConstantFold): Extract/debox the values at the
13758         beginnning. 
13759
13760         * rootcontext.cs (EmitCode): Resolve the constants first before we
13761         resolve the types.  This is not really needed, but it helps debugging.
13762
13763         * statement.cs: report location.
13764
13765         * cs-parser.jay: pass location to throw statement.
13766
13767         * driver.cs: Small bug fix.
13768
13769         * report.cs: Updated format to be 4-zero filled digits.
13770
13771 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13772
13773         * expression.cs (CheckIndices): Fix minor bug where the wrong
13774         variable was being referred to ;-)
13775
13776         (DoEmit): Do not call EmitStaticInitializers when the 
13777         underlying type is System.Object.
13778
13779 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13780
13781         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13782         and do the usual workaround for SRE.
13783
13784         * class.cs (MyEventBuilder.EventType): New member to get at the type
13785         of the event, quickly.
13786
13787         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13788
13789         * assign.cs (Assign.DoResolve): Handle the case when the target
13790         is an EventExpr and perform the necessary checks.
13791
13792         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13793         interface.
13794
13795         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13796
13797         (EventExpr): Set the type in the constructor itself since we 
13798         are meant to be born fully resolved.
13799
13800         (EventExpr.Define): Revert code I wrote earlier.
13801                 
13802         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13803         instance expression is null. The instance expression is a This in that case
13804         or a null, depending on whether it is a static method or not.
13805
13806         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13807         refers to more than one method.
13808
13809         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13810         and accordingly flag errors.
13811
13812 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13813
13814         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13815
13816 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13817
13818         * location.cs (ToString): Provide useful rutine.
13819
13820 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13821
13822         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13823         objects, return the actual integral boxed.
13824
13825         * statement.cs (SwitchLabel): define an ILLabel for each
13826         SwitchLabel. 
13827
13828         (Switch.CheckSwitch): If the value is a Literal, extract
13829         the underlying literal.
13830
13831         Also in the unused hashtable we had, add the SwitchLabel so we can
13832         quickly look this value up.
13833
13834         * constant.cs: Implement a bunch of new constants.  Rewrite
13835         Literal based on this.  Made changes everywhere to adapt to this.
13836
13837         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13838         dereferencing array only once, and also copes with enumrations.
13839
13840         bytes are two bytes wide, not one.
13841
13842         (Cast): Perform constant conversions.
13843
13844         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13845         wrappers to the literals here.
13846
13847         * expression.cs (DoNumericPromotions): long literals can converted
13848         to ulong implicity (this is taken care of elsewhere, but I was
13849         missing this spot).
13850
13851         * ecore.cs (Expression.Literalize): Make the return type Literal,
13852         to improve type checking.
13853
13854         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13855
13856 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13857
13858         * literal.cs: Revert code from ravi that checked the bounds.  The
13859         bounds are sane by the definition of the type itself. 
13860
13861         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13862         need to actually look up in our parent hierarchy for interfaces
13863         implemented. 
13864
13865         * const.cs: Use the underlying type for enumerations
13866
13867         * delegate.cs: Compute the basename for the delegate creation,
13868         that should fix the delegate test case, and restore the correct
13869         Type Lookup semantics in rootcontext
13870
13871         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13872         referencing a nested type with the Reflection API is using the "+"
13873         sign. 
13874
13875         * cs-parser.jay: Do not require EOF token at the end.
13876
13877 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13878
13879         * rootcontext.cs (LookupType): Concatenate type names with
13880         a '.' instead of a '+' The test suite passes again.
13881
13882         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13883         field of the enumeration.
13884
13885         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13886         the case when the member is an EventExpr.
13887
13888         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13889         static has an associated instance expression.
13890
13891         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13892
13893         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13894
13895         * class.cs (Event.Define): Register event and perform appropriate checks
13896         for error #111.
13897
13898         We define the Add and Remove methods even if the use provides none because
13899         in that case, we provide default implementations ourselves.
13900
13901         Define a private field of the type of the event. This is done by the CSC compiler
13902         and we should be doing it too ;-)
13903
13904         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13905         More methods we use in code we generate.
13906
13907         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13908         is important.
13909
13910         (InitCoreTypes): Update accordingly for the above.
13911
13912         * class.cs (Event.Emit): Generate code for default accessors that we provide
13913
13914         (EmitDefaultMethod): Do the job in the above.
13915
13916         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13917         appropriate place.
13918
13919 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13920
13921         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13922         builders even if we were missing one.
13923
13924         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13925         pass the Basename as our class name instead of the Name.  The
13926         basename will be correctly composed for us.
13927
13928         * parameter.cs (Paramters): Now takes a Location argument.
13929
13930         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13931         make all the code call directly LookupType in RootContext and take
13932         this chance to pass the Location information everywhere.
13933
13934         * Everywhere: pass Location information.
13935
13936 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13937
13938         * class.cs (Constructor.Define): Updated way of detecting the
13939         length of the parameters.
13940
13941         (TypeContainer.DefineType): Use basename as the type name for
13942         nested types.
13943
13944         (TypeContainer.Define): Do not recursively define types here, as
13945         definition is taken care in order by the RootContext.
13946
13947         * tree.cs: Keep track of namespaces in a per-file basis.
13948
13949         * parameter.cs (Parameter.ComputeSignature): Update to use
13950         DeclSpace. 
13951
13952         (Parameters.GetSignature): ditto.
13953
13954         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13955         instead of a TypeContainer.
13956
13957         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13958         resolve names.  Because we need to be resolve in our context, not
13959         our parents.
13960
13961         * driver.cs: Implement response files.
13962
13963         * class.cs (TypeContainer.DefineType): If we are defined, do not
13964         redefine ourselves.
13965
13966         (Event.Emit): Emit the code for add/remove handlers.
13967         (Event.Define): Save the MethodBuilders for add/remove.
13968
13969         * typemanager.cs: Use pair here too.
13970
13971         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13972         DictionaryEntry requires the first argument to be non-null.  
13973
13974         (enum_declaration): Compute full name for registering the
13975         enumeration.
13976
13977         (delegate_declaration): Instead of using
13978         formal_parameter_list, use opt_formal_parameter_list as the list
13979         can be empty.
13980
13981         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13982         (EventParsing): New property that controls whether `add' and
13983         `remove' are returned as tokens or identifiers (for events);
13984
13985 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13986
13987         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13988         use MyEventBuilder only and let it wrap the real builder for us.
13989
13990         (MyEventBuilder): Revamp constructor etc.
13991
13992         Implement all operations that we perform on EventBuilder in precisely the same
13993         way here too.
13994
13995         (FindMembers): Update to use the EventBuilder member.
13996
13997         (Event.Emit): Update accordingly.
13998
13999 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14000
14001         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14002         by calling the appropriate methods.
14003
14004         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14005         useful.
14006
14007         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14008
14009 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14010
14011         * delegate.cs (Delegate.Populate): Check that the return type
14012         and various parameters types are indeed accessible.
14013
14014         * class.cs (Constructor.Define): Same here.
14015
14016         (Field.Define): Ditto.
14017
14018         (Event.Define): Ditto.
14019
14020         (Operator.Define): Check that the underlying Method defined itself
14021         correctly - so it's MethodBuilder should not be null.
14022
14023         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14024         expression happens to be null.
14025
14026         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14027         members but as of now we don't seem to be able to do anything really useful with it.
14028
14029         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14030         not the EventBuilder.
14031
14032 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14033
14034         * cs-tokenizer.cs: Add support for defines.
14035         Add support for #if, #elif, #else, #endif
14036
14037         (eval_var): evaluates a variable.
14038         (eval): stubbed for evaluating functions.
14039
14040         * cs-parser.jay: Pass the defines information
14041
14042         * driver.cs: Add --define command line option.
14043
14044         * decl.cs: Move MemberCore here.
14045
14046         Make it the base class for DeclSpace.  This allows us to catch and
14047         report 108 and 109 for everything now.
14048
14049         * class.cs (TypeContainer.Define): Extract all the members
14050         before populating and emit the warning 108 (new keyword required
14051         to override) instead of having each member implement this.
14052
14053         (MemberCore.Define): New abstract method, we will be using this in
14054         the warning reporting engine in Populate.
14055
14056         (Operator.Define): Adjust to new MemberCore protocol. 
14057
14058         * const.cs (Const): This does not derive from Expression, it is a
14059         temporary object we use to create fields, it is a MemberCore. 
14060
14061         * class.cs (Method.Define): Allow the entry point to be in a
14062         specific class.
14063
14064         * driver.cs: Rewrite the argument handler to clean it up a bit.
14065
14066         * rootcontext.cs: Made it just an auxiliary namespace feature by
14067         making everything static.
14068
14069         * driver.cs: Adapt code to use RootContext type name instead of
14070         instance variable.
14071
14072         * delegate.cs: Remove RootContext argument.
14073
14074         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14075         argument. 
14076
14077         * class.cs (Event.Define): The lookup can fail.
14078
14079         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14080
14081         * expression.cs: Resolve the this instance before invoking the code.
14082
14083 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14084
14085         * cs-parser.jay: Add a production in element_access that allows
14086         the thing to become a "type" reference.  This way we can parse
14087         things like "(string [])" as a type.
14088
14089         Note that this still does not handle the more complex rules of
14090         casts. 
14091
14092
14093         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14094
14095         * ecore.cs: (CopyNewMethods): new utility function used to
14096         assemble the list of methods from running FindMembers.
14097
14098         (MemberLookup): Rework FindMembers so that 
14099
14100 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14101
14102         * class.cs (TypeContainer): Remove Delegates who fail to be
14103         defined.
14104
14105         * delegate.cs (Populate): Verify that we dont get null return
14106         values.   TODO: Check for AsAccessible.
14107
14108         * cs-parser.jay: Use basename to emit error 574 (destructor should
14109         have the same name as container class), not the full name.
14110
14111         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14112         possible representation.  
14113
14114         Also implements integer type suffixes U and L.
14115
14116 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14117
14118         * expression.cs (ArrayCreation.DoResolve): We need to do the
14119         argument resolution *always*.
14120
14121         * decl.cs: Make this hold the namespace.  Hold the root context as
14122         well.
14123         (LookupType): Move here.
14124
14125         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14126
14127         * location.cs (Row, Name): Fixed the code, it was always returning
14128         references to the first file.
14129
14130         * interface.cs: Register properties defined through interfaces.
14131
14132         * driver.cs: Add support for globbing on the command line
14133
14134         * class.cs (Field): Make it derive from MemberCore as well.
14135         (Event): ditto.
14136
14137 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14138
14139         * class.cs (Event::Define): Check that the type of the event is a delegate
14140         type else flag error #66.
14141
14142         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14143         same.
14144
14145         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14146         values of EntryPoint, CharSet etc etc.
14147
14148         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14149
14150         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14151         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14152         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14153         which needs this to do its work.
14154
14155         * ../errors/cs0066.cs : Add.
14156
14157 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14158
14159         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14160         helper functions.
14161
14162         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14163         clears out the parameters field.
14164         (MemberSignatureCompare): Cleanup
14165
14166         (MemberCore): New base class used to share code between MethodCore
14167         and Property.
14168
14169         (RegisterRequiredImplementations) BindingFlags.Public requires
14170         either BindingFlags.Instace or Static.  Use instance here.
14171
14172         (Property): Refactored code to cope better with the full spec.
14173
14174         * parameter.cs (GetParameterInfo): Return an empty array instead
14175         of null on error.
14176
14177         * class.cs (Property): Abstract or extern properties have no bodies.
14178
14179         * parameter.cs (GetParameterInfo): return a zero-sized array.
14180
14181         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14182         method modifier validation to the typecontainer so we can reuse
14183         this on properties.
14184
14185         (MethodCore.ParameterTypes): return an empty sized array of types.
14186
14187         (Property.Define): Test property modifier validity.
14188
14189         Add tests for sealed/override too.
14190
14191         (Method.Emit): abstract or extern methods have no bodies.
14192
14193 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14194
14195         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14196         thing.
14197
14198         (Method::Define, ::Emit): Modify accordingly.
14199
14200         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14201
14202         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14203
14204         * makefile: Pass in /unsafe.
14205
14206 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14207
14208         * class.cs (MakeKey): Kill routine.
14209
14210         * class.cs (TypeContainer.Define): Correctly define explicit
14211         method implementations (they require the full interface name plus
14212         the method name).
14213
14214         * typemanager.cs: Deply the PtrHashtable here and stop using the
14215         lame keys.  Things work so much better.
14216
14217         This of course broke everyone who depended on `RegisterMethod' to
14218         do the `test for existance' test.  This has to be done elsewhere.
14219
14220         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14221         the object stupid Equals method (because, that like fails all over
14222         the place).  We still do not use it.
14223
14224         * class.cs (TypeContainer.SetRequiredInterface,
14225         TypeContainer.RequireMethods): Killed these two routines and moved
14226         all the functionality to RegisterRequiredImplementations.
14227
14228         (TypeContainer.RegisterRequiredImplementations): This routine now
14229         registers all the implementations required in an array for the
14230         interfaces and abstract methods.  We use an array of structures
14231         which can be computed ahead of time to reduce memory usage and we
14232         also assume that lookups are cheap as most classes will not
14233         implement too many interfaces.
14234
14235         We also avoid creating too many MethodSignatures.
14236
14237         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14238         clear the "pending" bit if we find that there are problems with
14239         the declaration.
14240
14241         (TypeContainer.VerifyPendingMethods): Update to report errors of
14242         methods that look like implementations but are not.
14243
14244         (TypeContainer.Define): Add support for explicit interface method
14245         implementation. 
14246
14247 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14248
14249         * typemanager.cs: Keep track of the parameters here instead of
14250         being a feature of the TypeContainer.
14251
14252         * class.cs: Drop the registration of parameters here, as
14253         InterfaceMethods are also interface declarations.
14254
14255         * delegate.cs: Register methods with the TypeManager not only with
14256         the TypeContainer.  This code was buggy.
14257
14258         * interface.cs: Full registation here.
14259
14260 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14261
14262         * expression.cs: Remove reducer for binary expressions, it can not
14263         be done this way.
14264
14265         * const.cs: Put here the code that used to go into constant.cs
14266
14267         * constant.cs: Put here the code for constants, this is a new base
14268         class for Literals.
14269
14270         * literal.cs: Make Literal derive from Constant.
14271
14272 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14273
14274         * statement.cs (Return.Emit): Report error 157 if the user
14275         attempts to return from a finally block.
14276
14277         (Return.Emit): Instead of emitting a return, jump to the end of
14278         the function.
14279
14280         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14281         LocalBuilder to store the result of the function.  ReturnLabel is
14282         the target where we jump.
14283
14284
14285 2001-12-09  Radek Doulik  <rodo@ximian.com>
14286
14287         * cs-parser.jay: remember alias in current namespace
14288
14289         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14290         namespaces
14291
14292         * class.cs (LookupAlias): lookup alias in my_namespace
14293
14294         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14295         aliases hashtable
14296         (LookupAlias): lookup alias in this and if needed in parent
14297         namespaces
14298
14299 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14300
14301         * support.cs: 
14302
14303         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14304         making things static.  I need this to avoid passing the
14305         TypeContainer when calling ParameterType.
14306
14307         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14308         that did string manipulation to compute the type and then call
14309         GetType.  Use Parameter.ParameterType instead.
14310
14311         * cs-tokenizer.cs: Consume the suffix for floating values.
14312
14313         * expression.cs (ParameterReference): figure out whether this is a
14314         reference parameter or not.  Kill an extra variable by computing
14315         the arg_idx during emission.
14316
14317         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14318         function that returns whether a parameter is an out/ref value or not.
14319
14320         (Parameter.ParameterType): The type of the parameter (base,
14321         without ref/out applied).
14322
14323         (Parameter.Resolve): Perform resolution here.
14324         (Parameter.ExternalType): The full type (with ref/out applied).
14325
14326         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14327         support for expressions on the using statement.
14328
14329 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14330
14331         * statement.cs (Using.EmitLocalVariableDecls): Split the
14332         localvariable handling of the using statement.
14333
14334         (Block.EmitMeta): Keep track of variable count across blocks.  We
14335         were reusing slots on separate branches of blocks.
14336
14337         (Try.Emit): Emit the general code block, we were not emitting it. 
14338
14339         Check the type of the declaration to be an IDisposable or
14340         something that can be implicity converted to it. 
14341
14342         Emit conversions if required.
14343
14344         * ecore.cs (EmptyExpression): New utility class.
14345         (Expression.ImplicitConversionExists): New utility function.
14346
14347 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14348
14349         * statement.cs (Using): Implement.
14350
14351         * expression.cs (LocalVariableReference): Support read only variables.
14352
14353         * statement.cs: Remove the explicit emit for the Leave opcode.
14354         (VariableInfo): Add a readonly field.
14355
14356 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14357
14358         * ecore.cs (ConvCast): new class used to encapsulate the various
14359         explicit integer conversions that works in both checked and
14360         unchecked contexts.
14361
14362         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14363         properly generate the overflow opcodes.
14364
14365 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14366
14367         * statement.cs: The correct type for the EmptyExpression is the
14368         element_type, not the variable type.  Ravi pointed this out.
14369
14370 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14371
14372         * class.cs (Method::Define): Handle PInvoke methods specially
14373         by using DefinePInvokeMethod instead of the usual one.
14374
14375         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14376         above to do the task of extracting information and defining the method.
14377
14378 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14379
14380         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14381         of the condition for string type.
14382
14383         (Emit): Move that here. 
14384
14385         (ArrayCreation::CheckIndices): Keep string literals in their expression
14386         form.
14387
14388         (EmitDynamicInitializers): Handle strings appropriately.
14389
14390 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14391
14392         * codegen.cs (EmitContext): Replace multiple variables with a
14393         single pointer to the current Switch statement.
14394
14395         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14396         EmitContext.
14397
14398 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14399
14400         * statement.cs 
14401
14402         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14403         default'.
14404
14405         (Foreach.Emit): Foreach on arrays was not setting
14406         up the loop variables (for break/continue).
14407
14408         (GotoCase): Semi-implented.
14409
14410 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14411
14412         * attribute.cs (CheckAttribute): Handle system attributes by using
14413         Attribute.GetAttributes to examine information we need.
14414
14415         (GetValidPlaces): Same here.
14416
14417         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14418
14419         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14420
14421         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14422
14423         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14424
14425         (Method::Emit): Handle the case when we are a PInvoke method.
14426
14427 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14428
14429         * expression.cs: Use ResolveWithSimpleName on compound names.
14430
14431 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14432
14433         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14434         before trying to reduce it.
14435
14436         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14437
14438         * constant.cs (LookupConstantValue): Implement.
14439
14440         (EmitConstant): Use the above in emitting the constant.
14441
14442         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14443         that are user-defined by doing a LookupConstantValue on them.
14444
14445         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14446         too, like above.
14447
14448 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14449
14450         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14451
14452         (BaseAccess.DoResolve): Implement.
14453
14454         (MemberAccess.DoResolve): Split this routine into a
14455         ResolveMemberAccess routine that can be used independently
14456
14457 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14458
14459         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14460         As that share bits of the implementation.  Is returns a boolean,
14461         while As returns the Type that is being probed.
14462
14463 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14464
14465         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14466         instead of a Literal - much easier.
14467
14468         (EnumInTransit): Remove - utterly useless :-)
14469
14470         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14471
14472         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14473
14474         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14475         chain when we have no associated expression.
14476
14477 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14478
14479         * constant.cs (Define): Use Location while reporting the errror.
14480
14481         Also emit a warning when 'new' is used and there is no inherited
14482         member to hide.
14483
14484         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14485         populated.
14486
14487         (LookupEnumValue): Implement to lookup an enum member's value and define it
14488         if necessary.
14489
14490         (Populate): Re-write accordingly to use the above routine.
14491
14492 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14493
14494         * expression.cs (This): Fix prototype for DoResolveLValue to
14495         override the base class DoResolveLValue.
14496
14497         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14498         declarations) 
14499
14500         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14501         (we need to load the address of the field here).  This fixes
14502         test-22. 
14503
14504         (FieldExpr.DoResolveLValue): Call the DoResolve
14505         function to initialize the Instance expression.
14506
14507         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14508         correctly the GetEnumerator operation on a value type.
14509
14510         * cs-parser.jay: Add more simple parsing error catches.
14511
14512         * statement.cs (Switch): Add support for string switches.
14513         Handle null specially.
14514
14515         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14516
14517 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14518
14519         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14520
14521         (declare_local_constant): New helper function.
14522
14523         * statement.cs (AddConstant): Keep a separate record of constants
14524
14525         (IsConstant): Implement to determine if a variable is a constant.
14526
14527         (GetConstantExpression): Implement.
14528
14529         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14530
14531         * statement.cs (IsVariableDefined): Re-write.
14532
14533 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14534
14535         * class.cs (TypeContainer::FindMembers): Look for constants
14536         in the case when we are looking for MemberTypes.Field
14537
14538         * expression.cs (MemberAccess::DoResolve): Check that in the
14539         case we are a FieldExpr and a Literal, we are not being accessed
14540         by an instance reference.
14541
14542         * cs-parser.jay (local_constant_declaration): Implement.
14543
14544         (declaration_statement): Implement for constant declarations.
14545
14546 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14547
14548         * statement.cs (Switch): Catch double defaults.
14549
14550         (Switch): More work on the switch() statement
14551         implementation.  It works for integral values now, need to finish
14552         string support.
14553
14554
14555 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14556
14557         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14558         integer literals into other integer literals.  To be used by
14559         switch. 
14560
14561 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14562
14563         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14564         some memory.
14565
14566         (EmitDynamicInitializers): Cope with the above since we extract data
14567         directly from ArrayData now.
14568
14569         (ExpectInitializers): Keep track of whether initializers are mandatory
14570         or not.
14571
14572         (Bounds): Make it a hashtable to prevent the same dimension being 
14573         recorded for every element in that dimension.
14574
14575         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14576         from being found.
14577
14578         Also fix bug which was causing the indices to be emitted in the reverse
14579         order.
14580
14581 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14582
14583         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14584         unfinished.  They do not work, because the underlying code is
14585         sloppy.
14586
14587 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14588
14589         * cs-parser.jay: Remove bogus fixme.
14590
14591         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14592         on Switch statement.
14593
14594 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14595
14596         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14597         the same. 
14598
14599         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14600         parameter. Apparently, any expression is allowed. 
14601
14602         (ValidateInitializers): Update accordingly.
14603
14604         (CheckIndices): Fix some tricky bugs thanks to recursion.
14605
14606         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14607         I was being completely brain-dead.
14608
14609         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14610         and re-write acordingly.
14611
14612         (DelegateInvocation): Re-write accordingly.
14613
14614         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14615
14616         (MakeByteBlob): Handle types more correctly.
14617
14618         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14619         initialization from expressions but it is incomplete because I am a complete
14620         Dodo :-|
14621
14622 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14623
14624         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14625         on If.  Basically, we have to return `true' (ie, we do return to
14626         our caller) only if both branches of the if return.
14627
14628         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14629         short-circuit operators, handle them as short circuit operators. 
14630
14631         (Cast.DoResolve): Resolve type.
14632         (Cast.Cast): Take an expression as the target type.
14633
14634         * cs-parser.jay (cast_expression): Remove old hack that only
14635         allowed a limited set of types to be handled.  Now we take a
14636         unary_expression and we resolve to a type during semantic
14637         analysis.
14638
14639         Use the grammar productions from Rhys to handle casts (this is
14640         not complete like Rhys syntax yet, we fail to handle that corner
14641         case that C# has regarding (-x), but we will get there.
14642
14643 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14644
14645         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14646         field which is an array type.
14647
14648         * cs-parser.jay (declare_local_variables): Support array initialization too.
14649
14650         * typemanager.cs (MakeKey): Implement.
14651
14652         (everywhere): Use the above appropriately.
14653
14654         * cs-parser.jay (for_statement): Update for array initialization while
14655         declaring variables.
14656
14657         * ecore.cs : The error message was correct, it's the variable's names that
14658         were misleading ;-) Make the code more readable.
14659
14660         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14661         the correct type etc.
14662
14663         (ConvertExplicit): Handle Enum types by examining the underlying type.
14664
14665 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14666
14667         * parameter.cs (GetCallingConvention): Always return
14668         CallingConventions.Standard for now.
14669
14670 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14671
14672         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14673         and `r' after calling DoNumericPromotions.
14674
14675         * ecore.cs: Fix error message (the types were in the wrong order).
14676
14677         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14678         BindingFlags.Instance as well 
14679
14680         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14681         implicit int literal conversion in an empty cast so that we
14682         propagate the right type upstream.
14683
14684         (UnboxCast): new class used to unbox value types.
14685         (Expression.ConvertExplicit): Add explicit type conversions done
14686         by unboxing.
14687
14688         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14689         the target type before applying the implicit LongLiterals to ULong
14690         literal cast.
14691
14692 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14693
14694         * cs-parser.jay (for_statement): Reworked the way For works: now
14695         we declare manually any variables that are introduced in
14696         for_initializer to solve the problem of having out-of-band code
14697         emition (that is what got for broken).
14698
14699         (declaration_statement): Perform the actual variable declaration
14700         that used to be done in local_variable_declaration here.
14701
14702         (local_variable_declaration): Do not declare anything, just pass
14703         the information on a DictionaryEntry
14704
14705 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14706
14707         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14708         re-write of the logic to now make it recursive.
14709
14710         (UpdateIndices): Re-write accordingly.
14711
14712         Store element data in a separate ArrayData list in the above methods.
14713
14714         (MakeByteBlob): Implement to dump the array data into a byte array.
14715
14716 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14717
14718         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14719         into CheckIndices.
14720
14721         * constant.cs (Define): Implement.
14722
14723         (EmitConstant): Re-write fully.
14724
14725         Pass in location info.
14726
14727         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14728         respectively.
14729
14730         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14731         DictionaryEntry since we need location info too.
14732
14733         (constant_declaration): Update accordingly.
14734
14735         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14736         code into another method : UpdateIndices.
14737
14738 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14739
14740         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14741         some type checking etc.
14742
14743 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14744
14745         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14746         bits to provide dimension info if the user skips doing that.
14747
14748         Update second constructor to store the rank correctly.
14749
14750 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14751
14752         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14753         and try to implement.
14754
14755         * ../errors/cs0150.cs : Add.
14756
14757         * ../errors/cs0178.cs : Add.
14758
14759 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14760
14761         * statement.cs: Implement foreach on multi-dimensional arrays. 
14762
14763         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14764         name of the params argument.
14765
14766         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14767         initializing the array.
14768
14769         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14770         we can use this elsewhere.
14771
14772         * statement.cs: Finish implementation of foreach for single
14773         dimension arrays.
14774
14775         * cs-parser.jay: Use an out-of-band stack to pass information
14776         around, I wonder why I need this.
14777
14778         foreach_block: Make the new foreach_block the current_block.
14779
14780         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14781         function used to return a static Parameters structure.  Used for
14782         empty parameters, as those are created very frequently.
14783
14784         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14785
14786 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14787
14788         * interface.cs : Default modifier is private, not public. The
14789         make verify test passes again.
14790
14791 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14792
14793         * support.cs (ReflectionParameters): Fix logic to determine
14794         whether the last parameter is a params one. Test 9 passes again.
14795
14796         * delegate.cs (Populate): Register the builders we define with
14797         RegisterParameterForBuilder. Test 19 passes again.
14798
14799         * cs-parser.jay (property_declaration): Reference $6 instead
14800         of $$ to get at the location.
14801
14802         (indexer_declaration): Similar stuff.
14803
14804         (attribute): Ditto.
14805
14806         * class.cs (Property): Register parameters for the Get and Set methods
14807         if they exist. Test 23 passes again.
14808
14809         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14810         call to EmitArguments as we are sure there aren't any params arguments. 
14811         Test 32 passes again.
14812
14813         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14814         IndexOutOfRangeException. 
14815
14816         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14817         Test 33 now passes again.
14818
14819 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14820
14821         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14822         broke a bunch of things.  Will have to come up with a better way
14823         of tracking locations.
14824
14825         * statement.cs: Implemented foreach for single dimension arrays.
14826
14827 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14828
14829         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14830         an error.  This removes the lookup from the critical path.
14831
14832         * cs-parser.jay: Removed use of temporary_loc, which is completely
14833         broken. 
14834
14835 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14836
14837         * support.cs (ReflectionParameters.ParameterModifier): Report
14838         whether the argument is a PARAMS argument or not.
14839
14840         * class.cs: Set the attribute `ParamArrayAttribute' on the
14841         parameter argument.
14842
14843         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14844         and cons_param_array_attribute (ConstructorInfo for
14845         ParamArrayAttribute)., 
14846
14847         * codegen.cs: Emit the return using the `Return' statement, that
14848         way we can report the error correctly for missing return values. 
14849
14850         * class.cs (Method.Emit): Clean up.
14851
14852         * expression.cs (Argument.Resolve): Take another argument: the
14853         location where this argument is used.  Notice that this is not
14854         part of the "Argument" class as to reduce the size of the
14855         structure (we know the approximate location anyways).
14856
14857         Test if the argument is a variable-reference, if not, then
14858         complain with a 206.
14859
14860         (Argument.Emit): Emit addresses of variables.
14861
14862         (Argument.FullDesc): Simplify.
14863
14864         (Invocation.DoResolve): Update for Argument.Resolve.
14865
14866         (ElementAccess.DoResolve): ditto.
14867
14868         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14869         method should be virtual, as this method is always virtual.
14870
14871         (NewDelegate.DoResolve): Update for Argument.Resolve.
14872
14873         * class.cs (ConstructorInitializer.DoResolve): ditto.
14874
14875         * attribute.cs (Attribute.Resolve): ditto.
14876
14877 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14878
14879         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14880
14881         * expression.cs (ParameterReference): Drop IStackStorage and implement
14882         IAssignMethod instead. 
14883
14884         (LocalVariableReference): ditto.
14885
14886         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14887         IAssignMethod instead. 
14888
14889 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14890
14891         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14892         enumerations that are used in heavily used structures derive from
14893         byte in a laughable and pathetic attempt to reduce memory usage.
14894         This is the kind of pre-optimzations that you should not do at
14895         home without adult supervision.
14896
14897         * expression.cs (UnaryMutator): New class, used to handle ++ and
14898         -- separatedly from the other unary operators.  Cleans up the
14899         code, and kills the ExpressionStatement dependency in Unary.
14900
14901         (Unary): Removed `method' and `Arguments' from this class, making
14902         it smaller, and moving it all to SimpleCall, so I can reuse this
14903         code in other locations and avoid creating a lot of transient data
14904         strucutres when not required.
14905
14906         * cs-parser.jay: Adjust for new changes.
14907
14908 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14909
14910         * enum.cs (Enum.Populate): If there is a failure during
14911         definition, return
14912
14913         * cs-parser.jay (opt_enum_base): we used to catch type errors
14914         here, but this is really incorrect.  The type error should be
14915         catched during semantic analysis.
14916
14917 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14918
14919         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14920         current_local_parameters as expected since I, in my stupidity, had forgotten
14921         to do this :-)
14922
14923         * attribute.cs (GetValidPlaces): Fix stupid bug.
14924
14925         * class.cs (Method::Emit): Perform check on applicability of attributes.
14926
14927         (Constructor::Emit): Ditto.
14928
14929         (Field::Emit): Ditto.
14930
14931         (Field.Location): Store location information.
14932
14933         (Property, Event, Indexer, Operator): Ditto.
14934
14935         * cs-parser.jay (field_declaration): Pass in location for each field.
14936
14937         * ../errors/cs0592.cs : Add.
14938
14939 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14940
14941         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14942
14943         (InitCoreTypes): Update accordingly.
14944
14945         (RegisterAttrType, LookupAttr): Implement.
14946
14947         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14948         info about the same.
14949
14950         (Resolve): Update to populate the above as necessary.
14951
14952         (Error592): Helper.
14953
14954         (GetValidPlaces): Helper to the above.
14955
14956         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14957
14958         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14959
14960 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14961
14962         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14963
14964         * ../errors/cs0617.cs : Add.
14965
14966 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14967
14968         * enum.cs (Emit): Rename to Populate to be more consistent with what
14969         we expect it to do and when exactly it is called.
14970
14971         * class.cs, rootcontext.cs : Update accordingly.
14972
14973         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14974         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14975
14976         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14977
14978         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14979         of a fieldinfo using the above, when dealing with a FieldBuilder.
14980
14981 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14982
14983         * ../errors/cs0031.cs : Add.
14984
14985         * ../errors/cs1008.cs : Add.
14986
14987         * ../errrors/cs0543.cs : Add.
14988
14989         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14990         enum type.
14991
14992         (FindMembers): Implement.
14993
14994         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14995         enums and delegates too.
14996
14997         (enum_types): Rename to builder_to_enum.
14998
14999         (delegate_types): Rename to builder_to_delegate.
15000
15001         * delegate.cs (FindMembers): Implement.
15002
15003 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15004
15005         * typemanager.cs (IsEnumType): Implement.
15006
15007         * enum.cs (Emit): Re-write parts to account for the underlying type
15008         better and perform checking etc.
15009
15010         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15011         of the underlying type.
15012
15013         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15014         value
15015
15016         * enum.cs (error31): Helper to report error #31.
15017
15018         * cs-parser.jay (enum_declaration): Store location of each member too.
15019
15020         * enum.cs (member_to_location): New hashtable. 
15021
15022         (AddEnumMember): Update location hashtable.
15023
15024         (Emit): Use the location of each member while reporting errors.
15025
15026 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15027
15028         * cs-parser.jay: A for_initializer if is a
15029         local_variable_declaration really ammount to have an implicit
15030         block with the variable declaration and no initializer for for.
15031
15032         * statement.cs (For.Emit): Cope with null initializers.
15033
15034         This fixes the infinite loop on for initializers.
15035
15036 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15037
15038         * enum.cs: More cleanup.
15039
15040         * ecore.cs: Remove dead code.
15041
15042         * class.cs (Property.Emit): More simplification.
15043         (Event.Emit): ditto.
15044
15045         Reworked to have less levels of indentation.
15046
15047 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15048
15049         * class.cs (Property): Emit attributes.
15050
15051         (Field): Ditto.
15052
15053         (Event): Ditto.
15054
15055         (Indexer): Ditto.
15056
15057         (Operator): Ditto.
15058
15059         * enum.cs (Emit): Ditto.
15060
15061         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15062         Enums too.
15063
15064         * class.cs (Field, Event, etc.): Move attribute generation into the
15065         Emit method everywhere.
15066
15067         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15068         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15069         as we had no way of defining nested enums !
15070
15071         * rootcontext.cs : Adjust code accordingly.
15072
15073         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15074
15075 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15076
15077         * expression.cs (EvalConstantExpression): Move into ecore.cs
15078
15079         * enum.cs (Enum): Rename some members and make them public and readonly
15080         according to our convention.
15081
15082         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15083         nothing else.
15084
15085         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15086
15087         (Enum::Emit): Write a simple version for now which doesn't try to compute
15088         expressions. I shall modify this to be more robust in just a while.
15089
15090         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15091
15092         (TypeContainer::CloseType): Create the Enum types too.
15093
15094         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15095
15096         * expression.cs (EvalConstantExpression): Get rid of completely.
15097
15098         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15099         user-defined values and other cases.
15100
15101         (IsValidEnumLiteral): Helper function.
15102
15103         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15104         out there in the case we had a literal FieldExpr.
15105
15106         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15107
15108         (Literalize): Revamp a bit to take two arguments.
15109
15110         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15111
15112 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15113
15114         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15115
15116         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15117
15118         (Resolve): Use the above to ensure we have proper initializers.
15119
15120 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15121
15122         * expression.cs (Expression::EvalConstantExpression): New method to 
15123         evaluate constant expressions.
15124
15125         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15126
15127 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15128
15129         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15130         in an array.
15131
15132         (Binary.ResolveOperator): Handle operator != (object a, object b)
15133         and operator == (object a, object b);
15134
15135         (Binary.DoNumericPromotions): Indicate whether the numeric
15136         promotion was possible.
15137
15138         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15139         Implement.  
15140
15141         Made the ArrayAccess implement interface IAssignMethod instead of
15142         IStackStore as the order in which arguments are passed reflects
15143         this.
15144
15145         * assign.cs: Instead of using expr.ExprClass to select the way of
15146         assinging, probe for the IStackStore/IAssignMethod interfaces.
15147
15148         * typemanager.cs: Load InitializeArray definition.
15149
15150         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15151         static data that can be used to initialize arrays. 
15152
15153 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15154
15155         * expression.cs: Handle operator== and operator!= for booleans.
15156
15157         (Conditioal.Reduce): Implement reducer for the ?: operator.
15158
15159         (Conditional.Resolve): Implement dead code elimination.
15160
15161         (Binary.Resolve): Catch string literals and return a new
15162         concatenated string.
15163
15164         (Unary.Reduce): Implement reduction of unary expressions.
15165
15166         * ecore.cs: Split out the expression core handling here.
15167
15168         (Expression.Reduce): New method used to perform constant folding
15169         and CSE.  This is needed to support constant-expressions. 
15170
15171         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15172         targets, and optimize for !x.
15173
15174 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15175
15176         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15177         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15178         set custom atttributes.
15179
15180         * literal.cs (Literal::GetValue): New abstract method to return the actual
15181         value of the literal, cast as an object.
15182
15183         (*Literal): Implement GetValue method.
15184
15185         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15186         expressions to the arraylist but objects of type Argument.
15187
15188         * class.cs (TypeContainer::Emit): Emit our attributes too.
15189
15190         (Method::Emit, Constructor::Emit): Ditto.
15191
15192         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15193         to be ignoring earlier.
15194
15195 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15196
15197         * attribute.cs (AttributeSection::Define): Implement to do the business
15198         of constructing a CustomAttributeBuilder.
15199
15200         (Attribute): New trivial class. Increases readability of code.  
15201
15202         * cs-parser.jay : Update accordingly.
15203
15204         (positional_argument_list, named_argument_list, named_argument): New rules
15205
15206         (attribute_arguments): Use the above so that we are more correct.
15207
15208 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15209
15210         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15211         to perform all checks for a method with a params parameter.
15212
15213         (Invocation::OverloadResolve): Update to use the above method and therefore
15214         cope correctly with params method invocations.
15215
15216         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15217         params too.
15218
15219         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15220         constructors in our parent too because we can't afford to miss out on 
15221         protected ones ;-)
15222
15223         * attribute.cs (AttributeSection): New name for the class Attribute
15224
15225         Other trivial changes to improve readability.
15226
15227         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15228         use the new class names.
15229
15230 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15231
15232         * class.cs (Method::Define): Complete definition for params types too
15233
15234         (Indexer::Define): Ditto.
15235
15236         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15237         Cope everywhere with a request for info about the array parameter.
15238
15239 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15240
15241         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15242
15243         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15244         local_variable_type to extract the string corresponding to the type.
15245
15246         (local_variable_type): Fixup the action to use the new helper method.
15247
15248         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15249         go.
15250
15251         * expression.cs : Clean out code which uses the above.
15252
15253 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15254
15255         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15256         and bale out if necessary by returning a false.
15257
15258         (RegisterProperty): Ditto.
15259
15260         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15261         and print out appropriate error messages.
15262
15263         * interface.cs (everywhere): Ditto.
15264
15265         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15266         location to constructor.
15267
15268         * class.cs (Property, Event, Indexer): Update accordingly.
15269
15270         * ../errors/cs111.cs : Added.
15271
15272         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15273         of a method, as laid down by the spec.
15274
15275         (Invocation::OverloadResolve): Use the above method.
15276
15277 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15278
15279         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15280         now take a TypeContainer and a Parameters object.
15281
15282         (ParameterData): Modify return type of ParameterModifier method to be 
15283         Parameter.Modifier and not a string.
15284
15285         (ReflectionParameters, InternalParameters): Update accordingly.
15286
15287         * expression.cs (Argument::GetParameterModifier): Same here.
15288
15289         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15290         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15291         symbol in it at all so maybe this is only for now.
15292
15293 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15294
15295         * support.cs (InternalParameters): Constructor now takes an extra argument 
15296         which is the actual Parameters class.
15297
15298         (ParameterDesc): Update to provide info on ref/out modifiers.
15299
15300         * class.cs (everywhere): Update call to InternalParameters to pass in
15301         the second argument too.
15302
15303         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15304         to return the modifier info [ref/out etc]
15305
15306         (InternalParameters, ReflectionParameters): Implement the above.
15307
15308         * expression.cs (Argument::ParameterModifier): Similar function to return
15309         info about the argument's modifiers.
15310
15311         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15312         too.
15313
15314         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15315         a new SetFormalParameters object which we pass to InternalParameters.
15316
15317 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15318
15319         * expression.cs (NewArray): Merge into the ArrayCreation class.
15320
15321 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15322
15323         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15324         NewUserdefinedArray into one as there wasn't much of a use in having
15325         two separate ones.
15326
15327         * expression.cs (Argument): Change field's name to ArgType from Type.
15328
15329         (Type): New readonly property which returns the proper type, taking into 
15330         account ref/out modifiers.
15331
15332         (everywhere): Adjust code accordingly for the above.
15333
15334         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15335         whether we are emitting for a ref or out parameter.
15336
15337         * expression.cs (Argument::Emit): Use the above field to set the state.
15338
15339         (LocalVariableReference::Emit): Update to honour the flag and emit the
15340         right stuff.
15341
15342         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15343
15344         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15345
15346         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15347
15348         (ReflectionParameters, InternalParameters): Implement the above method.
15349
15350         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15351         reporting errors.
15352
15353         (Invocation::FullMethodDesc): Ditto. 
15354
15355 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15356
15357         * cs-parser.jay: Add extra production for the second form of array
15358         creation. 
15359
15360         * expression.cs (ArrayCreation): Update to reflect the above
15361         change. 
15362
15363         * Small changes to prepare for Array initialization.
15364
15365 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15366
15367         * typemanager.cs (ImplementsInterface): interface might be null;
15368         Deal with this problem;
15369
15370         Also, we do store negative hits on the cache (null values), so use
15371         this instead of calling t.GetInterfaces on the type everytime.
15372
15373 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15374
15375         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15376
15377         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15378         split functionality out into different classes.
15379
15380         (New::FormArrayType): Move into NewBuiltinArray.
15381
15382         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15383         quite useless.
15384
15385         (NewBuiltinArray): New class to handle creation of built-in arrays.
15386
15387         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15388         account creation of one-dimensional arrays.
15389
15390         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15391
15392         (NewUserdefinedArray::DoResolve): Implement.
15393
15394         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15395
15396         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15397         we maintain inside the TypeManager. This is necessary to perform lookups on the
15398         module builder.
15399
15400         (LookupType): Update to perform GetType on the module builders too.     
15401
15402         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15403
15404         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15405
15406 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15407
15408         * expression.cs (New::DoResolve): Implement guts of array creation.
15409
15410         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15411
15412 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15413
15414         * expression.cs: Fix bug I introduced lsat night that broke
15415         Delegates. 
15416
15417         (Expression.Resolve): Report a 246 error (can not resolve name)
15418         if we find a SimpleName in the stream.
15419
15420         (Expression.ResolveLValue): Ditto.
15421
15422         (Expression.ResolveWithSimpleName): This function is a variant of
15423         ResolveName, this one allows SimpleNames to be returned without a
15424         warning.  The only consumer of SimpleNames is MemberAccess
15425
15426 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15427
15428         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15429         might arrive here.  I have my doubts that this is correct.
15430
15431         * statement.cs (Lock): Implement lock statement.
15432
15433         * cs-parser.jay: Small fixes to support `lock' and `using'
15434
15435         * cs-tokenizer.cs: Remove extra space
15436
15437         * driver.cs: New flag --checked, allows to turn on integer math
15438         checking. 
15439
15440         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15441         Threading.Monitor.Exit 
15442
15443 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15444
15445         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15446         Expression Class to be IndexerAccess.
15447
15448         Notice that Indexer::DoResolve sets the eclass to Value.
15449
15450 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15451
15452         * class.cs (TypeContainer::Emit): Emit code for indexers.
15453
15454         * assign.cs (IAssignMethod): New interface implemented by Indexers
15455         and Properties for handling assignment.
15456
15457         (Assign::Emit): Simplify and reuse code. 
15458
15459         * expression.cs (IndexerAccess, PropertyExpr): Implement
15460         IAssignMethod, clean up old code. 
15461
15462 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15463
15464         * typemanager.cs (ImplementsInterface): New method to determine if a type
15465         implements a given interface. Provides a nice cache too.
15466
15467         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15468         method.
15469
15470         (ConvertReferenceExplicit): Ditto.
15471
15472         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15473         various methods, with correct names etc.
15474
15475         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15476         Operator.UnaryNegation.
15477
15478         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15479         we have a unary plus or minus operator.
15480
15481         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15482         UnaryMinus.
15483
15484         * everywhere : update accordingly.
15485
15486         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15487         respectively.
15488
15489         * class.cs (Method::Define): For the case where we are implementing a method
15490         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15491         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15492
15493 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15494
15495         * interface.cs (FindMembers): Implement to work around S.R.E
15496         lameness.
15497
15498         * typemanager.cs (IsInterfaceType): Implement.
15499
15500         (FindMembers): Update to handle interface types too.
15501
15502         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15503         use IsAssignableFrom as that is not correct - it doesn't work.
15504
15505         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15506         and accordingly override EmitStatement.
15507
15508         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15509         using the correct logic :-)
15510
15511 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15512
15513         * ../errors/cs-11.cs : Add to demonstrate error -11 
15514
15515 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15516
15517         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15518         then pass this as a hint to ResolveLValue.
15519
15520         * expression.cs (FieldExpr): Add Location information
15521
15522         (FieldExpr::LValueResolve): Report assignment to readonly
15523         variable. 
15524
15525         (Expression::ExprClassFromMemberInfo): Pass location information.
15526
15527         (Expression::ResolveLValue): Add new method that resolves an
15528         LValue. 
15529
15530         (Expression::DoResolveLValue): Default invocation calls
15531         DoResolve. 
15532
15533         (Indexers): New class used to keep track of indexers in a given
15534         Type. 
15535
15536         (IStackStore): Renamed from LValue, as it did not really describe
15537         what this did.  Also ResolveLValue is gone from this interface and
15538         now is part of Expression.
15539
15540         (ElementAccess): Depending on the element access type
15541
15542         * typemanager.cs: Add `indexer_name_type' as a Core type
15543         (System.Runtime.CompilerServices.IndexerNameAttribute)
15544
15545         * statement.cs (Goto): Take a location.
15546
15547 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15548
15549         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15550         if two delegates are compatible.
15551
15552         (NewDelegate::DoResolve): Update to take care of the case when
15553         we instantiate a delegate from another delegate.
15554
15555         * typemanager.cs (FindMembers): Don't even try to look up members
15556         of Delegate types for now.
15557
15558 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15559
15560         * delegate.cs (NewDelegate): New class to take care of delegate
15561         instantiation.
15562
15563         * expression.cs (New): Split the delegate related code out into 
15564         the NewDelegate class.
15565
15566         * delegate.cs (DelegateInvocation): New class to handle delegate 
15567         invocation.
15568
15569         * expression.cs (Invocation): Split out delegate related code into
15570         the DelegateInvocation class.
15571
15572 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15573
15574         * expression.cs (New::DoResolve): Implement delegate creation fully
15575         and according to the spec.
15576
15577         (New::DoEmit): Update to handle delegates differently.
15578
15579         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15580         because of which we were printing out arguments in reverse order !
15581
15582         * delegate.cs (VerifyMethod): Implement to check if the given method
15583         matches the delegate.
15584
15585         (FullDelegateDesc): Implement.
15586
15587         (VerifyApplicability): Implement.
15588
15589         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15590         delegate invocations too.
15591
15592         (Invocation::Emit): Ditto.
15593
15594         * ../errors/cs1593.cs : Added.
15595
15596         * ../errors/cs1594.cs : Added.
15597
15598         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15599
15600 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15601
15602         * typemanager.cs (intptr_type): Core type for System.IntPtr
15603
15604         (InitCoreTypes): Update for the same.
15605
15606         (iasyncresult_type, asynccallback_type): Ditto.
15607
15608         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15609         correct.
15610
15611         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15612         too.
15613
15614         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15615         the builders for the 4 members of a delegate type :-)
15616
15617         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15618         type.
15619
15620         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15621
15622         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15623
15624 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15625
15626         * statement.cs (Break::Emit): Implement.   
15627         (Continue::Emit): Implement.
15628
15629         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15630         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15631         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15632         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15633         end loop
15634
15635         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15636         properties that track the label for the current loop (begin of the
15637         loop and end of the loop).
15638
15639 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15640
15641         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15642         use of emitting anything at all.
15643
15644         * class.cs, rootcontext.cs : Get rid of calls to the same.
15645
15646         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15647
15648         (Populate): Define the constructor correctly and set the implementation
15649         attributes.
15650
15651         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15652         have been defined.
15653
15654         (AddDelegateType): Implement.
15655
15656         (IsDelegateType): Implement helper method.
15657
15658         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15659
15660         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15661         and accordingly handle it.
15662
15663         * delegate.cs (Populate): Take TypeContainer argument.
15664         Implement bits to define the Invoke method. However, I still haven't figured out
15665         how to take care of the native int bit :-(
15666
15667         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15668         Qualify the name of the delegate, not its return type !
15669
15670         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15671         conversion.
15672
15673         (StandardConversionExists): Checking for array types turns out to be recursive.
15674
15675         (ConvertReferenceExplicit): Implement array conversion.
15676
15677         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15678
15679 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15680
15681         * cs-parser.jay (delegate_declaration): Store the fully qualified
15682         name as it is a type declaration.
15683
15684         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15685         readonly.
15686
15687         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15688         as TypeContainer::DefineType.
15689
15690         (Populate): Method in which all the definition of the various methods (Invoke)
15691         etc is done.
15692
15693         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15694         see.
15695
15696         (CloseDelegate): Finally creates the delegate.
15697
15698         * class.cs (TypeContainer::DefineType): Update to define delegates.
15699         (Populate, Emit and CloseType): Do the same thing here too.
15700
15701         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15702         delegates in all these operations.
15703
15704 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15705
15706         * expression.cs: LocalTemporary: a new expression used to
15707         reference a temporary that has been created.
15708
15709         * assign.cs: Handle PropertyAccess back here, so that we can
15710         provide the proper semantic access to properties.
15711
15712         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15713         a few more explicit conversions. 
15714
15715         * modifiers.cs: `NEW' modifier maps to HideBySig.
15716
15717         * expression.cs (PropertyExpr): Make this into an
15718         ExpressionStatement, and support the EmitStatement code path. 
15719
15720         Perform get/set error checking, clean up the interface.
15721
15722         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15723         them into toplevel access objects.
15724
15725 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15726
15727         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15728         SRE.
15729
15730         * typemanager.cs: Keep track here of our PropertyBuilders again to
15731         work around lameness in SRE.
15732
15733 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15734
15735         * expression.cs (LValue::LValueResolve): New method in the
15736         interface, used to perform a second resolution pass for LValues. 
15737
15738         (This::DoResolve): Catch the use of this in static methods.
15739
15740         (This::LValueResolve): Implement.
15741
15742         (This::Store): Remove warning, assigning to `this' in structures
15743         is 
15744
15745         (Invocation::Emit): Deal with invocation of
15746         methods on value types.  We need to pass the address to structure
15747         methods rather than the object itself.  (The equivalent code to
15748         emit "this" for structures leaves the entire structure on the
15749         stack instead of a pointer to it). 
15750
15751         (ParameterReference::DoResolve): Compute the real index for the
15752         argument based on whether the method takes or not a `this' pointer
15753         (ie, the method is static).
15754
15755         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15756         value types returned from functions when we need to invoke a
15757         method on the sturcture.
15758
15759
15760 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15761
15762         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15763         defining the type in the Modulebuilder or Typebuilder. This is to take
15764         care of nested types which need to be defined on the TypeBuilder using
15765         DefineNestedMethod.
15766
15767         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15768         methods in RootContext, only ported to be part of TypeContainer.
15769
15770         (TypeContainer::GetInterfaceOrClass): Ditto.
15771
15772         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15773
15774         * interface.cs (Interface::DefineInterface): New method. Does exactly
15775         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15776         too.
15777
15778         (Interface::GetInterfaces): Move from RootContext here and port.
15779
15780         (Interface::GetInterfaceByName): Same here.
15781
15782         * rootcontext.cs (ResolveTree): Re-write.
15783
15784         (PopulateTypes): Re-write.
15785
15786         * class.cs (TypeContainer::Populate): Populate nested types too.
15787         (TypeContainer::Emit): Emit nested members too.
15788
15789         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15790         instead just use the name argument passed in as it is already fully
15791         qualified.
15792
15793         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15794         to TypeContainer mapping to see if a type is user-defined.
15795
15796         * class.cs (TypeContainer::CloseType): Implement. 
15797
15798         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15799         the default constructor.
15800
15801         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15802         twice.
15803
15804         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15805
15806         * interface.cs (CloseType): Create the type here.
15807
15808         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15809         the hierarchy.
15810
15811         Remove all the methods which are now in TypeContainer.
15812
15813 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15814
15815         * delegate.cs (Define): Re-write bits to define the delegate
15816         correctly.
15817
15818 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15819
15820         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15821
15822         * expression.cs (ImplicitReferenceConversion): handle null as well
15823         as a source to convert to any reference type.
15824
15825         * statement.cs (Return): Perform any implicit conversions to
15826         expected return type.  
15827
15828         Validate use of return statement.  
15829
15830         * codegen.cs (EmitContext): Pass the expected return type here.
15831
15832         * class.cs (Method, Constructor, Property): Pass expected return
15833         type to EmitContext.
15834
15835 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15836
15837         * expression.cs: Make DoResolve take an EmitContext instead of a
15838         TypeContainer.
15839
15840         Replaced `l' and `location' for `loc', for consistency.
15841
15842         (Error, Warning): Remove unneeded Tc argument.
15843
15844         * assign.cs, literal.cs, constant.cs: Update to new calling
15845         convention. 
15846
15847         * codegen.cs: EmitContext now contains a flag indicating whether
15848         code is being generated in a static method or not.
15849
15850         * cs-parser.jay: DecomposeQI, new function that replaces the old
15851         QualifiedIdentifier.  Now we always decompose the assembled
15852         strings from qualified_identifier productions into a group of
15853         memberaccesses.
15854
15855 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15856
15857         * rootcontext.cs: Deal with field-less struct types correctly now
15858         by passing the size option to Define Type.
15859
15860         * class.cs: Removed hack that created one static field. 
15861
15862 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15863
15864         * statement.cs: Moved most of the code generation here. 
15865
15866 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15867
15868         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15869         seem very right.
15870
15871         (ElementAccess): Remove useless bits for now - keep checks as the spec
15872         says.
15873
15874 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15875
15876         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15877         and start performing checks according to the spec.
15878
15879 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15880
15881         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15882         rank_specifiers instead.
15883
15884         (rank_specifiers): Change the order in which the rank specifiers are stored
15885
15886         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15887
15888         * expression.cs (ElementAccess): Implement the LValue interface too.
15889
15890 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15891
15892         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15893         except that user defined conversions are not included.
15894
15895         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15896         perform the conversion of the return type, if necessary.
15897
15898         (New::DoResolve): Check whether we are creating an array or an object
15899         and accordingly do the needful.
15900
15901         (New::Emit): Same here.
15902
15903         (New::DoResolve): Implement guts of array creation.
15904
15905         (New::FormLookupType): Helper function.
15906
15907 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15908
15909         * codegen.cs: Removed most of the code generation here, and move the
15910         corresponding code generation bits to the statement classes. 
15911
15912         Added support for try/catch/finalize and throw.
15913
15914         * cs-parser.jay: Added support for try/catch/finalize.
15915
15916         * class.cs: Catch static methods having the flags override,
15917         virtual or abstract.
15918
15919         * expression.cs (UserCast): This user cast was not really doing
15920         what it was supposed to do.  Which is to be born in fully resolved
15921         state.  Parts of the resolution were being performed at Emit time! 
15922
15923         Fixed this code.
15924
15925 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15926
15927         * expression.cs: Implicity convert the result from UserCast.
15928
15929 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15930
15931         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15932         prevented it from working correctly. 
15933
15934         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15935         merely ConvertImplicit.
15936
15937 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15938
15939         * typemanager.cs: Make the LookupTypeContainer function static,
15940         and not per-instance.  
15941
15942         * class.cs: Make static FindMembers (the one that takes a Type
15943         argument). 
15944
15945         * codegen.cs: Add EmitForeach here.
15946
15947         * cs-parser.jay: Make foreach a toplevel object instead of the
15948         inline expansion, as we need to perform semantic analysis on it. 
15949
15950 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15951
15952         * expression.cs (Expression::ImplicitUserConversion): Rename to
15953         UserDefinedConversion.
15954
15955         (Expression::UserDefinedConversion): Take an extra argument specifying 
15956         whether we look for explicit user conversions too.
15957
15958         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15959
15960         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15961
15962         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15963         with the appropriate arguments.
15964
15965         * cs-parser.jay (cast_expression): Record location too.
15966
15967         * expression.cs (Cast): Record location info.
15968
15969         (Expression::ConvertExplicit): Take location argument.
15970
15971         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15972         to determine if we are doing explicit conversions.
15973
15974         (UserCast::Emit): Update accordingly.
15975
15976         (Expression::ConvertExplicit): Report an error if everything fails.
15977
15978         * ../errors/cs0030.cs : Add.
15979
15980 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15981
15982         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15983         virtual and newslot bits. 
15984
15985         * class.cs (TypeContainer::RegisterRequiredImplementations):
15986         Record methods we need.
15987
15988         (TypeContainer::MakeKey): Helper function to make keys for
15989         MethodBases, since the Methodbase key is useless.
15990
15991         (TypeContainer::Populate): Call RegisterRequiredImplementations
15992         before defining the methods.   
15993
15994         Create a mapping for method_builders_to_methods ahead of time
15995         instead of inside a tight loop.
15996
15997         (::RequireMethods):  Accept an object as the data to set into the
15998         hashtable so we can report interface vs abstract method mismatch.
15999
16000 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16001
16002         * report.cs: Make all of it static.
16003
16004         * rootcontext.cs: Drop object_type and value_type computations, as
16005         we have those in the TypeManager anyways.
16006
16007         Drop report instance variable too, now it is a global.
16008
16009         * driver.cs: Use try/catch on command line handling.
16010
16011         Add --probe option to debug the error reporting system with a test
16012         suite. 
16013
16014         * report.cs: Add support for exiting program when a probe
16015         condition is reached.
16016
16017 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16018
16019         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16020         we do a forcible conversion regardless of type, to check if 
16021         ForceConversion returns a null.
16022
16023         (Binary::error19): Use location to report error.
16024
16025         (Unary::error23): Use location here too.
16026
16027         * ../errors/cs0019.cs : Check in.
16028
16029         * ../errors/cs0023.cs : Check in.
16030
16031         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16032         case of a non-null MethodInfo object with a length of 0 !
16033
16034         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16035         an applicable member - according to the spec :-)
16036         Also fix logic to find members in base types.
16037
16038         (Unary::ResolveOperator): Same here.
16039
16040         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16041         as I was getting thoroughly confused between this and error19 :-)
16042
16043         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16044         (::FindMostEncompassedType): Implement.
16045         (::FindMostEncompassingType): Implement.
16046         (::StandardConversionExists): Implement.
16047
16048         (UserImplicitCast): Re-vamp. We now need info about most specific
16049         source and target types so that we can do the necessary conversions.
16050
16051         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16052         mathematical union with no duplicates.
16053
16054 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16055
16056         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16057         in order from base classes to child classes, so that we can in
16058         child classes look up in our parent for method names and
16059         attributes (required for handling abstract, virtual, new, override
16060         constructs: we need to instrospect our base class, and if we dont
16061         populate the classes in order, the introspection might be
16062         incorrect.  For example, a method could query its parent before
16063         the parent has any methods and would determine that the parent has
16064         no abstract methods (while it could have had them)).
16065
16066         (RootContext::CreateType): Record the order in which we define the
16067         classes.
16068
16069 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16070
16071         * class.cs (TypeContainer::Populate): Also method definitions can
16072         fail now, keep track of this.
16073
16074         (TypeContainer::FindMembers): Implement support for
16075         DeclaredOnly/noDeclaredOnly flag.
16076
16077         (Constructor::Emit) Return the ConstructorBuilder.
16078
16079         (Method::Emit) Return the MethodBuilder. 
16080         Check for abstract or virtual methods to be public.
16081
16082         * rootcontext.cs (RootContext::CreateType): Register all the
16083         abstract methods required for the class to be complete and the
16084         interface methods that must be implemented. 
16085
16086         * cs-parser.jay: Report error 501 (method requires body if it is
16087         not marked abstract or extern).
16088
16089         * expression.cs (TypeOf::Emit): Implement.
16090
16091         * typemanager.cs: runtime_handle_type, new global type.
16092
16093         * class.cs (Property::Emit): Generate code for properties.
16094
16095 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16096
16097         * expression.cs (Unary::ResolveOperator): Find operators on base type
16098         too - we now conform exactly to the spec.
16099
16100         (Binary::ResolveOperator): Same here.
16101
16102         * class.cs (Operator::Define): Fix minor quirk in the tests.
16103
16104         * ../errors/cs0215.cs : Added.
16105
16106         * ../errors/cs0556.cs : Added.
16107
16108         * ../errors/cs0555.cs : Added.
16109
16110 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16111
16112         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16113         single integer which is really efficient
16114
16115 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16116
16117         *  expression.cs (Expression::ImplicitUserConversion): Use location
16118         even in the case when we are examining True operators.
16119  
16120         * class.cs (Operator::Define): Perform extensive checks to conform
16121         with the rules for operator overloading in the spec.
16122
16123         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16124         some of the other conversions mentioned in the spec.
16125
16126         * typemanager.cs (array_type): New static member for the System.Array built-in
16127         type.
16128
16129         (cloneable_interface): For System.ICloneable interface.
16130
16131         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16132         we start resolving the tree and populating types.
16133
16134         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16135  
16136 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16137
16138         * expression.cs (Expression::ExprClassFromMemberInfo,
16139         Expression::Literalize): Create literal expressions from
16140         FieldInfos which are literals.
16141
16142         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16143         type casts, because they were wrong.  The test suite in tests
16144         caught these ones.
16145
16146         (ImplicitNumericConversion): ushort to ulong requires a widening
16147         cast. 
16148
16149         Int32 constant to long requires widening cast as well.
16150
16151         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16152         for integers because the type on the stack is not i4.
16153
16154 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16155
16156         * expression.cs (report118): require location argument. 
16157
16158         * parameter.cs: Do not dereference potential null value.
16159
16160         * class.cs: Catch methods that lack the `new' keyword when
16161         overriding a name.  Report warnings when `new' is used without
16162         anything being there to override.
16163
16164         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16165
16166         * class.cs: Only add constructor to hashtable if it is non-null
16167         (as now constructors can fail on define).
16168
16169         (TypeManager, Class, Struct): Take location arguments.
16170
16171         Catch field instance initialization in structs as errors.
16172
16173         accepting_filter: a new filter for FindMembers that is static so
16174         that we dont create an instance per invocation.
16175
16176         (Constructor::Define): Catch errors where a struct constructor is
16177         parameterless 
16178
16179         * cs-parser.jay: Pass location information for various new
16180         constructs. 
16181
16182         * delegate.cs (Delegate): take a location argument.
16183
16184         * driver.cs: Do not call EmitCode if there were problesm in the
16185         Definition of the types, as many Builders wont be there. 
16186
16187         * decl.cs (Decl::Decl): Require a location argument.
16188
16189         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16190         into integers, and find the most appropiate integer for it.
16191
16192         * literal.cs: Implement ULongLiteral.
16193
16194         * rootcontext.cs: Provide better information about the location of
16195         failure when CreateType fails.
16196
16197 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16198
16199         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16200         as well.
16201
16202         * expression.cs (Binary::CheckShiftArguments): Add missing type
16203         computation.
16204         (Binary::ResolveOperator): Add type to the logical and and logical
16205         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16206         before.
16207
16208         (Binary::DoNumericPromotions): In the case where either argument
16209         is ulong (and most signed types combined with ulong cause an
16210         error) perform implicit integer constant conversions as well.
16211
16212 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16213
16214         * expression.cs (UserImplicitCast): Method should always be
16215         non-null. 
16216         (Invocation::BetterConversion): Simplified test for IntLiteral.
16217
16218         (Expression::ImplicitNumericConversion): Split this routine out.
16219         Put the code that performs implicit constant integer conversions
16220         here. 
16221
16222         (Expression::Resolve): Become a wrapper around DoResolve so we can
16223         check eclass and type being set after resolve.
16224
16225         (Invocation::Badness): Remove this dead function
16226
16227         (Binary::ResolveOperator): Do not compute the expensive argumnets
16228         unless we have a union for it.
16229
16230         (Probe::Emit): Is needs to do an isinst and then
16231         compare against null.
16232
16233         (::CanConvert): Added Location argument.  If the Location argument
16234         is null (Location.Null), then we do not report errors.  This is
16235         used by the `probe' mechanism of the Explicit conversion.  We do
16236         not want to generate an error for something that the user
16237         explicitly requested to be casted.  But the pipeline for an
16238         explicit cast first tests for potential implicit casts.
16239
16240         So for now, if the Location is null, it means `Probe only' to
16241         avoid adding another argument.   Might have to revise this
16242         strategy later.
16243
16244         (ClassCast): New class used to type cast objects into arbitrary
16245         classes (used in Explicit Reference Conversions).
16246
16247         Implement `as' as well.
16248
16249         Reverted all the patches from Ravi below: they were broken:
16250
16251                 * The use of `level' as a mechanism to stop recursive
16252                   invocations is wrong.  That was there just to catch the
16253                   bug with a strack trace but not as a way of addressing
16254                   the problem.
16255
16256                   To fix the problem we have to *understand* what is going
16257                   on and the interactions and come up with a plan, not
16258                   just get things going.
16259
16260                 * The use of the type conversion cache that I proposed
16261                   last night had an open topic: How does this work across
16262                   protection domains.  A user defined conversion might not
16263                   be public in the location where we are applying the
16264                   conversion, a different conversion might be selected
16265                   (ie, private A->B (better) but public B->A (worse),
16266                   inside A, A->B applies, but outside it, B->A will
16267                   apply).
16268
16269                 * On top of that (ie, even if the above is solved),
16270                   conversions in a cache need to be abstract.  Ie, `To
16271                   convert from an Int to a Short use an OpcodeCast', not
16272                   `To convert from an Int to a Short use the OpcodeCast on
16273                   the variable 5' (which is what this patch was doing).
16274
16275 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16276
16277         * expression.cs (Invocation::ConversionExists): Re-write to use
16278         the conversion cache
16279
16280         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16281         cache all conversions done, not just user-defined ones.
16282
16283         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16284         to determine if a conversion exists instead of acutually trying to 
16285         perform the conversion. It's faster too.
16286
16287         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16288         and only then attempt the implicit conversion.
16289
16290 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16291
16292         * expression.cs (ConvertImplicit): Use a cache for conversions
16293         already found. Check level of recursion and bail out if necessary.
16294
16295 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16296
16297         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16298         Export standard methods that we expect for string operations.
16299
16300         * statement.cs (Block::UsageWarning): Track usage of variables and
16301         report the errors for not used variables.
16302
16303         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16304         operator. 
16305
16306 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16307
16308         * codegen.cs: remove unnneded code 
16309
16310         * expression.cs: Removed BuiltinTypeAccess class
16311
16312         Fix the order in which implicit conversions are
16313         done.  
16314
16315         The previous fixed dropped support for boxed conversions (adding a
16316         test to the test suite now)
16317
16318         (UserImplicitCast::CanConvert): Remove test for source being null,
16319         that code is broken.  We should not feed a null to begin with, if
16320         we do, then we should track the bug where the problem originates
16321         and not try to cover it up here.
16322
16323         Return a resolved expression of type UserImplicitCast on success
16324         rather than true/false.  Ravi: this is what I was talking about,
16325         the pattern is to use a static method as a "constructor" for
16326         objects. 
16327
16328         Also, do not create arguments until the very last minute,
16329         otherwise we always create the arguments even for lookups that
16330         will never be performed. 
16331
16332         (UserImplicitCast::Resolve): Eliminate, objects of type
16333         UserImplicitCast are born in a fully resolved state. 
16334
16335         * typemanager.cs (InitCoreTypes): Init also value_type
16336         (System.ValueType). 
16337
16338         * expression.cs (Cast::Resolve): First resolve the child expression.
16339
16340         (LValue): Add new method AddressOf to be used by
16341         the `&' operator.  
16342
16343         Change the argument of Store to take an EmitContext instead of an
16344         ILGenerator, because things like FieldExpr need to be able to call
16345         their children expression to generate the instance code. 
16346
16347         (Expression::Error, Expression::Warning): Sugar functions for
16348         reporting errors.
16349
16350         (Expression::MemberLookup): Accept a TypeContainer instead of a
16351         Report as the first argument.
16352
16353         (Expression::ResolvePrimary): Killed.  I still want to improve
16354         this as currently the code is just not right.
16355
16356         (Expression::ResolveMemberAccess): Simplify, but it is still
16357         wrong. 
16358
16359         (Unary::Resolve): Catch errors in AddressOf operators.
16360
16361         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16362         index to a byte for the short-version, or the compiler will choose
16363         the wrong Emit call, which generates the wrong data.
16364
16365         (ParameterReference::Emit, ::Store): same.
16366
16367         (FieldExpr::AddressOf): Implement.
16368
16369         * typemanager.cs: TypeManager: made public variable instead of
16370         property.
16371
16372         * driver.cs: document --fatal.
16373
16374         * report.cs (ErrorMessage, WarningMessage): new names for the old
16375         Error and Warning classes.
16376
16377         * cs-parser.jay (member_access): Turn built-in access to types
16378         into a normal simplename
16379
16380 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16381
16382         * expression.cs (Invocation::BetterConversion): Fix to cope
16383         with q being null, since this was introducing a bug.
16384
16385         * expression.cs (ConvertImplicit): Do built-in conversions first.
16386
16387 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16388
16389         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16390
16391 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16392
16393         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16394         I had introduced long ago (what's new ?).
16395
16396         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16397         the work of all the checking. 
16398         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16399         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16400
16401         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16402         that is the right way. 
16403
16404         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16405         overloading resolution. Use everywhere instead of cutting and pasting code.
16406
16407         (Binary::ResolveOperator): Use MakeUnionSet.
16408
16409         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16410         we have to convert to bool types. Not complete yet.
16411
16412 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16413
16414         * typemanager.cs (TypeManager::CSharpName): support ushort.
16415
16416         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16417         to provide an expression that performsn an implicit constant int
16418         conversion (section 6.1.6).
16419         (Expression::ConvertImplicitRequired): Reworked to include
16420         implicit constant expression conversions.
16421
16422         (Expression::ConvertNumericExplicit): Finished.
16423
16424         (Invocation::Emit): If InstanceExpression is null, then it means
16425         that we perform a call on this.
16426
16427 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16428
16429         * expression.cs (Unary::Emit): Remove some dead code.
16430         (Probe): Implement Resolve and Emit for `is'.
16431         (Expression::ConvertImplicitRequired): Attempt to do constant
16432         expression conversions here.  Maybe should be moved to
16433         ConvertImplicit, but I am not sure.
16434         (Expression::ImplicitLongConstantConversionPossible,
16435         Expression::ImplicitIntConstantConversionPossible): New functions
16436         that tell whether is it possible to apply an implicit constant
16437         expression conversion.
16438
16439         (ConvertNumericExplicit): Started work on explicit numeric
16440         conversions.
16441
16442         * cs-parser.jay: Update operator constants.
16443
16444         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16445         (Parameters::GetSignature): Hook up VerifyArgs here.
16446         (Parameters::VerifyArgs): Verifies that no two arguments have the
16447         same name. 
16448
16449         * class.cs (Operator): Update the operator names to reflect the
16450         ones that the spec expects (as we are just stringizing the
16451         operator names).
16452
16453         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16454         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16455         previous usage did only work for our methods.
16456         (Expression::ConvertImplicit): Handle decimal implicit numeric
16457         conversions as well.
16458         (Expression::InternalTypeConstructor): Used to invoke constructors
16459         on internal types for default promotions.
16460
16461         (Unary::Emit): Implement special handling for the pre/post
16462         increment/decrement for overloaded operators, as they need to have
16463         the same semantics as the other operators.
16464
16465         (Binary::ResolveOperator): ditto.
16466         (Invocation::ConversionExists): ditto.
16467         (UserImplicitCast::Resolve): ditto.
16468
16469 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16470
16471         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16472         operator, return after emitting body. Regression tests pass again !
16473
16474         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16475         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16476         (Invocation::OverloadResolve): Ditto.
16477         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16478
16479         * everywhere : update calls to the above methods accordingly.
16480
16481 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16482
16483         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16484
16485         * expression.cs (ExpressionStatement): New base class used for
16486         expressions that can appear in statements, so that we can provide
16487         an alternate path to generate expression that do not leave a value
16488         on the stack.
16489
16490         (Expression::Emit, and all the derivatives): We no longer return
16491         whether a value is left on the stack or not.  Every expression
16492         after being emitted leaves a single value on the stack.
16493
16494         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16495         facilties of ExpressionStatement if possible.
16496
16497         * cs-parser.jay: Update statement_expression.
16498
16499 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16500
16501         * driver.cs: Change the wording of message
16502
16503 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16504
16505         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16506         the type of the expression to the return type of the method if
16507         we have an overloaded operator match ! The regression tests pass again !
16508         (Unary::ResolveOperator): Ditto.
16509
16510         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16511         to find "op_Implicit", not "implicit" ;-)
16512         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16513         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16514
16515         * everywhere : Correct calls to the above accordingly.
16516
16517         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16518         (ConvertImplicit): Do user-defined conversion if it exists.
16519
16520 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16521
16522         * assign.cs: track location.
16523         (Resolve): Use implicit conversions on assignment.
16524
16525         * literal.cs: Oops.  Not good, Emit of short access values should
16526         pass (Bytes) or the wrong argument will be selected.
16527
16528         * expression.cs (Unary::Emit): Emit code for -expr.
16529
16530         (Unary::ResolveOperator): Handle `Substract' for non-constants
16531         (substract from zero from the non-constants).
16532         Deal with Doubles as well. 
16533
16534         (Expression::ConvertImplicitRequired): New routine that reports an
16535         error if no implicit conversion exists. 
16536
16537         (Invocation::OverloadResolve): Store the converted implicit
16538         expressions if we make them
16539
16540 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16541
16542         * class.cs (ConstructorInitializer): Take a Location argument.
16543         (ConstructorBaseInitializer): Same here.
16544         (ConstructorThisInitializer): Same here.
16545
16546         * cs-parser.jay : Update all calls accordingly.
16547
16548         * expression.cs (Unary, Binary, New): Take location argument.
16549         Update accordingly everywhere.
16550
16551         * cs-parser.jay : Update all calls to the above to take a location
16552         argument.
16553
16554         * class.cs : Ditto.
16555
16556 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16557
16558         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16559         (Invocation::BetterConversion): Same here
16560         (Invocation::ConversionExists): Ditto.
16561
16562         (Invocation::ConversionExists): Implement.
16563
16564 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16565
16566         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16567         Also take an additional TypeContainer argument.
16568
16569         * All over : Pass in TypeContainer as argument to OverloadResolve.
16570
16571         * typemanager.cs (CSharpName): Update to check for the string type and return
16572         that too.
16573
16574         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16575         a given method.
16576
16577 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16578
16579         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16580         (Invocation::BetterFunction): Implement.
16581         (Invocation::BetterConversion): Implement.
16582         (Invocation::ConversionExists): Skeleton, no implementation yet.
16583
16584         Okay, things work fine !
16585
16586 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16587
16588         * typemanager.cs: declare and load enum_type, delegate_type and
16589         void_type. 
16590
16591         * expression.cs (Expression::Emit): Now emit returns a value that
16592         tells whether a value is left on the stack or not.  This strategy
16593         might be reveted tomorrow with a mechanism that would address
16594         multiple assignments.
16595         (Expression::report118): Utility routine to report mismatches on
16596         the ExprClass.
16597
16598         (Unary::Report23): Report impossible type/operator combination
16599         utility function.
16600
16601         (Unary::IsIncrementableNumber): Whether the type can be
16602         incremented or decremented with add.
16603         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16604         complemented. 
16605         (Unary::ResolveOperator): Implement ++, !, ~,
16606
16607         (Invocation::Emit): Deal with new Emit convetion.
16608
16609         * All Expression derivatives: Updated their Emit method to return
16610         whether they leave values on the stack or not.
16611
16612         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16613         stack for expressions that are statements. 
16614
16615 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16616
16617         * expression.cs (LValue): New interface.  Must be implemented by
16618         LValue objects.
16619         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16620         LValue interface.
16621
16622         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16623         interface for generating code, simplifies the code.
16624
16625 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16626
16627         * expression.cs (everywhere): Comment out return statements in ::Resolve
16628         methods to avoid the warnings.
16629
16630 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16631
16632         * driver.cs (parse): Report error 2001 if we can not open the
16633         source file.
16634
16635         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16636         not resolve it.
16637
16638         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16639         object. 
16640
16641         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16642         otherwise nested blocks end up with the same index.
16643
16644         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16645
16646         * expression.cs:  Instead of having FIXMEs in the Resolve
16647         functions, throw exceptions so it is obvious that we are facing a
16648         bug. 
16649
16650         * cs-parser.jay (invocation_expression): Pass Location information.
16651
16652         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16653         Use a basename for those routines because .NET does not like paths
16654         on them. 
16655
16656         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16657         already defined.
16658
16659 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16660
16661         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16662         are loading the correct data types (throws an exception if not).
16663         (TypeManager::InitCoreTypes): Use CoreLookupType
16664
16665         * expression.cs (Unary::ResolveOperator): return the child
16666         expression for expressions which are just +expr.
16667         (Unary::ResolveOperator): Return negative literals for -LITERAL
16668         expressions (otherwise they are Unary {Literal}).
16669         (Invocation::Badness): Take into account `Implicit constant
16670         expression conversions'.
16671
16672         * literal.cs (LongLiteral): Implement long literal class.
16673         (IntLiteral): export the `Value' of the intliteral. 
16674
16675 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16676
16677         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16678
16679         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16680         instead of 'Operator'
16681
16682         * expression.cs (Binary::ResolveOperator): Update accordingly.
16683         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16684         and 'Minus'
16685
16686         * cs-parser.jay (unary_expression): Update to use the new names.
16687
16688         * gen-treedump.cs (GetUnary): Same here.
16689
16690         * expression.cs (Unary::Resolve): Implement.
16691         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16692         operators are found instead of making noise ;-)
16693         (Unary::ResolveOperator): New method to do precisely the same thing which
16694         Binary::ResolveOperator does for Binary expressions.
16695         (Unary.method, .Arguments): Add.
16696         (Unary::OperName): Implement.   
16697         (Unary::ForceConversion): Copy and Paste !
16698
16699         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16700         a unary operator.
16701
16702         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16703         for the inbuilt operators. Only overloading works for now ;-)
16704
16705 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16706
16707         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16708         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16709
16710         * expression.cs (This::Emit): Implement. 
16711         (This::Resolve): Implement.
16712         (TypeOf:Resolve): Implement.
16713         (Expression::ResolveSimpleName): Add an implicit this to instance
16714         field references. 
16715         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16716         Bind instance variable to Field expressions.
16717         (FieldExpr::Instance): New field used to track the expression that
16718         represents the object instance.
16719         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16720         binding 
16721         (FieldExpr::Emit): Implement.
16722
16723         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16724         the last instruction contains a return opcode to avoid generating
16725         the last `ret' instruction (this generates correct code, and it is
16726         nice to pass the peverify output).
16727
16728         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16729         initializer for static and instance variables.
16730         (Constructor::Emit): Allow initializer to be null in the case of
16731         static constructors.  Only emit initializer for instance
16732         constructors. 
16733
16734         (TypeContainer::FindMembers): Return a null array if there are no
16735         matches.
16736
16737         Also fix the code for the MemberTypes.Method branch, as it was not
16738         scanning that for operators (or tried to access null variables before).
16739
16740         * assign.cs (Assign::Emit): Handle instance and static fields. 
16741
16742         * TODO: Updated.
16743
16744         * driver.cs: Stop compilation if there are parse errors.
16745
16746         * cs-parser.jay (constructor_declaration): Provide default base
16747         initializer for non-static constructors.
16748         (constructor_declarator): Do not provide a default base
16749         initializers if none was specified.
16750         Catch the fact that constructors should not have parameters.
16751
16752         * class.cs: Do not emit parent class initializers for static
16753         constructors, that should be flagged as an error.
16754
16755 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16756
16757         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16758         Move back code into TypeContainer::Populate.
16759
16760 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16761
16762         * class.cs (TypeContainer::AddConstructor): Fix the check to
16763         compare against Name, not Basename. 
16764         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16765
16766         * cs-parser.jay : Update accordingly.
16767
16768         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16769         for methods, don't forget to look into the operators too.
16770         (RegisterMethodBuilder): Helper method to take care of this for
16771         methods, constructors and operators.
16772         (Operator::Define): Completely revamp.
16773         (Operator.OperatorMethod, MethodName): New fields.
16774         (TypeContainer::Populate): Move the registering of builders into
16775         RegisterMethodBuilder.
16776         (Operator::Emit): Re-write.
16777
16778         * expression.cs (Binary::Emit): Comment out code path to emit method
16779         invocation stuff for the case when we have a user defined operator. I am
16780         just not able to get it right !
16781
16782 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16783
16784         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16785         argument. 
16786
16787         (Expression::MemberLookup): Provide a version that allows to
16788         specify the MemberTypes and BindingFlags. 
16789
16790         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16791         so it was not fetching variable information from outer blocks.
16792
16793         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16794         Beforefieldinit as it was buggy.
16795
16796         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16797         that Ravi put here.  
16798
16799         * class.cs (Constructor::Emit): Only emit if block is not null.
16800         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16801         deal with this by semantically definining it as if the user had
16802         done it.
16803
16804         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16805         constructors as we now "emit" them at a higher level.
16806
16807         (TypeContainer::DefineDefaultConstructor): Used to define the
16808         default constructors if none was provided.
16809
16810         (ConstructorInitializer): Add methods Resolve and Emit. 
16811
16812         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16813
16814 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16815
16816         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16817         the default constructor builder with our hashtable for methodbuilders
16818         to methodcores.
16819
16820         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16821         and argument_count is 0 in which case we have a match.
16822         (Binary::ResolveOperator): More null checking and miscellaneous coding
16823         style cleanup.
16824
16825 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16826
16827         * rootcontext.cs (IsNameSpace): Compare against null.
16828
16829         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16830
16831         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16832         and Unary::Operator.
16833
16834         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16835         accordingly.
16836
16837         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16838         we have overloaded operators.
16839         (Binary::ResolveOperator): Implement the part which does the operator overload
16840         resolution.
16841
16842         * class.cs (Operator::Emit): Implement.
16843         (TypeContainer::Emit): Emit the operators we have too.
16844
16845         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16846         the case when we have a user-defined operator.
16847
16848 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16849
16850         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16851
16852 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16853
16854         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16855         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16856         (Constructor::Emit): Implement.
16857         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16858         if we have no work to do. 
16859         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16860         Emit method.
16861
16862         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16863         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16864
16865         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16866         of parent.parent.
16867
16868 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16869
16870         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16871         in the source.
16872         (Tree::RecordNamespace): Method to do what the name says ;-)
16873         (Tree::Namespaces): Property to get at the namespaces hashtable.
16874
16875         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16876         keep track.
16877
16878         * rootcontext.cs (IsNamespace): Fixed it :-)
16879
16880 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16881
16882         * class.cs (TypeContainer::FindMembers): Add support for
16883         constructors. 
16884         (MethodCore): New class that encapsulates both the shared aspects
16885         of a Constructor and a Method.  
16886         (Method, Constructor): Factored pieces into MethodCore.
16887
16888         * driver.cs: Added --fatal which makes errors throw exceptions.
16889         Load System assembly as well as part of the standard library.
16890
16891         * report.cs: Allow throwing exceptions on errors for debugging.
16892
16893         * modifiers.cs: Do not use `parent', instead use the real type
16894         container to evaluate permission settings.
16895
16896         * class.cs: Put Ravi's patch back in.  He is right, and we will
16897         have to cope with the
16898
16899 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16900
16901         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16902         FamORAssem, not FamANDAssem.
16903
16904 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16905
16906         * driver.cs: Added --parse option that only parses its input files
16907         and terminates.
16908
16909         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16910         incorrect.  IsTopLevel is not used to tell whether an object is
16911         root_types or not (that can be achieved by testing this ==
16912         root_types).  But to see if this is a top-level *class* (not
16913         necessarly our "toplevel" container). 
16914
16915 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16916
16917         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16918         parent instead of a direct call to GetType.
16919
16920 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16921
16922         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16923         Modifiers.TypeAttr. This should just be a call to that method.
16924
16925         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16926         object so that we can determine if we are top-level or not.
16927
16928         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16929         TypeContainer too.
16930
16931         * enum.cs (Enum::Define): Ditto.
16932
16933         * modifiers.cs (FieldAttr): Re-write.
16934
16935         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16936         (TypeContainer::HaveStaticConstructor): New property to provide access
16937         to precisely that info.
16938
16939         * modifiers.cs (MethodAttr): Re-write.
16940         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16941
16942         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16943         of top-level types as claimed.
16944
16945 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16946
16947         * expression.cs (MemberLookup): Fruitless attempt to lookup
16948         constructors.  Maybe I need to emit default constructors?  That
16949         might be it (currently .NET emits this for me automatically).
16950         (Invocation::OverloadResolve): Cope with Arguments == null.
16951         (Invocation::EmitArguments): new function, shared by the new
16952         constructor and us.
16953         (Invocation::Emit): Handle static and instance methods.  Emit
16954         proper call instruction for virtual or non-virtual invocations.
16955         (New::Emit): Implement.
16956         (New::Resolve): Implement.
16957         (MemberAccess:Resolve): Implement.
16958         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16959         to track instances.
16960         (FieldExpr::Resolve): Set type.
16961
16962         * support.cs: Handle empty arguments.
16963                 
16964         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16965         SimpleLookup): Auxiliary routines to help parse a qualifier
16966         identifier.  
16967
16968         Update qualifier_identifier rule.
16969
16970         * codegen.cs: Removed debugging messages.
16971
16972         * class.cs: Make this a global thing, this acts just as a "key" to
16973         objects that we might have around.
16974
16975         (Populate): Only initialize method_builders_to_methods once.
16976
16977         * expression.cs (PropertyExpr): Initialize type from the
16978         PropertyType. 
16979
16980         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16981         Resolve pattern.  Attempt to implicitly convert value to boolean.
16982         Emit code.
16983
16984         * expression.cs: Set the type for the int32/int32 argument case.
16985         (Binary::ResolveOperator): Set the return type to boolean for
16986         comparission operators
16987
16988         * typemanager.cs: Remove debugging print code.
16989
16990         (Invocation::Resolve): resolve type.
16991
16992         * class.cs: Allocate a MemberInfo of the correct size, as the code
16993         elsewhere depends on the test to reflect the correct contents.
16994
16995         (Method::) Keep track of parameters, due to System.Reflection holes
16996
16997         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16998         mapping here.
16999
17000         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17001         of the exact size and return that.
17002
17003         (Class::LookupMethodByBuilder): New function that maps
17004         MethodBuilders to its methods.  Required to locate the information
17005         on methods because System.Reflection bit us again.
17006
17007         * support.cs: New file, contains an interface ParameterData and
17008         two implementations: ReflectionParameters and InternalParameters
17009         used to access Parameter information.  We will need to grow this
17010         as required.
17011
17012         * expression.cs (Invocation::GetParameterData): implement a cache
17013         and a wrapper around the ParameterData creation for methods. 
17014         (Invocation::OverloadResolve): Use new code.
17015
17016 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17017
17018         * class.cs (TypeContainer::EmitField): Remove and move into 
17019         (Field::Define): here and modify accordingly.
17020         (Field.FieldBuilder): New member.
17021         (TypeContainer::Populate): Update accordingly.
17022         (TypeContainer::FindMembers): Implement.
17023
17024 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17025
17026         * statement.cs: (VariableInfo::VariableType): New field to be
17027         initialized with the full type once it is resolved. 
17028
17029 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17030
17031         * parameter.cs (GetParameterInfo): Use a type cache to compute
17032         things only once, and to reuse this information
17033
17034         * expression.cs (LocalVariableReference::Emit): Implement.
17035         (OpcodeCast::Emit): fix.
17036
17037         (ParameterReference::Resolve): Implement.
17038         (ParameterReference::Emit): Implement.
17039
17040         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17041         that are expressions need to stay as Expressions.
17042
17043         * typemanager.cs (CSharpName): Returns the C# name of a type if
17044         possible. 
17045
17046         * expression.cs (Expression::ConvertImplicit): New function that
17047         implements implicit type conversions.
17048
17049         (Expression::ImplicitReferenceConversion): Implements implicit
17050         reference conversions.
17051
17052         (EmptyCast): New type for transparent casts.
17053
17054         (OpcodeCast): New type for casts of types that are performed with
17055         a sequence of bytecodes.
17056
17057         (BoxedCast): New type used for casting value types into reference
17058         types.  Emits a box opcode.
17059
17060         (Binary::DoNumericPromotions): Implements numeric promotions of
17061         and computation of the Binary::Type.
17062
17063         (Binary::EmitBranchable): Optimization.
17064
17065         (Binary::Emit): Implement code emission for expressions.
17066
17067         * typemanager.cs (TypeManager): Added two new core types: sbyte
17068         and byte.
17069
17070 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17071
17072         * class.cs (TypeContainer::FindMembers): Method which does exactly
17073         what Type.FindMembers does, only we don't have to use reflection. No
17074         implementation yet.
17075
17076         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17077         typecontainer objects as we need to get at them.
17078         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17079
17080         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17081         typecontainer object.
17082
17083         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17084         of just a Report object.
17085
17086 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17087
17088         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17089         "remove_"
17090         (TypeContainer::Populate): Now define the delegates of the type too.
17091         (TypeContainer.Delegates): Property to access the list of delegates defined
17092         in the type.
17093
17094         * delegates.cs (Delegate::Define): Implement partially.
17095
17096         * modifiers.cs (TypeAttr): Handle more flags.
17097
17098 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17099
17100         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17101         and not <=
17102         (Operator::Define): Re-write logic to get types by using the LookupType method
17103         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17104         (Indexer::Define): Ditto.
17105         (Event::Define): Ditto.
17106         (Property::Define): Ditto.
17107
17108 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17109
17110         * class.cs (TypeContainer::Populate): Now define operators too. 
17111         (TypeContainer.Operators): New property to access the list of operators
17112         in a type.
17113         (Operator.OperatorMethodBuilder): New member to hold the method builder
17114         for the operator we are defining.
17115         (Operator::Define): Implement.
17116
17117 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17118
17119         * class.cs (Event::Define): Make the prefixes of the accessor methods
17120         addOn_ and removeOn_ 
17121
17122         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17123         of the location being passed in too. Ideally, this should go later since all
17124         error reporting should be done through the Report object.
17125
17126         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17127         (Populate): Iterate thru the indexers we have and define them too.
17128         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17129         for the get and set accessors.
17130         (Indexer::Define): Implement.
17131
17132 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17133
17134         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17135         my previous implementation, did not work.
17136
17137         * typemanager.cs: Add a couple of missing types (the longs).
17138
17139         * literal.cs: Use TypeManager.bool_type instead of getting it.
17140
17141         * expression.cs (EventExpr): New kind of expressions.
17142         (Expressio::ExprClassFromMemberInfo): finish
17143
17144 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17145
17146         * assign.cs: Emit stores to static fields differently.
17147
17148 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17149
17150         * Merge in changes and adjust code to tackle conflicts. Backed out my
17151         code in Assign::Resolve ;-) 
17152
17153 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17154
17155         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17156         instead Report.Error and also pass in the location.
17157         (CSharpParser::Lexer): New readonly property to return the reference
17158         to the Tokenizer object.
17159         (declare_local_variables): Use Report.Error with location instead of plain 
17160         old error.
17161         (CheckDef): Ditto.
17162
17163         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17164         (Operator.CheckBinaryOperator): Ditto.
17165
17166         * cs-parser.jay (operator_declarator): Update accordingly.
17167
17168         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17169         (CheckBinaryOperator): Same here.
17170
17171         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17172         on the name without any prefixes of namespace names etc. This is because we
17173         already might have something already fully qualified like 
17174         'System.Console.WriteLine'
17175
17176         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17177
17178 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17179
17180         * cs-tokenizer.cs (location): Return a string which also contains
17181         the file name.
17182
17183         * expression.cs (ElementAccess): New class for expressions of the
17184         type 'element access.'
17185         (BaseAccess): New class for expressions of the type 'base access.'
17186         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17187         respectively.
17188
17189         * cs-parser.jay (element_access): Implement action.
17190         (base_access): Implement actions.
17191         (checked_expression, unchecked_expression): Implement.
17192
17193         * cs-parser.jay (local_variable_type): Correct and implement.
17194         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17195
17196         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17197
17198         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17199         name and the specifiers.
17200
17201         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17202
17203         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17204         making them all public ;-)
17205
17206         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17207         class anyways.
17208
17209 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17210
17211         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17212         PropertyExprs.
17213         (FieldExpr, PropertyExprs): New resolved expressions.
17214         (SimpleName::MemberStaticCheck): Perform static checks for access
17215         to non-static fields on static methods. Maybe this should be
17216         generalized for MemberAccesses. 
17217         (SimpleName::ResolveSimpleName): More work on simple name
17218         resolution. 
17219
17220         * cs-parser.jay (primary_expression/qualified_identifier): track
17221         the parameter index.
17222
17223         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17224         (EmitContext::EmitBoolExpression): Chain to expression generation
17225         instead of temporary hack.
17226         (::EmitStatementExpression): Put generic expression code generation.
17227
17228         * assign.cs (Assign::Emit): Implement variable assignments to
17229         local variables, parameters and fields.
17230
17231 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17232
17233         * statement.cs (Block::GetVariableInfo): New method, returns the
17234         VariableInfo for a variable name in a block.
17235         (Block::GetVariableType): Implement in terms of GetVariableInfo
17236
17237         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17238         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17239
17240 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17241
17242         * cs-parser.jay (operator_declaration): Continue on my quest : update
17243         to take attributes argument.
17244         (event_declaration): Ditto.
17245         (enum_declaration): Ditto.
17246         (indexer_declaration): Ditto.
17247
17248         * class.cs (Operator::Operator): Update constructor accordingly.
17249         (Event::Event): Ditto.
17250
17251         * delegate.cs (Delegate::Delegate): Same here.
17252
17253         * enum.cs (Enum::Enum): Same here.
17254
17255 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17256
17257         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17258
17259         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17260
17261         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17262         being passed around as an arraylist.
17263         (Attributes::AddAttribute): Method to add attribute sections.
17264
17265         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17266         (struct_declaration): Update accordingly.
17267         (constant_declaration): Update.
17268         (field_declaration): Update.
17269         (method_header): Update.
17270         (fixed_parameter): Update.
17271         (parameter_array): Ditto.
17272         (property_declaration): Ditto.
17273         (destructor_declaration): Ditto.
17274
17275         * class.cs (Struct::Struct): Update constructors accordingly.
17276         (Class::Class): Ditto.
17277         (Field::Field): Ditto.
17278         (Method::Method): Ditto.
17279         (Property::Property): Ditto.
17280         (TypeContainer::OptAttribute): update property's return type.
17281
17282         * interface.cs (Interface.opt_attributes): New member.
17283         (Interface::Interface): Update to take the extra Attributes argument.
17284
17285         * parameter.cs (Parameter::Parameter): Ditto.
17286
17287         * constant.cs (Constant::Constant): Ditto.
17288
17289         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17290         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17291         the attributes as a parameter.
17292         (InterfaceProperty): Update constructor call.
17293         (InterfaceEvent): Ditto.
17294         (InterfaceMethod): Ditto.
17295         (InterfaceIndexer): Ditto.
17296
17297         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17298         pass the attributes too.
17299         (interface_event_declaration): Ditto.
17300         (interface_property_declaration): Ditto.
17301         (interface_method_declaration): Ditto.
17302         (interface_declaration): Ditto.
17303
17304 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17305
17306         * class.cs (Method::Define): Track the "static Main" definition to
17307         create an entry point. 
17308
17309         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17310         EntryPoint if we find it. 
17311
17312         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17313         (EmitContext::ig): Make this variable public.
17314
17315         * driver.cs: Make the default output file be the first file name
17316         with the .exe extension.  
17317
17318         Detect empty compilations
17319
17320         Handle various kinds of output targets.  Handle --target and
17321         rename -t to --dumper.
17322
17323         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17324         methods inherited from Expression return now an Expression.  This
17325         will is used during the tree rewriting as we resolve them during
17326         semantic analysis.
17327
17328         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17329         the spec.  Missing entirely is the information about
17330         accessability of elements of it.
17331
17332         (Expression::ExprClassFromMemberInfo): New constructor for
17333         Expressions that creates a fully initialized Expression based on
17334         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17335         a Type.
17336
17337         (Invocation::Resolve): Begin implementing resolution of invocations.
17338
17339         * literal.cs (StringLiteral):  Implement Emit.
17340
17341 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17342
17343         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17344         member.
17345
17346 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17347
17348         * cs-parser.jay (attribute_arguments): Implement actions.
17349         (attribute): Fix bug in production. Implement action.
17350         (attribute_list): Implement.
17351         (attribute_target): Implement.
17352         (attribute_target_specifier, opt_target_specifier): Implement
17353         (CheckAttributeTarget): New method to check if the attribute target
17354         is valid.
17355         (attribute_section): Implement.
17356         (opt_attributes): Implement.
17357
17358         * attribute.cs : New file to handle attributes.
17359         (Attribute): Class to hold attribute info.
17360
17361         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17362         (attribute_section): Modify production to use 2 different rules to 
17363         achieve the same thing. 1 s/r conflict down !
17364         Clean out commented, useless, non-reducing dimension_separator rules.
17365
17366         * class.cs (TypeContainer.attributes): New member to hold list
17367         of attributes for a type.
17368         (Struct::Struct): Modify to take one more argument, the attribute list.
17369         (Class::Class): Ditto.
17370         (Field::Field): Ditto.
17371         (Method::Method): Ditto.
17372         (Property::Property): Ditto.
17373
17374         * cs-parser.jay (struct_declaration): Update constructor call to
17375         pass in the attributes too.
17376         (class_declaration): Ditto.
17377         (constant_declaration): Ditto.
17378         (field_declaration): Ditto.
17379         (method_header): Ditto.
17380         (fixed_parameter): Ditto.
17381         (parameter_array): Ditto.
17382         (property_declaration): Ditto.
17383
17384         * constant.cs (Constant::Constant): Update constructor similarly.
17385         Use System.Collections.
17386
17387         * parameter.cs (Parameter::Parameter): Update as above.
17388
17389 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17390
17391         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17392         (TypeContainer.delegates): New member to hold list of delegates.
17393
17394         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17395         this time as I seem to be on crack ;-)
17396
17397 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17398
17399         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17400         tell whether an identifier represents a namespace.
17401
17402         * expression.cs (NamespaceExpr): A namespace expression, used only
17403         temporarly during expression resolution.
17404         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17405         utility functions to resolve names on expressions.
17406
17407 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17408
17409         * codegen.cs: Add hook for StatementExpressions. 
17410
17411         * class.cs: Fix inverted test for static flag in methods.
17412
17413 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17414
17415         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17416         to make it coincide with MS' number.
17417         (Operator::CheckBinaryOperator): Ditto.
17418
17419         * ../errors/errors.txt : Remove error numbers added earlier.
17420
17421         * ../errors/cs1019.cs : Test case for error # 1019
17422
17423         * ../errros/cs1020.cs : Test case for error # 1020
17424
17425         * cs-parser.jay : Clean out commented cruft.
17426         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17427         used anywhere - non-reducing rule.
17428         (namespace_declarations): Non-reducing rule - comment out.
17429
17430         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17431         with TypeContainer::AddEnum.
17432
17433         * delegate.cs : New file for delegate handling classes.
17434         (Delegate): Class for declaring delegates.
17435
17436         * makefile : Update.
17437
17438         * cs-parser.jay (delegate_declaration): Implement.
17439
17440 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17441
17442         * class.cs (Event::Define): Implement.
17443         (Event.EventBuilder): New member.
17444
17445         * class.cs (TypeContainer::Populate): Update to define all enums and events
17446         we have.
17447         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17448         readonly fields for all these cases ?
17449
17450 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17451
17452         * class.cs (Property): Revamp to use the convention of making fields readonly.
17453         Accordingly modify code elsewhere.
17454
17455         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17456         the Define method of the Property class.
17457
17458         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17459         trivial bug.
17460         (TypeContainer::Populate): Update to define all the properties we have. Also
17461         define all enumerations.
17462
17463         * enum.cs (Define): Implement.
17464
17465 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17466
17467         * cs-parser.jay (overloadable_operator): The semantic value is an
17468         enum of the Operator class.
17469         (operator_declarator): Implement actions.
17470         (operator_declaration): Implement.
17471
17472         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17473         validity of definitions.
17474         (Operator::CheckBinaryOperator): Static method to check for binary operators
17475         (TypeContainer::AddOperator): New method to add an operator to a type.
17476
17477         * cs-parser.jay (indexer_declaration): Added line to actually call the
17478         AddIndexer method so it gets added ;-)
17479
17480         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17481         already taken care of by the MS compiler ?  
17482
17483 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17484
17485         * class.cs (Operator): New class for operator declarations.
17486         (Operator::OpType): Enum for the various operators.
17487
17488 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17489
17490         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17491         ostensibly handle this in semantic analysis.
17492
17493         * cs-parser.jay (general_catch_clause): Comment out
17494         (specific_catch_clauses, specific_catch_clause): Ditto.
17495         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17496         (catch_args, opt_catch_args): New productions.
17497         (catch_clause): Rewrite to use the new productions above
17498         (catch_clauses): Modify accordingly.
17499         (opt_catch_clauses): New production to use in try_statement
17500         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17501         and re-write the code in the actions to extract the specific and
17502         general catch clauses by being a little smart ;-)
17503
17504         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17505         Hooray, try and catch statements parse fine !
17506
17507 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17508
17509         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17510         string from the hashtable of variables.
17511
17512         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17513         I end up making that mistake ;-)
17514         (catch_clauses): Fixed gross error which made Key and Value of the 
17515         DictionaryEntry the same : $1 !!
17516
17517 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17518
17519         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17520
17521         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17522         when the add and remove accessors are specified. 
17523
17524 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17525
17526         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17527         information about indexer_declarator.
17528         (indexer_declarator): Implement actions.
17529         (parsing_indexer): New local boolean used to keep track of whether
17530         we are parsing indexers or properties. This is necessary because 
17531         implicit_parameters come into picture even for the get accessor in the 
17532         case of an indexer.
17533         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17534
17535         * class.cs (Indexer): New class for indexer declarations.
17536         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17537         (TypeContainer::indexers): New member to hold list of indexers for the
17538         type.
17539
17540 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17541
17542         * cs-parser.jay (add_accessor_declaration): Implement action.
17543         (remove_accessor_declaration): Implement action.
17544         (event_accessors_declaration): Implement
17545         (variable_declarators): swap statements for first rule - trivial.
17546
17547         * class.cs (Event): New class to hold information about event
17548         declarations.
17549         (TypeContainer::AddEvent): New method to add an event to a type
17550         (TypeContainer::events): New member to hold list of events.
17551
17552         * cs-parser.jay (event_declaration): Implement actions.
17553
17554 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17555
17556         * cs-parser.jay (dim_separators): Implement. Make it a string
17557         concatenating all the commas together, just as they appear.
17558         (opt_dim_separators): Modify accordingly
17559         (rank_specifiers): Update accordingly. Basically do the same
17560         thing - instead, collect the brackets here.
17561         (opt_rank_sepcifiers): Modify accordingly.
17562         (array_type): Modify to actually return the complete type string
17563         instead of ignoring the rank_specifiers.
17564         (expression_list): Implement to collect the expressions
17565         (variable_initializer): Implement. We make it a list of expressions
17566         essentially so that we can handle the array_initializer case neatly too.
17567         (variable_initializer_list): Implement.
17568         (array_initializer): Make it a list of variable_initializers
17569         (opt_array_initializer): Modify accordingly.
17570
17571         * expression.cs (New::NType): Add enumeration to help us
17572         keep track of whether we have an object/delegate creation
17573         or an array creation.
17574         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17575         members to hold data about array creation.
17576         (New:New): Modify to update NewType
17577         (New:New): New Overloaded contructor for the array creation
17578         case.
17579
17580         * cs-parser.jay (array_creation_expression): Implement to call
17581         the overloaded New constructor.
17582
17583 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17584
17585         * class.cs (TypeContainer::Constructors): Return member
17586         constructors instead of returning null.
17587
17588 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17589
17590         * typemanager.cs (InitCoreTypes): Initialize the various core
17591         types after we have populated the type manager with the user
17592         defined types (this distinction will be important later while
17593         compiling corlib.dll)
17594
17595         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17596         on Expression Classification.  Now all expressions have a method
17597         `Resolve' and a method `Emit'.
17598
17599         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17600         generation from working.     Also add some temporary debugging
17601         code. 
17602
17603 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17604
17605         * codegen.cs: Lots of code generation pieces.  This is only the
17606         beginning, will continue tomorrow with more touches of polish.  We
17607         handle the fundamentals of if, while, do, for, return.  Others are
17608         trickier and I need to start working on invocations soon.
17609
17610         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17611         s.InitStatement. 
17612
17613         * codegen.cs (EmitContext): New struct, used during code
17614         emission to keep a context.   Most of the code generation will be
17615         here. 
17616
17617         * cs-parser.jay: Add embedded blocks to the list of statements of
17618         this block.  So code generation proceeds in a top down fashion.
17619
17620 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17621
17622         * statement.cs: Add support for multiple child blocks.
17623
17624 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17625
17626         * codegen.cs (EmitCode): New function, will emit the code for a
17627         Block of code given a TypeContainer and its ILGenerator. 
17628
17629         * statement.cs (Block): Standard public readonly optimization.
17630         (Block::Block constructors): Link children. 
17631         (Block::Child): Child Linker.
17632         (Block::EmitVariables): Emits IL variable declarations.
17633
17634         * class.cs: Drop support for MethodGroups here, delay until
17635         Semantic Analysis.
17636         (Method::): Applied the same simplification that I did before, and
17637         move from Properties to public readonly fields.
17638         (Method::ParameterTypes): Returns the parameter types for the
17639         function, and implements a cache that will be useful later when I
17640         do error checking and the semantic analysis on the methods is
17641         performed.
17642         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17643         and made a method, optional argument tells whether this is a class
17644         or a structure to apply the `has-this' bit.
17645         (Method::GetCallingConvention): Implement, returns the calling
17646         convention. 
17647         (Method::Define): Defines the type, a second pass is performed
17648         later to populate the methods.
17649
17650         (Constructor::ParameterTypes): implement a cache similar to the
17651         one on Method::ParameterTypes, useful later when we do semantic
17652         analysis. 
17653
17654         (TypeContainer::EmitMethod):  New method.  Emits methods.
17655
17656         * expression.cs: Removed MethodGroup class from here.
17657
17658         * parameter.cs (Parameters::GetCallingConvention): new method.
17659
17660 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17661
17662         * class.cs (TypeContainer::Populate): Drop RootContext from the
17663         argument. 
17664
17665         (Constructor::CallingConvention): Returns the calling convention.
17666         (Constructor::ParameterTypes): Returns the constructor parameter
17667         types. 
17668
17669         (TypeContainer::AddConstructor): Keep track of default constructor
17670         and the default static constructor.
17671
17672         (Constructor::) Another class that starts using `public readonly'
17673         instead of properties. 
17674
17675         (Constructor::IsDefault): Whether this is a default constructor. 
17676
17677         (Field::) use readonly public fields instead of properties also.
17678
17679         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17680         track of static constructors;  If none is used, turn on
17681         BeforeFieldInit in the TypeAttributes. 
17682
17683         * cs-parser.jay (opt_argument_list): now the return can be null
17684         for the cases where there are no arguments. 
17685
17686         (constructor_declarator): If there is no implicit `base' or
17687         `this', then invoke the default parent constructor. 
17688
17689         * modifiers.cs (MethodAttr): New static function maps a set of
17690         modifiers flags into a MethodAttributes enum
17691         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17692         MethodAttr, TypeAttr to represent the various mappings where the
17693         modifiers are used.
17694         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17695
17696 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17697
17698         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17699         method arguments.
17700
17701         * interface.cs (PopulateIndexer): Implemented the code generator
17702         for interface indexers.
17703
17704 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17705
17706         * interface.cs (InterfaceMemberBase): Now we track the new status
17707         here.  
17708
17709         (PopulateProperty): Implement property population.  Woohoo!  Got
17710         Methods and Properties going today. 
17711
17712         Removed all the properties for interfaces, and replaced them with
17713         `public readonly' fields. 
17714
17715 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17716
17717         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17718         initialize their hashtables/arraylists only when they are needed
17719         instead of doing this always.
17720
17721         * parameter.cs: Handle refs and out parameters.
17722
17723         * cs-parser.jay: Use an ArrayList to construct the arguments
17724         instead of the ParameterCollection, and then cast that to a
17725         Parameter[] array.
17726
17727         * parameter.cs: Drop the use of ParameterCollection and use
17728         instead arrays of Parameters.
17729
17730         (GetParameterInfo): Use the Type, not the Name when resolving
17731         types. 
17732
17733 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17734
17735         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17736         and instead use public readonly fields.
17737
17738         * class.cs: Put back walking code for type containers.
17739
17740 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17741
17742         * class.cs (MakeConstant): Code to define constants.
17743
17744         * rootcontext.cs (LookupType): New function.  Used to locate types 
17745
17746
17747 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17748
17749         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17750         this System.Reflection code is.  Kudos to Microsoft
17751
17752         * typemanager.cs: Implement a type cache and avoid loading all
17753         types at boot time.  Wrap in LookupType the internals.  This made
17754         the compiler so much faster.  Wow.  I rule!
17755
17756         * driver.cs: Make sure we always load mscorlib first (for
17757         debugging purposes, nothing really important).
17758
17759         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17760         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17761
17762         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17763         on namespaces that have been imported using the `using' keyword.
17764
17765         * class.cs (TypeContainer::TypeAttr): Virtualize.
17766         (Class::TypeAttr): Return attributes suitable for this bad boy.
17767         (Struct::TypeAttr): ditto.
17768         Handle nested classes.
17769         (TypeContainer::) Remove all the type visiting code, it is now
17770         replaced with the rootcontext.cs code
17771
17772         * rootcontext.cs (GetClassBases): Added support for structs. 
17773
17774 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17775
17776         * interface.cs, statement.cs, class.cs, parameter.cs,
17777         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17778         Drop use of TypeRefs, and use strings instead.
17779
17780 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17781
17782         * rootcontext.cs: 
17783
17784         * class.cs (Struct::Struct): set the SEALED flags after
17785         checking the modifiers.
17786         (TypeContainer::TypeAttr): new property, returns the
17787         TypeAttributes for a class.  
17788
17789         * cs-parser.jay (type_list): Oops, list production was creating a
17790         new list of base types.
17791
17792         * rootcontext.cs (StdLib): New property.
17793         (GetInterfaceTypeByName): returns an interface by type name, and
17794         encapsulates error handling here.
17795         (GetInterfaces): simplified.
17796         (ResolveTree): Encapsulated all the tree resolution here.
17797         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17798         types. 
17799
17800         * driver.cs: Add support for --nostdlib, to avoid loading the
17801         default assemblies.
17802         (Main): Do not put tree resolution here. 
17803
17804         * rootcontext.cs: Beginning of the class resolution.
17805
17806 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17807
17808         * rootcontext.cs: Provide better error reporting. 
17809
17810         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17811
17812         * rootcontext.cs (CreateInterface): Handle the case where there
17813         are no parent interfaces.
17814
17815         (CloseTypes): Routine to flush types at the end.
17816         (CreateInterface): Track types.
17817         (GetInterfaces): Returns an array of Types from the list of
17818         defined interfaces.
17819
17820         * typemanager.c (AddUserType): Mechanism to track user types (puts
17821         the type on the global type hash, and allows us to close it at the
17822         end). 
17823
17824 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17825
17826         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17827         RecordInterface instead.
17828
17829         * cs-parser.jay: Updated to reflect changes above.
17830
17831         * decl.cs (Definition): Keep track of the TypeBuilder type that
17832         represents this type here.  Not sure we will use it in the long
17833         run, but wont hurt for now.
17834
17835         * driver.cs: Smaller changes to accomodate the new code.
17836
17837         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17838         when done. 
17839
17840         * rootcontext.cs (CreateInterface):  New method, used to create
17841         the System.TypeBuilder type for interfaces.
17842         (ResolveInterfaces): new entry point to resolve the interface
17843         hierarchy. 
17844         (CodeGen): Property, used to keep track of the code generator.
17845
17846 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17847
17848         * cs-parser.jay: Add a second production for delegate_declaration
17849         with `VOID'.
17850
17851         (enum_body): Put an opt_comma here instead of putting it on
17852         enum_body or enum_member_declarations so we can handle trailing
17853         commas on enumeration members.  Gets rid of a shift/reduce.
17854
17855         (type_list): Need a COMMA in the middle.
17856
17857         (indexer_declaration): Tell tokenizer to recognize get/set
17858
17859         * Remove old targets.
17860
17861         * Re-add the parser target.
17862
17863 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17864
17865         * cs-parser.jay: Add precendence rules for a number of operators
17866         ot reduce the number of shift/reduce conflicts in the grammar.
17867
17868 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17869
17870         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17871         and put it here.
17872
17873         Get rid of old crufty code.
17874
17875         * rootcontext.cs: Use this to keep track of the parsed
17876         representation and the defined types available to the program. 
17877
17878         * gen-treedump.cs: adjust for new convention.
17879
17880         * type.cs: Split out the type manager, and the assembly builder
17881         from here. 
17882
17883         * typemanager.cs: the type manager will live here now.
17884
17885         * cil-codegen.cs: And the code generator here. 
17886
17887 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17888
17889         * makefile: Fixed up for easy making.
17890
17891 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17892
17893         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17894         the 
17895
17896         (unary_expression): Expand pre_increment_expression and
17897         post_decrement_expression to reduce a shift/reduce.
17898
17899 2001-07-11  Simon Cozens
17900
17901         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17902
17903         Improve allow_keyword_as_indent name.
17904
17905 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17906
17907         * Adjustments for Beta2. 
17908
17909 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17910
17911         * decl.cs: Added `Define' abstract method.
17912         (InTransit): new property, used to catch recursive definitions. 
17913
17914         * interface.cs: Implement `Define'. 
17915
17916         * modifiers.cs: Map Modifiers.constants to
17917         System.Reflection.TypeAttribute flags.
17918
17919         * class.cs: Keep track of types and user-defined types.
17920         (BuilderInit): New method for creating an assembly
17921         (ResolveType): New function to launch the resolution process, only
17922         used by interfaces for now.
17923
17924         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17925         that are inserted into the name space. 
17926
17927 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17928
17929         * ARGH.  I have screwed up my tree so many times due to the use of
17930         rsync rather than using CVS.  Going to fix this at once. 
17931
17932         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17933         load types.
17934
17935 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17936
17937         * Experiment successful: Use System.Type rather that our own
17938         version of Type.  
17939
17940 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17941
17942         * cs-parser.jay: Removed nsAliases from here.
17943
17944         Use new namespaces, handle `using XXX;' 
17945
17946         * namespace.cs: Reimplemented namespace handling, use a recursive
17947         definition of the class.  Now we can keep track of using clauses
17948         and catch invalid using clauses.
17949
17950 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17951
17952         * gen-treedump.cs: Adapted for all the renaming.
17953
17954         * expression.cs (Expression): this class now has a Type property
17955         which returns an expression Type.
17956
17957         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17958         `Type', as this has a different meaning now in the base
17959
17960 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17961
17962         * interface.cs, class.cs: Removed from all the sources the
17963         references to signature computation, as we can not do method
17964         signature computation during the parsing time, as we are not
17965         trying to solve at that point distinguishing:
17966
17967         class X {
17968                 void a (Blah x) {}
17969                 void a (NS.Blah x) {}
17970         }
17971
17972         Which depending on the context might be valid or not, as we do not
17973         know if Blah is the same thing as NS.Blah at that point.
17974
17975         * Redid everything so the code uses TypeRefs now instead of
17976         Types.  TypeRefs are just temporary type placeholders, that need
17977         to be resolved.  They initially have a pointer to a string and the
17978         current scope in which they are used.  This is used later by the
17979         compiler to resolve the reference to an actual Type. 
17980
17981         * DeclSpace is no longer a CIR.Type, and neither are
17982         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17983         are all DeclSpaces, but no Types. 
17984
17985         * type.cs (TypeRefManager): This implements the TypeRef manager,
17986         which keeps track of all the types that need to be resolved after
17987         the parsing has finished. 
17988
17989 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17990
17991         * ARGH.  We are going to have to store `foreach' as a class rather
17992         than resolving it, as we need to verify error 1579 after name
17993         resolution.   *OR* we could keep a flag that says `This request to
17994         IEnumerator comes from a foreach statement' which we can then use
17995         to generate the error.
17996
17997 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17998
17999         * class.cs (TypeContainer.AddMethod): we now add methods to the
18000         MethodGroup instead of the method hashtable.  
18001
18002         * expression.cs: Add MethodGroup abstraction, which gets us one
18003         step closer to the specification in the way we handle method
18004         declarations.  
18005
18006         * cs-parser.jay (primary_expression): qualified_identifier now
18007         tried to match up an identifier to a local variable reference or
18008         to a parameter reference.
18009
18010         current_local_parameters is now a parser global variable that
18011         points to the current parameters for the block, used during name
18012         lookup.
18013
18014         (property_declaration): Now creates an implicit `value' argument to
18015         the set accessor.
18016
18017 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18018
18019         * parameter.cs: Do not use `param' arguments as part of the
18020         signature, per the spec.
18021
18022 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18023
18024         * decl.cs: Base class for classes, structs and interfaces.  This
18025         is the "Declaration Space" 
18026
18027         * cs-parser.jay: Use CheckDef for checking declaration errors
18028         instead of having one on each function.
18029
18030         * class.cs: Factor out some code for handling error handling in
18031         accordance to the "Declarations" section in the "Basic Concepts"
18032         chapter in the ECMA C# spec.
18033
18034         * interface.cs: Make all interface member classes derive from
18035         InterfaceMemberBase.
18036
18037 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18038
18039         * Many things: all interfaces are parsed and generated in
18040         gen-treedump.  Support for member variables, constructors,
18041         destructors, properties, constants is there.
18042
18043         Beginning of the IL backend, but very little done, just there for
18044         testing purposes. 
18045
18046 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18047
18048         * cs-parser.jay: Fix labeled statement.
18049
18050         * cs-tokenizer.cs (escape): Escape " and ' always.
18051         ref_line, ref_name: keep track of the line/filename as instructed
18052         by #line by the compiler.
18053         Parse #line.
18054
18055 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18056
18057         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18058         to match the values in System.CodeDOM.
18059
18060         Divid renamed to Divide.
18061
18062         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18063         statements. 
18064         (Statements.set): remove.
18065
18066         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18067         statements. 
18068
18069         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18070         falseStatements always have valid values. 
18071
18072         * cs-parser.jay: Use System.CodeDOM now.
18073