Cleanup the changelog entry a bit
[mono.git] / mcs / mcs / ChangeLog
1 2005-01-06  Duncan Mak  <duncan@ximian.com>
2  
3         * cs-tokenizer.cs (xtoken): After handling traditional C-style
4         comments, set `tokens_seen' to true. This allows us to detect
5         misplaced preprocessor directives (i.e. not at the beginning of
6         the a line, nor after whitespaces). In that case, report error
7         CS1040. This fixes bug #56460.
8
9         * cs-parser.jay (interface_member_declaration): Add checks for
10         IsExplicitImpl, and report CS0541 error if an interface member is
11         defined as an explicit interface declaration.
12
13 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
14
15         Fix #70817
16         * class.cs (PropertyMethod): Set Parent field in ctors.
17         (SetMethod.InternalParameters): Add unsafe switch hack.
18         
19         * decl.cs (MemberCore.Parent): Cannot be readonly.
20
21 2005-01-06  Raja R Harinath  <rharinath@novell.com>
22
23         * decl.cs (DeclSpace.ResolveType): Remove.
24         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
25         Merge in code from ...
26         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
27         * class.cs, enum.cs: Update to changes.
28
29 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
30
31         * anonymous.cs: Ensure that we init the scope of our parent if it
32         has not been initialized yet.
33
34 2004-12-30  Duncan Mak  <duncan@ximian.com>
35
36         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
37         if field.FieldBuilder is null. Fixes #70758.
38
39         * convert.cs: Fixed some typos and updated some of the comments.
40         (ImplicitStandardConversionExists):
41         (TryImplicitIntConversion): If `target_type' is an interface and
42         the type of `ic' implements this interface, return true or a new
43         BoxedCast instead of null. This fixes #70468.
44
45 2004-12-29  Duncan Mak  <duncan@ximian.com>
46
47         * expression.cs (Argument.Emit): Check that Expr is
48         IMemoryLocation before casting to it, and report CS1510 otherwise.
49
50         This fixes #70402.
51
52 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
53
54         * statement.cs (Block.ThisVariable): remove the recursion here, to
55         make the --profile more sane.
56
57 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
58
59         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
60         assembly, by JB Evain.
61
62 2004-12-17  Raja R Harinath  <rharinath@novell.com>
63
64         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
65           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
66         "parent" refers to enclosing type/class.  "base" refers to superclass.
67
68 2004-12-17  Raja R Harinath  <rharinath@novell.com>
69
70         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
71         Ensure that we only have GlobalAttributes.
72         * attribute.cs (Attribute.Emit): Make non-virtual.
73         (GlobalAttribute.Emit): Remove.
74         (Attribute.Resolve): Make virtual.
75         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
76         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
77         the argument. Don't create one.
78         (Attribute.GetObsoleteAttribute): Likewise.
79         (Attribute.GetClsCompliantAttributeValue): Likewise.
80         * class.cs, decl.cs: Update to changes.
81
82 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
83
84         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
85         
86         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
87         
88         * statement.cs (Foreach.Resolve): Add error 186 report.
89
90 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
91
92         * expression.cs (Conditional.DoResolve): Add warning 429.
93         
94         * statement.cs (If.Resolve): Add warning 665.
95
96 2004-12-16  Raja R Harinath  <rharinath@novell.com>
97
98         New invariant: RootContext.Tree.Types.NamespaceEntry == null
99         except when in the parser, and in GlobalAttribute.
100         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
101         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
102         RootContext.Tree.Types.NamespaceEntry once work is done.
103         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
104         and resets RootContext.Tree.Types.NamespaceEntry.
105
106 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
107
108         * cs-parser.jay: Don't create a block for every variable.
109
110 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
111
112         * location.cs: Provide extra information.
113
114         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
115         variables from the captured environment, it is the ldarg_0.
116
117 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
118
119         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
120         find a conclusion.
121         
122         * class.cs: Changed warning level for 169 to avoid developer
123         displeasure from warning flooding. It will be changed back when they
124         fix most of current BCL warnings.
125         
126         * RootContext.cs: Pushed default WarningLevel to 3.
127         
128         * statement.cs: Removed unused variable.
129
130 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
131
132         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
133         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
134         Add error 502 report.
135         (StaticClass.DefineType): Add error 441 report.
136         (Class.AllowedModifiersProp): New virtual property as temporary
137         extension to AllowedModifiers.
138         (Class.DefineType): Add error 418 report. Moved ModFlags check here
139         to share implementation with StaticClass and don't call virtual
140         methods from ctor.
141         
142         * driver.cs (MainDriver): Add error 1558 test.
143
144         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
145         report. Moved error 36 test here.
146
147         * statement.cs (Throw.Resolve): Add error 724 report.
148
149         * typemanager.cs: Add out_attribute_type core type.
150         
151 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
152
153         * class.cs (TypeContainer.VerifyClsCompliance): Add error
154         3018 report.
155         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
156
157         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
158         3017 report.
159         
160         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
161
162         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
163         Add error 3023 report.
164         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
165
166         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
167         implementation.
168
169 2004-12-12  John Luke  <john.luke@gmail.com>
170
171         * driver.cs (AddArgs): take -- into account when
172         adding arguments, fixes bug 65710 
173
174 2004-12-12  Martin Baulig  <martin@ximian.com>
175
176         * expression.cs (Unary.TryReduceNegative): Added support for
177         SByteConstant and ByteConstant.
178         (Unary.Reduce): Check error values from TryReduceNegative().
179
180 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
181
182         * attributes.cs (Attribute.Resolve): Avoid multiple error report
183         and report exception as error 182.
184
185 2004-12-10  Raja R Harinath  <rharinath@novell.com>
186
187         * driver.cs (Main): Fix message when there are warnings.
188
189 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
190
191         * delegate.cs: Fixed my fix from yesterday, sorry about that.
192
193 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
194
195         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
196         Reduced number of warnings.
197         
198         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
199
200 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
201
202         * driver.cs: Removed message.
203
204         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
205
206 2004-12-08    <vargaz@freemail.hu>
207
208         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
209
210 2004-12-08  Martin Baulig  <martin@ximian.com>
211
212         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
213         instead of a CS3002 for properties and indexer.
214
215 2004-12-08  Martin Baulig  <martin@ximian.com>
216
217         * decl.cs (MemberName.ToString): Make this work again.
218
219 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
220
221         * attribute.cs (Resolve): Add error 591 detection.
222
223         * class.cs (FieldMember.Define): Add error 1547 detection.
224         (Indexer.Define): Add error 620 detection.
225         (Operator.Define): Add error 590 detection.
226
227         * ecore.cs: Missing argument for error 79.
228
229         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
230         detection.
231
232 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
233
234         Fix #70106
235         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
236         only.
237
238 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
239
240         * cs-parser.jay : handle doc comments on implicit/explicit operators.
241           Some operator comments were suppressed.
242         * doc.cs : Implicit/explicit operator name in doc comments are like
243           "op_Explicit(type)~returnType", so added suffix handling.
244
245 2004-12-07  Martin Baulig  <martin@ximian.com>
246
247         * decl.cs
248         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
249         (MemberCore.GetClsCompliantAttributeValue): Likewise.
250         (DeclSpace.ec): New protected field; store the EmitContext here.
251         (DeclSpace.EmitContext): New public property; moved here from
252         `TypeContainer'.
253         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
254         EmitContext.
255
256         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
257         (Enum.Emit): Don't create a new EmitContext.
258
259         * delegate.cs (Delegate.DefineType): Always create the
260         EmitContext.
261
262         * iterators.cs (Iterators.DefineIterator): Create a new
263         EmitContext and store it in `ec'.
264
265 2004-08-24  Martin Baulig  <martin@ximian.com>
266
267         * typemanager.cs
268         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
269         this for accessibility checks.
270         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
271         IsNestedFamilyAccessible.
272         (TypeManager.IsSubclassOf): New method, do what the name actually
273         says.   
274
275 2004-12-06  Raja R Harinath  <rharinath@novell.com>
276
277         Fix crash on cs0657-17.cs.
278         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
279         Use RootContext.Tree.Types, not 'new RootTypes ()'.
280         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
281         the case where the NamespaceEntry gets overwritten.
282
283 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
284
285         Fixed #69195, #56821
286         * ecore.cs (ResolveBoolean): Tiny refactoring.
287
288         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
289         of right expression resolving when left is false constant and
290         operator is LogicalAnd OR true constant and operator is LogicalOr.
291
292         * statement.cs (ResolveUnreachable): Always reports warning.
293
294 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
295
296         * class.cs: Distinguish between 1721 and 1722 (just a little help
297         for the programmer).
298
299 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
300
301         * delegate.cs: Only allow this on new versions of the language. 
302
303 2004-12-02  Duncan Mak  <duncan@ximian.com>
304
305         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
306         Expression class.
307         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
308         here as a static method. Take an additional bool out parameter
309         `must_do_cs1540_check' for signaling to InstanceResolve.
310         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
311         member field from PropertyExpr class and made it an argument of
312         the method instead.
313         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
314         check for MarshalByRefObject, and report CS0122 instead of CS1540.
315         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
316         and `remove_accessor' as well as InstanceResolve: report CS0122
317         where applicable.
318
319         Fixes #70129.
320
321 2004-12-03  Raja R Harinath  <rharinath@novell.com>
322
323         Fix test-327.cs, test-328.cs, and put in early infrastructure
324         for eventually fixing #52697.
325         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
326         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
327         from other methods.
328         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
329         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
330         (VerifyUsing, error246): Update.
331         * rootcontext.cs (RootContext.NamespaceLookup): Just use
332         'NamespaceEntry.LookupNamespaceOrType'.
333
334 2004-12-03  Martin Baulig  <martin@ximian.com>
335
336         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
337         method as our child, call AnonymousMethod.Compatible() on it.
338
339 2004-12-03  Raja R Harinath  <rharinath@novell.com>
340
341         Disable XML documentation support in 'basic' profile.
342         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
343         Redirect XmlElement to System.Object.
344         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
345         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
346         * mcs.exe.sources: Add doc-bootstrap.cs.
347         * doc-bootstrap.cs: New file.  Contains empty stub implementation
348         of doc.cs.
349
350 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
351
352         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
353           comments are allowed.
354
355 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
356
357         * delegate.cs: Add checks for subtypes in paramaters and return values
358         in VerifyMethod () to add support for Covariance/Contravariance
359         in delegates.
360         
361 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
362
363         * report.cs: Remove extra closing parenthesis.
364
365         * convert.cs (Error_CannotImplicitConversion): If the name of the
366         types are the same, provide some extra information.
367
368         * class.cs (FieldBase): Use an unused bit field from the field to
369         encode the `has_offset' property from the FieldMember.  This saves
370         a couple of Ks on bootstrap compilation.
371
372         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
373         method as our child, return the AnonymousMethod resolved
374         expression.
375
376         * expression.cs (New.DoResolve): Allow return values from
377         NewDelegate to also include AnonymousMethods.
378
379         Fixes #70150.
380
381 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
382
383         Fix bug #70102
384         * attribute.cs (Resolve): Improved implementation of params
385         attribute arguments.
386
387         * support.cs (ParameterData): Add HasParams to be faster.
388
389 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
390
391         all things are for /doc support:
392
393         * doc.cs: new file that supports XML documentation generation.
394         * mcs.exe.sources: added doc.cs.
395         * driver.cs:
396           Handle /doc command line option.
397           Report error 2006 instead of 5 for missing file name for /doc.
398           Generate XML documentation when required, after type resolution.
399         * cs-tokenizer.cs:
400           Added support for picking up documentation (/// and /** ... */),
401           including a new XmlCommentState enumeration.
402         * cs-parser.jay:
403           Added lines to fill Documentation element for field, constant,
404           property, indexer, method, constructor, destructor, operator, event
405           and class, struct, interface, delegate, enum.
406           Added lines to warn incorrect comment.
407         * rootcontext.cs :
408           Added Documentation field (passed only when /doc was specified).
409         * decl.cs:
410           Added DocComment, DocCommentHeader, GenerateDocComment() and
411           OnGenerateDocComment() and some supporting private members for
412           /doc feature to MemberCore.
413         * class.cs:
414           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
415         * delegate.cs:
416           Added overriden DocCommentHeader.
417         * enum.cs:
418           Added overriden DocCommentHeader and GenerateDocComment().
419
420 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
421
422         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
423         unwrapping the enumeration values, chain to
424         DoConstantNumericPromotions again, so we can promote things to the
425         fundamental types (takes care of enums that are bytes, sbytes).
426
427         Fixes bug #62054.
428
429 2004-12-01  Raja R Harinath  <rharinath@novell.com>
430
431         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
432         Fix long-standing bug in type-lookup.  Use FindType instead of
433         LookupType when ec.ResolvingTypeTree.
434         (Attribute.ResolveType, Attribute.Resolve)
435         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
436         Update to changes.
437         (Attributes.Search): Remove internal version.  Update.
438         (Attributes.SearchMulti): Update.
439         (Attributes.GetClsCompliantAttribute): Remove.
440         (Attributes.GetIndexerNameAttribute): Remove.
441         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
442         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
443         * class.cs (Indexer.Define): Likewise.
444
445 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
446
447         Fix bug #68790
448         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
449         MarshallByReference members access.
450
451         * expression.cs: Use CheckMarshallByRefAccess;
452         Better error CS0197 message.
453
454         * report.cs: Print whole related error message.
455
456 2004-11-30  Raja R Harinath  <rharinath@novell.com>
457
458         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
459         the current directory to help debugging.
460
461 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
462
463         * class (GetClassBases): Better error 60 report.
464         (EventProperty): Disabled warning 67 detection.
465
466 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
467
468         Fix bug #60324
469         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
470
471         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
472         precise values.
473
474 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
475
476         Fix bug #49488
477         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
478
479         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
480
481 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
482
483         * attribute.cs (Attribute.Resolve): Refine error reporting and
484         report a cs0117 if the identifier does not exist, to distinguish
485         from 0617 which is a miss-use of the actual identifier.
486
487         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
488         between cs0070 and cs0079.
489
490         * class.cs (MemberBase.DoDefine): When reporting a wrong
491         accessibility level, we use MethodCore to compare instead of
492         Method (this was a regression in some refactoring effort).
493
494         So now we correctly report cs0056 again.
495
496         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
497         testing the target_type (which was known to be object_type) and
498         not the source type (which is anonymous_method).
499
500         Fixed reporting of error cs1660.
501
502         * expression.cs (UserCast.Source): Expose the underlying cast.
503
504         * statement.cs (Switch.SwitchGoverningType): Sort the list of
505         allowed types to find a match to int32 first (most common).
506
507         In addition, it ignores any ImplicitUserConversions that did an
508         internal implicit conversion (as the switch statement allows only
509         one integral conversion to exist).
510
511         * class.cs (PartialContainer.Create): rename `name' to
512         `member_name' for clarity.  Then replace the string calls with a
513         call to MemberName.GetPartialName, as now using
514         MemberName.ToString is an error (this is due to the side effects
515         it had, that were fixed in the past).
516
517         This will restore the error reporting on a number of partial class
518         errors that were missusing this (and getting an exception as a
519         results, which is now just a plain textual warning, because
520         yyparse debug output would crash otherwise).
521
522 2004-11-26  Raja R Harinath  <rharinath@novell.com>
523
524         * Makefile (PROGRAM_INSTALL_DIR): Remove.
525
526 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
527
528         * rootcontext.cs (LookupType): Make sure to cache lookups that
529         don't give us a negative result. This saves about 5% of corlib
530         compilation time.
531
532 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
533
534         * report.cs (AbstractMessage.Print): messages are sent to stderr
535
536         * class.cs (TypeContainer.GetClassBases): It is an error to have a
537         non-interface in the list of interfaces (at this point, either
538         parent was properly set, or a base class is being listed in the
539         interfaces section).
540
541         This flags error 1722, and resolves the crash from bug 69259.
542
543 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
544
545         * statement.cs (Using.EmitExpressionFinally): make this work right
546         for valuetypes. Fixes 69926.
547
548 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
549
550         * const.cs (Const.ChangeType): Cope with the "0 literal can be
551         converted to an enum" here, before we try to change the underlying
552         type.  This code exists, but it is a different code path than the
553         one used while encoding constants.
554
555         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
556         old bug: when converting from the null literal to a pointer,
557         return an EmptyCast, not the NullLiteral.
558
559         This fixes #69921, the recent null_type changes probably made this
560         bug more prominent.
561
562         (ImplicitReferenceConversionExists): In addition, resynchronized
563         the code here, so it matches the same code in
564         ImplicitReferenceConversionExists for the `from any class-type S
565         to any interface-type T'.
566         
567
568 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
569
570         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
571
572 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
573
574         * cs-parser.jay: Use verbosity accordingly. 
575
576 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
577
578         * expression.cs (Unary.ResolveOperator): Do not report warning;
579         AddressOf reads from variable.
580         
581         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
582
583 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
584
585         Fix bug #69462
586
587         * attribute.cs (Attributable): Removed CheckTargets.
588         (Attributes.Emit): Explicit attribute targets are tested here.
589
590         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
591         not enabled for interfaces.
592
593         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
594         (GetAssemblyName): Ouch next bug there.
595
596 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
597
598         * expression.cs: Error 275 added.
599         
600 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
601
602         Fix bug #69177 (Implemented decimal constant support)
603
604         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
605         (BinaryFold): Add DecimalConstant.
606
607         * const.cs (Define): Decimal constant 
608         (is not constant.
609         (ChangeType): Add decimal type handling.
610         (LookupConstantValue): Don't set value for decimal type but
611         emit DecimalConstantAttribute. Needed for constant optimization.
612
613         * constant.cs (ToDecimal): New method.
614         (ConvertToDecimal): New method.
615         (IntConstant): Implemented ConvertToDecimal.
616         (DecimalConstant.Emit): Emit optimized version for decimals in
617         int range.
618
619         * expression.cs (ResolveOperator): Changed order of constant
620         reduction to work correctly with native types which have
621         overloaded operators.
622         (ResolveMemberAccess): Extract constant value from attribute
623         for decimal type.
624
625         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
626
627         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
628         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
629         (ChangeType): Decimal is special.
630         (TypeToCoreType): Add decimal type.
631
632 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
633
634         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
635         decimal types.
636
637 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
638
639         * class.cs (EventField.ApplyAttributeBuilder): Fix error
640         test cs1667-5.cs.
641
642 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
643
644         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
645
646         * pending.cs (PendingImplementation): Grab only interfaces.
647
648 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
649
650         * statement.cs (ForeachHelperMethods): Add location member and
651         error 202 detection.
652
653 2004-11-19  Raja R Harinath  <rharinath@novell.com>
654
655         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
656         automatically handled by executable.make.
657         (PROGRAM): Make profile-specific.
658
659 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
660
661         * expression.cs (DoResolveBase): Fixed wrong warning for out
662         variables.
663
664 2004-11-18  Martin Baulig  <martin@ximian.com>
665
666         Merged latest changes into gmcs.  Please keep this comment in
667         here, it makes it easier for me to see what changed in MCS since
668         the last time I merged.
669
670 2004-11-17  Raja R Harinath  <rharinath@novell.com>
671
672         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
673         (TypeHandle.GetMemberCache): New.
674         (TypeHandle.TypeHandle): Update.
675         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
676         (TypeManager.LookupParentInterfacesCache):
677         Rename from LookupInterfaceCache.  Optimize slightly.
678         (TypeManager.MemberLookup_FindMembers): Update.
679         * decl.cs (MemberCache.MemberCache): Set Container to null in the
680         multi-type variant.
681         (AddCacheContents): Rename from AddHashtable.
682         * class.cs (TypeContainer.parent_container): Remove.
683         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
684         (TypeContainer.DoDefineMembers): Don't initialize it.
685         Update to name changes.
686         
687 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
688
689         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
690         that factors the code to check access modifiers on override.  
691
692         (PropertyBase): Use the code here.
693
694         Patch from Lluis S'anchez, fixes bug #69361.
695
696 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
697
698         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
699         routine that is used to report the use of a captured variable
700         whose address has been taken.
701
702         There are two checks: one when variables are being captured and
703         the other check is when the address of a variable is taken. 
704         
705         (because an anonymous methods might be resolved before *or* after
706         the address has been taken) and 
707
708         * expression.cs (Conditional.DoResolve): Remove the special
709         casing that Martin added to trueExpr and falseExpr being both
710         NullLiteral.  We get the right behavior now just by introducing
711         the null_type into the compiler. 
712
713         * convert.cs (ExplicitConversion): Change the code to use
714         null_type instead of testing `expr is NullLiteral'.
715         (ImplicitConversionStandard): use null_type too.
716         (ImplicitReferenceConversionExists): use null_type too.
717         (ImplicitReferenceConversion): use null_type too.
718
719         * literal.cs: The type of `NullLiteral' is now null_type instead
720         of object_type. 
721         (Resolve): Set the type here.
722
723         * typemanager.cs: Introduce null_type.
724
725 2004-11-17  Martin Baulig  <martin@ximian.com>
726
727         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
728         direction, like FindMembers() does.  Fixes #69546, testcase is in
729         test-315.cs.    
730
731 2004-11-16  Martin Baulig  <martin@ximian.com>
732
733         This is based on a patch from Marek Safar, see bug #69082.
734         Fixes bugs #63705 and #67130.
735
736         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
737         method; create a MemberCache for an interface type and cache the
738         result.
739
740         * decl.cs (IMemberContainer.ParentContainer): Removed.
741         (IMemberContainer.ParentCache): New property.
742         (MemberCache.SetupCacheForInterface): Removed.
743         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
744         to create a cache for an interface's "parent".
745
746         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
747         interfaces too.
748
749 2004-11-16  Martin Baulig  <martin@ximian.com>
750
751         Merged back from gmcs; these changes already went into gmcs a
752         couple of weeks ago.
753
754         * typemanager.cs
755         (TypeManager.AddUserType): Removed the `ifaces' argument.
756         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
757         `TypeExpr []'.
758         (TypeManager.AddUserInterface): Removed.
759         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
760         `TypeExpr []'.
761         (TypeManager.GetInterfaces): Likewise.
762         (TypeManager.GetExplicitInterfaces): Likewise.
763
764         * ecore.cs (TypeExpr.GetInterfaces): Removed.
765
766         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
767         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
768
769 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
770
771         * statement.cs: Avoid adding bools to a hashtable.
772
773 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
774
775         * expression.cs (Invocation.OverloadResolve): Flag error if we are
776         calling an unsafe method from a safe location.
777
778 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
779
780         Fix #69167
781         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
782
783 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
784
785         * namespace.cs (VerifyUsing): use GetPartialName instead of
786         ToString. 
787
788 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
789
790         * statement.cs (Return.Resolve): Fix regression in typo: if
791         `in_exc', we have to request a NeedReturnLabel, this was a typo
792         introduced in the anonymous method check-in.  Fixes #69131.
793
794         * Indexers were using the ShortName when defining themselves,
795         causing a regression in the compiler bootstrap when applying the
796         patch from 2004-11-02 (first part), now they use their full name
797         and the bug is gone.
798
799 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
800
801         * driver.cs: Strip the path from the names of embedded resources. Fixes
802         #68519.
803
804 2004-11-04  Raja R Harinath  <rharinath@novell.com>
805
806         Fix error message regression: cs0104-2.cs.
807         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
808         (AliasEntry.Resolve): Update.
809         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
810         'silent' flag.
811         (RootContext.LookupType): Update.
812
813 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
814
815         * cs-parser.jay: Add support for handling accessor modifiers
816         * class: Add support port accessor modifiers and error checking,
817         define PropertyMethod.Define as virtual (not abstract anymore)
818         * ecore.cs: Add checking for proeprties access with access modifiers
819         * iterators.cs: Modify Accessor constructor call based in the modified
820         constructor
821 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
822
823         * expression.cs (StringConcat): Handle being called twice,
824         as when we have a concat in a field init with more than two
825         ctors in the class
826
827 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
828
829         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
830         special case explicit implementations, we should always produce
831         the .property or .event declaration.
832         
833         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
834         since it will not return correct data if people use this
835         unresolved in the presence of using statements (see test-313).
836
837         * class.cs (MethodData.Define): If we are an explicit interface
838         implementation, set the method name to the full name of the
839         interface plus the name of the method.  
840
841         Notice that using the method.MethodName.GetFullName() does not
842         work, as it will only contain the name as declared on the source
843         file (it can be a shorthand in the presence of using statements)
844         and not the fully qualifed type name, for example:
845
846         using System;
847
848         class D : ICloneable {
849                 object ICloneable.Clone ()  {
850                 }
851         }
852
853         Would produce a method called `ICloneable.Clone' instead of
854         `System.ICloneable.Clone'.
855
856         * namespace.cs (Alias.Resolve): Use GetPartialName.
857         
858 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
859
860         * cs-parser.jay: Add error 1055 report.
861
862 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
863
864         * assign.cs (Assign.DoResolve): Only do the transform of
865         assignment into a New if the types are compatible, if not, fall
866         through and let the implicit code deal with the errors and with
867         the necessary conversions. 
868
869 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
870
871         * cs-parser.jay: Add error 1031 report.
872
873         * cs-tokenizer.cs: Add location for error 1038.
874
875 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
876
877         * cs-parser.jay: Add error 1016 report.
878
879 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
880
881         * cs-parser.jay: Add errors 1575,1611 report.
882
883 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
884
885         * cs-parser.jay: Add error 1001 report.
886
887 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
888
889         Fix #68850
890         * attribute.cs (GetMarshal): Add method argument for
891         caller identification.
892
893         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
894         agument for GetMarshal and RuntimeMissingSupport.
895
896 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
897
898         * attribute.cs (ExtractSecurityPermissionSet): Removed
899         TypeManager.code_access_permission_type.
900
901         * typemanager.cs: Removed TypeManager.code_access_permission_type.
902
903 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
904
905         * expression.cs (LocalVariableReference.DoResolveLValue): Check
906         for obsolete use of a variable here.   Fixes regression on errors
907         cs0619-25 and cs0619-26.
908
909 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
910
911         Fix #62358, implemented security attribute encoding.
912
913         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
914         Tests permitted SecurityAction for assembly or other types.
915         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
916         data from SecurityPermissionAttribute to PermisionSet class.
917
918         * class.cs (ApplyAttributeBuilder): Added special handling
919         for System.Security.Permissions.SecurityAttribute based types.
920
921         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
922         special handling for System.Security.Permissions.SecurityAttribute
923         based types.
924
925         * enum.cs (ApplyAttributeBuilder): Added special handling
926         for System.Security.Permissions.SecurityAttribute based types.
927
928         * parameter.cs (ApplyAttributeBuilder): Added special handling
929         for System.Security.Permissions.SecurityAttribute based types.
930
931         * rootcontext.cs: Next 2 core types.
932
933         * typemanager.cs (TypeManager.security_permission_attr_type):
934         Built in type for the SecurityPermission Attribute.
935         (code_access_permission_type): Build in type.
936
937 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
938
939         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
940         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
941         all of this information into
942         EmitContext.EmitCapturedVariableInstance.
943         
944         * codegen.cs (EmitCapturedVariableInstance): move here the
945         funcionality of emitting an ldarg.0 in the presence of a
946         remapping.   This centralizes the instance emit code.
947
948         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
949         then emit a load of this: it means that we have reached the
950         topmost ScopeInfo: the one that contains the pointer to the
951         instance of the class hosting the anonymous method.
952
953         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
954         captures to the topmost CaptureContext.
955
956 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
957
958         * expression.cs (LocalVariableReference): Move the knowledge about
959         the iterators into codegen's EmitCapturedVariableInstance.
960
961 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
962
963         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
964         all code paths return a value from an anonymous method (it is the
965         same as the 161 error, but for anonymous methods).
966
967 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
968
969         The introduction of anonymous methods in the compiler changed
970         various ways of doing things in the compiler.  The most
971         significant one is the hard split between the resolution phase
972         and the emission phases of the compiler.
973
974         For instance, routines that referenced local variables no
975         longer can safely create temporary variables during the
976         resolution phase: they must do so from the emission phase,
977         since the variable might have been "captured", hence access to
978         it can not be done with the local-variable operations from the runtime.
979         
980         * statement.cs 
981
982         (Block.Flags): New flag `IsTopLevel' to indicate that this block
983         is a toplevel block.
984
985         (ToplevelBlock): A new kind of Block, these are the blocks that
986         are created by the parser for all toplevel method bodies.  These
987         include methods, accessors and anonymous methods.
988
989         These contain some extra information not found in regular blocks:
990         A pointer to an optional CaptureContext (for tracking captured
991         local variables and parameters).  A pointer to the parent
992         ToplevelBlock.
993         
994         (Return.Resolve): Catch missmatches when returning a value from an
995         anonymous method (error 1662).
996         Invoke NeedReturnLabel from the Resolve phase instead of the emit
997         phase.
998
999         (Break.Resolve): ditto.
1000
1001         (SwitchLabel): instead of defining the labels during the
1002         resolution phase, we now turned the public ILLabel and ILLabelCode
1003         labels into methods called GetILLabelCode() and GetILLabel() that
1004         only define the label during the Emit phase.
1005
1006         (GotoCase): Track the SwitchLabel instead of the computed label
1007         (its contained therein).  Emit the code by using
1008         SwitchLabel.GetILLabelCode ().
1009
1010         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1011         whether the Local has been captured or not.
1012
1013         (LocalInfo.IsCaptured): New property, used to tell whether the
1014         local has been captured.
1015         
1016         * anonymous.cs: Vastly updated to contain the anonymous method
1017         support.
1018
1019         The main classes here are: CaptureContext which tracks any
1020         captured information for a toplevel block and ScopeInfo used to
1021         track the activation frames for various local variables.   
1022
1023         Each toplevel block has an optional capture context associated
1024         with it.  When a method contains an anonymous method both the
1025         toplevel method and the anonymous method will create a capture
1026         context.   When variables or parameters are captured, they are
1027         recorded on the CaptureContext that owns them, for example:
1028
1029         void Demo () {
1030              int a;
1031              MyDelegate d = delegate {
1032                  a = 1;
1033              }
1034         }
1035
1036         Here `a' will be recorded as captured on the toplevel
1037         CapturedContext, the inner captured context will not have anything
1038         (it will only have data if local variables or parameters from it
1039         are captured in a nested anonymous method.
1040
1041         The ScopeInfo is used to track the activation frames for local
1042         variables, for example:
1043
1044         for (int i = 0; i < 10; i++)
1045                 for (int j = 0; j < 10; j++){
1046                    MyDelegate d = delegate {
1047                         call (i, j);
1048                    }
1049                 }
1050
1051         At runtime this captures a single captured variable `i', but it
1052         captures 10 different versions of the variable `j'.  The variable
1053         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1054         recorded on a child.  
1055
1056         The toplevel ScopeInfo will also track information like the `this'
1057         pointer if instance variables were referenced (this is necessary
1058         as the anonymous method lives inside a nested class in the host
1059         type of the method). 
1060
1061         (AnonymousMethod): Expanded to track the Toplevel, implement
1062         `AnonymousMethod.Compatible' to tell whether an anonymous method
1063         can be converted to a target delegate type. 
1064
1065         The routine now also produces the anonymous method content
1066
1067         (AnonymousDelegate): A helper class that derives from
1068         DelegateCreation, this is used to generate the code necessary to
1069         produce the delegate for the anonymous method that was created. 
1070
1071         * assign.cs: API adjustments for new changes in
1072         Convert.ImplicitStandardConversionExists.
1073
1074         * class.cs: Adjustments to cope with the fact that now toplevel
1075         blocks are of type `ToplevelBlock'. 
1076
1077         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1078         insteda of standard blocks.
1079
1080         Flag errors if params arguments are passed to anonymous methods.
1081
1082         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1083         `CurrentAnonymousMethod' which points to the current Anonymous
1084         Method.  The variable points to the AnonymousMethod class that
1085         holds the code being compiled.  It is set in the new EmitContext
1086         created for the anonymous method.
1087
1088         (EmitContext.Phase): Introduce a variable and an enumeration to
1089         assist in enforcing some rules about when and where we are allowed
1090         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1091         only one that enfonces this right now).
1092
1093         (EmitContext.HaveCaptureInfo): new helper method that returns
1094         whether we have a CapturedContext initialized.
1095
1096         (EmitContext.CaptureVariable): New method used to register that a
1097         LocalInfo must be flagged for capturing. 
1098
1099         (EmitContext.CapturedParameter): New method used to register that a
1100         parameters must be flagged for capturing. 
1101         
1102         (EmitContext.CapturedField): New method used to register that a
1103         field must be flagged for capturing. 
1104
1105         (EmitContext.HaveCapturedVariables,
1106         EmitContext.HaveCapturedFields): Return whether there are captured
1107         variables or fields. 
1108
1109         (EmitContext.EmitMethodHostInstance): This is used to emit the
1110         instance for the anonymous method.  The instance might be null
1111         (static methods), this (for anonymous methods that capture nothing
1112         and happen to live side-by-side with the current method body) or a
1113         more complicated expression if the method has a CaptureContext.
1114
1115         (EmitContext.EmitTopBlock): Routine that drives the emission of
1116         code: it will first resolve the top block, then emit any metadata
1117         and then emit the code.  The split is done so that we can extract
1118         any anonymous methods and flag any captured variables/parameters.
1119         
1120         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1121         during this phase, the ILGenerator should not be used as labels
1122         and local variables declared here might not be accessible to any
1123         code that is part of an anonymous method.  
1124
1125         Exceptions to this include the temporary variables that are
1126         created by some statements internally for holding temporary
1127         variables. 
1128         
1129         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1130         metadata for a cb
1131
1132         (EmitContext.TemporaryReturn): This method is typically called
1133         from the Emit phase, and its the only place where we allow the
1134         ReturnLabel to be defined other than the EmitMeta.  The reason is
1135         that otherwise we would have to duplicate a lot of logic in the
1136         Resolve phases of various methods that today is on the Emit
1137         phase. 
1138
1139         (EmitContext.NeedReturnLabel): This no longer creates the label,
1140         as the ILGenerator is not valid during the resolve phase.
1141
1142         (EmitContext.EmitThis): Extended the knowledge in this class to
1143         work in anonymous methods in addition to iterators. 
1144
1145         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1146         code is necessary on the stack to access the instance to a local
1147         variable (the variable will be accessed as a field).
1148
1149         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1150         EmitContext.EmitAddressOfParameter): Routines to support
1151         parameters (not completed at this point). 
1152         
1153         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1154         will also remove the parameters.
1155
1156         * convert.cs (Convert): Define a `ConstantEC' which points to a
1157         null.  This is just to prefity some code that uses
1158         ImplicitStandardConversion code and do not have an EmitContext
1159         handy.
1160
1161         The idea is to flag explicitly that at that point in time, it is
1162         known that the conversion will not trigger the delegate checking
1163         code in implicit conversions (which requires a valid
1164         EmitContext). 
1165
1166         Everywhere: pass new EmitContext parameter since
1167         ImplicitStandardConversionExists now requires it to check for
1168         anonymous method conversions. 
1169
1170         (Convert.ImplicitStandardConversionExists): If the type of an
1171         expression is the anonymous_method_type, and the type is a
1172         delegate, we invoke the AnonymousMethod.Compatible method to check
1173         whether an implicit conversion is possible. 
1174
1175         (Convert.ImplicitConversionStandard): Only do implicit method
1176         group conversions if the language level is not ISO_1.
1177
1178         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1179         MethodInfo for the Invoke method.  used by Delegate and
1180         AnonymousDelegate.
1181
1182         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1183         method conversions if the target type is a delegate.
1184
1185         Removed extra debugging nops.
1186
1187         (LocalVariableReference): Turn the `local_info' into a public
1188         field. 
1189
1190         Add `prepared' field, the same hack used for FieldExprs to cope
1191         with composed assignments, as Local variables do not necessarily
1192         operate purely on the stack as they used to: they can be captured
1193         fields. 
1194
1195         Add `temp' for a temporary result, like fields.
1196
1197         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1198
1199         It now copes with Local variables that are captured and emits the
1200         proper instance variable to load it from a field in the captured
1201         case. 
1202
1203         (ParameterReference.DoResolveBase): During the resolve phase,
1204         capture parameters if we are in an anonymous method.
1205
1206         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1207         anonymous method, use the EmitContext helper routines to emit the
1208         parameter reference.
1209
1210         * iterators.cs: Set RemapToProxy to true/false during the
1211         EmitDispose class.
1212
1213         * parameters.cs (GetParameterByName): New helper method. 
1214
1215         * typemanager.cs (anonymous_method_type) a new type that
1216         represents an anonyous method.  This is always an internal type,
1217         used as a fencepost to test against the anonymous-methodness of an
1218         expression. 
1219         
1220 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1221
1222         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1223         561 report.
1224         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1225
1226 2004-10-18  Martin Baulig  <martin@ximian.com>
1227
1228         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1229         `Type' directly, but call ResolveType() on it.
1230         (Catch.Resolve): Likewise.
1231         (Foreach.Resolve): Likewise.
1232
1233 2004-10-18  Martin Baulig  <martin@ximian.com>
1234
1235         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1236         `Type' directly, but call ResolveType() on it.
1237         (Probe.DoResolve): Likewise.
1238         (ArrayCreation.LookupType): Likewise.
1239         (TypeOf.DoResolve): Likewise.
1240         (SizeOf.DoResolve): Likewise.
1241
1242 2004-10-18  Martin Baulig  <martin@ximian.com>
1243
1244         * expression.cs (Invocation.BetterFunction): Put back
1245         TypeManager.TypeToCoreType().
1246
1247 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1248
1249         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1250         the ResolveType.
1251
1252 2004-10-18  Martin Baulig  <martin@ximian.com>
1253
1254         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1255         `Type' directly, but call ResolveType() on it.
1256
1257 2004-10-18  Martin Baulig  <martin@ximian.com>
1258
1259         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1260         `Type' directly, but call ResolveType() on it.
1261         (MemberBase.DoDefine): Likewise.
1262
1263         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1264         `Type' directly, but call ResolveType() on it.
1265         (ComposedCast.DoResolveAsTypeStep): Likewise.
1266
1267         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1268         `Type' directly, but call ResolveType() on it.
1269
1270 2004-10-17  John Luke  <john.luke@gmail.com>
1271
1272         * class.cs (Operator.GetSignatureForError): use CSharpName
1273
1274         * parameter.cs (Parameter.GetSignatureForError): Returns
1275         correct name even if was not defined.
1276
1277 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1278
1279         Fix #65816.
1280         * class.cs (TypeContainer.EmitContext): New property.
1281         (DefineNestedTypes): Create an emitcontext for each part.
1282         (MethodCore.DoDefineParameters): Use container's emitcontext.
1283         Pass type array to InternalParameters.
1284         (MemberBase.DoDefine): Use container's emitcontext.
1285         (FieldMember.Define): Likewise.
1286         (Event.Define): Likewise.
1287         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1288         Pass type array to InternalParameters.
1289         (SetIndexerMethod.GetParameterInfo): Likewise.
1290         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1291         * delegate.cs (Define): Pass emitcontext to
1292         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1293         array to InternalParameters.
1294         * expression.cs (ParameterReference.DoResolveBase): Pass
1295         emitcontext to GetParameterInfo.
1296         (ComposedCast.DoResolveAsTypeStep): Remove check on
1297         ec.ResolvingTypeTree.
1298         * parameter.cs (Parameter.Resolve): Change argument to
1299         EmitContext.  Use ResolveAsTypeTerminal.
1300         (Parameter.GetSignature): Change argument to EmitContext.
1301         (Parameters.ComputeSignature): Likewise.
1302         (Parameters.ComputeParameterTypes): Likewise.
1303         (Parameters.GetParameterInfo): Likewise.
1304         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1305         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1306         * support.cs (InternalParameters..ctor): Remove variant that takes
1307         a DeclSpace.
1308         * typemanager.cs (system_intptr_expr): New.
1309         (InitExpressionTypes): Initialize it.
1310
1311 2004-10-12  Chris Toshok  <toshok@ximian.com>
1312
1313         * cs-parser.jay: fix location for try_statement and catch_clause.
1314
1315 2004-10-11  Martin Baulig  <martin@ximian.com>
1316
1317         * report.cs: Don't make --fatal abort on warnings, we have
1318         -warnaserror for that.
1319
1320 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1321
1322         More DeclSpace.ResolveType avoidance.
1323         * decl.cs (MemberCore.InUnsafe): New property.
1324         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1325         with newly created EmitContext.
1326         (FieldMember.Define): Likewise.
1327         * delegate.cs (Delegate.Define): Likewise.
1328         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1329         only if normal name-lookup fails.
1330         (TypeExpr.DoResolve): Enable error-checking.
1331         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1332         (SizeOf.DoResolve): Likewise.
1333         (ComposedCast.DoResolveAsTypeStep): Likewise.
1334         (StackAlloc.DoResolve): Likewise.
1335         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1336         (Block.Unsafe): New property.
1337         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1338         (Unsafe): Set 'unsafe' flag of contained block.
1339         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1340         (Fixed.Resolve): Likewise.
1341         (Catch.Resolve): Likewise.
1342         (Using.ResolveLocalVariableDecls): Likewise.
1343         (Foreach.Resolve): Likewise.
1344
1345 2004-10-05  John Luke <john.luke@gmail.com>
1346
1347         * cs-parser.jay: add location to error CS0175
1348
1349 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1350
1351         * ecore.cs (Expression.Constantity): Add support for turning null
1352         into a constant.
1353
1354         * const.cs (Const.Define): Allow constants to be reference types
1355         as long as the value is Null.
1356
1357 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1358
1359         * namespace.cs (NamespaceEntry.Using): No matter which warning
1360         level is set, check if this namespace name has already been added.
1361
1362 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1363
1364         * expression.cs: reftype [!=]= null should always use br[true,false].
1365         # 67410
1366
1367 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1368
1369         Fix #67108
1370         * attribute.cs: Enum conversion moved to 
1371         GetAttributeArgumentExpression to be applied to the all
1372         expressions.
1373
1374 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1375
1376         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1377         * class.c (TypeContainer.DefineType): Flag error if
1378         base types aren't accessible due to access permissions.
1379         * decl.cs (DeclSpace.ResolveType): Move logic to
1380         Expression.ResolveAsTypeTerminal.
1381         (DeclSpace.ResolveTypeExpr): Thin layer over
1382         Expression.ResolveAsTypeTerminal.
1383         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1384         Refactor code into NestedAccess.  Use it.
1385         (DeclSpace.NestedAccess): New.
1386         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1387         argument to silence errors.  Check access permissions.
1388         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1389         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1390         (Cast.DoResolve): Likewise.
1391         (New.DoResolve): Likewise.
1392         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1393         (TypeOf.DoResolve): Likewise.
1394
1395         * expression.cs (Invocation.BetterConversion): Return the Type of
1396         the better conversion.  Implement section 14.4.2.3 more faithfully.
1397         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1398         section 14.4.2.2 explicit.
1399         (Invocation.OverloadResolve): Update.
1400         (Invocation): Remove is_base field.
1401         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1402         (Invocation.Emit): Likewise.
1403
1404 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1405
1406         * README: Update to changes.
1407
1408 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1409
1410         * cs-parser.jay: Reverted 642 warning fix.
1411
1412 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1413
1414         Fix bug #66615
1415         * decl.cs (FindMemberWithSameName): Indexer can have more than
1416         1 argument.
1417
1418 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1419
1420         * expression.cs (LocalVariableReference.DoResolveLValue):
1421         Do not report warning 219 for out values.
1422         (EmptyExpression.Null): New member to avoid extra allocations.
1423
1424 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1425
1426         * cs-parser.jay: Fix wrong warning 642 report.
1427
1428         * cs-tokenizer.cs (CheckNextToken): New helper;
1429         Inspect next character if is same as expected.
1430
1431 2004-09-23  Martin Baulig  <martin@ximian.com>
1432
1433         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1434         (Convert.ImplicitReferenceConversionExists): Likewise.
1435
1436 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1437
1438         * class.cs (Operator.Define): Add error 448 and 559 report.
1439
1440 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1441
1442         * class.cs (MemberBase.IsTypePermitted): New protected
1443         method for checking error CS0610.
1444
1445 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1446
1447         * class.cs (TypeContainer.HasExplicitLayout): New property
1448         Returns whether container has StructLayout attribute set Explicit.
1449         (FieldMember): New abstract class for consts and fields.
1450         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1451         (Field): Reuse FieldMember.
1452
1453         * const.cs (Const): Reuse FieldMember.
1454
1455         * rootcontext.cs: EmitConstants call moved to class.
1456
1457 2004-09-22  Martin Baulig  <martin@ximian.com>
1458
1459         Thanks to Peter Sestoft for this bug report.
1460
1461         * expression.cs (Conditional): If both the `trueExpr' and the
1462         `falseExpr' is a NullLiteral, return a NullLiteral.
1463
1464 2004-09-22  Martin Baulig  <martin@ximian.com>
1465
1466         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1467         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1468         for the "get_Current" call.
1469
1470 2004-09-22  Martin Baulig  <martin@ximian.com>
1471
1472         Marek and me just fixed one of our oldest bugs: #28562 :-)
1473
1474         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1475
1476         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1477         we're an EnumConstant, just return that.
1478         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1479         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1480         to get the value which'll actually be written into the attribute.
1481         However, we have to use GetValue() to access the attribute's value
1482         in the compiler.        
1483
1484 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1485
1486         * constant.cs (Constant.IsNegative): New abstract property
1487         IsNegative.
1488
1489         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1490         (StackAlloc.DoResolve): Reused IsNegative.
1491
1492 2004-09-21  Martin Baulig  <martin@ximian.com>
1493
1494         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1495         if we're used in an iterator, we may be called from different
1496         methods.
1497
1498         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1499         we actually have an exception block.
1500
1501 2004-09-20  John Luke <jluke@cfl.rr.com>
1502
1503         * class.cs, cs-parser.jay: Improve the error report for 1520:
1504         report the actual line where the error happens, not where the
1505         class was declared.
1506
1507         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1508         Pass location information that was available elsewhere.
1509
1510 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1511
1512         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1513         runtime to delay sign assemblies.
1514
1515 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1516
1517         * cs-parser.jay: Do not report the stack trace, this is barely
1518         used nowadays.
1519
1520 2004-08-22  John Luke  <john.luke@gmail.com>
1521  
1522         * driver.cs : check that a resource id is not already used
1523         before adding it, report CS1508 if it is, bug #63637
1524
1525 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1526
1527         * ecore.cs: Removed dead code.
1528
1529 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1530
1531         * class.cs: Do not report warning CS0067 on the interfaces.
1532
1533 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1534
1535         * cs-parser.jay: Add error 504 report.
1536
1537 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1538
1539         * rootcontext.cs: WarningLevel is 4 by default now.
1540
1541         * statement.cs (Fixed.Resolve): Do not null
1542         VariableInfo.
1543
1544 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1545
1546         Fixed bug #55780
1547         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1548         deep search when property is not virtual.
1549         (PropertyExpr.ResolveAccessors): Make one call for both
1550         accessors.
1551
1552 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1553
1554         Fixed bug #65766
1555         * statement.cs: Error 152 report constains also location.
1556
1557 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1558
1559         Fixed bug #65766
1560         * const.cs: Explicitly set constant as static.
1561
1562 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1563
1564         Fixed bug #64226
1565         * cs-parser.jay: Add error 1017 report.
1566
1567 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1568
1569         Fixed bug #59980, #64224
1570         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1571
1572         * typemanager.cs (IsSpecialMethod): Simplified
1573
1574 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1575
1576         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1577         condition with better params.
1578
1579 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1580
1581         Fixed bug #65238
1582         * attribute.cs (Resolve): Property has to have both
1583         accessors.
1584
1585 2004-09-14  Martin Baulig  <martin@ximian.com>
1586
1587         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1588
1589 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1590
1591         Fixed bug #61902
1592         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1593         called and is obsolete then this member suppress message
1594         when call is inside next [Obsolete] method or type.
1595
1596         * expression.cs: Use TestObsoleteMethodUsage member.
1597
1598 2004-09-14  Martin Baulig  <martin@ximian.com>
1599
1600         * cs-parser.jay: Sync a bit with the GMCS version.
1601
1602 2004-09-14  Martin Baulig  <martin@ximian.com>
1603
1604         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1605         (CSharpParser.yacc_verbose_flag): New public field.
1606
1607         * genericparser.cs: Removed.
1608
1609 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1610
1611         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1612
1613 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1614
1615         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1616
1617 2004-09-10  Martin Baulig  <martin@ximian.com>
1618
1619         Backported my MemberName changes from GMCS into MCS.
1620
1621         - we are now using a special `MemberName' class instead of using
1622         strings; in GMCS, the `MemberName' also contains the type
1623         arguments.
1624
1625         - changed the grammar rules a bit:
1626           * the old `member_name' is now a `namespace_or_type_name':
1627             The rule is that we use `namespace_or_type_name' everywhere
1628             where we expect either a "member name" (GetEnumerator) or a
1629             "member name" with an explicit interface name
1630             (IEnumerable.GetEnumerator).
1631             In GMCS, the explicit interface name may include type arguments
1632             (IEnumerable<T>.GetEnumerator).
1633           * we use `member_name' instead of just `IDENTIFIER' for
1634             "member names":
1635             The rule is that we use `member_name' wherever a member may
1636             have type parameters in GMCS.       
1637
1638         * decl.cs (MemberName): New public class.
1639         (MemberCore.MemberName): New public readonly field.
1640         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1641         (DeclSpace): Likewise.
1642
1643         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1644         * enum.cs (Enum.ctor): Likewise.
1645
1646         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1647         MemberName.     
1648         (AliasEntry.ctor): Take a MemberName, not an Expression.
1649         (AliasEntry.UsingAlias): Likewise.
1650
1651         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1652         (IMethodData.MemberName): Changed type from string to MemberName.
1653         (MemberBase.ExplicitInterfaceName): Likewise.
1654         (AbstractPropertyEventMethod.SetupName): Make this private.
1655         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1656         argument; compute the member name here.
1657         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1658         on the `member.MemberName' and the `prefix'.
1659
1660         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1661         not `type_name'.
1662         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1663         thus, we get a `MemberName' instead of a `string'.  These
1664         declarations may have type parameters in GMCS.
1665         (interface_method_declaration, delegate_declaration): Likewise.
1666         (class_declaration, interface_declaration): Likewise.
1667         (method_header): Use `namespace_or_type_name' instead of
1668         `member_name'.  We may be an explicit interface implementation.
1669         (property_declaration, event_declaration): Likewise.
1670         (member_name): This is now just an `IDENTIFIER', not a
1671         `namespace_or_type_name'.
1672         (type_name, interface_type): Removed.
1673         (namespace_or_type_name): Return a MemberName, not an Expression.
1674         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1675         call GetTypeExpression() on the MemberName to get an expression.
1676         (IndexerDeclaration.interface_type): Changed type from string to
1677         MemberName.
1678         (MakeName): Operate on MemberName's instead of string's.
1679
1680 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1681
1682         Fix bug #55770.
1683         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1684         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1685         lookup to avoid symbols introduced by 'using'.
1686         * rootcontext.cs (NamespaceLookup): Update.
1687
1688 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1689
1690         * class.cs (TypeContainer.DoDefineMembers): Do not call
1691         DefineDefaultConstructor for static classes.
1692
1693 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1694
1695         * attribute.cs (Attribute.Resolve): Add error 653 report.
1696
1697         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1698         report.
1699         (Method.ApplyAttributeBuilder): Add error 685 report.
1700         (Operator.Define): Add error 564 report.
1701
1702         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1703
1704         * expression.cs (Invocation.DoResolve): Add error
1705         245 and 250 report.
1706
1707         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1708         error 674 report.
1709
1710 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1711
1712         * class.cs (ConstructorInitializer.Resolve):
1713         Wrong error number (515->516).
1714
1715 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1716
1717         * class.cs (Indexer.Define): Add error 631 report.
1718
1719 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1720
1721         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1722
1723 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1724
1725         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1726
1727 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1728
1729         * cs-parser.jay: Added error CS0241 report.
1730
1731 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1732
1733         * cs-parser.jay (fixed_statement): Introduce a scope for the
1734         declaration in the 'fixed' statement.
1735
1736 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1737
1738         * cs-parser.jay: Added CS0230 error report.
1739
1740 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1741
1742         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1743
1744 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1745
1746         * expression.cs (Argument.Resolve): Added error CS0192 and
1747         CS0199 report.
1748
1749 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1750
1751         C# 2.0 #pragma warning feature
1752
1753         * cs-tokenizer.cs (PreProcessPragma): New method; 
1754         Handles #pragma directive.
1755
1756         * report.cs (WarningRegions): New class; Support
1757         class for #pragma warning directive. It tests whether
1758         warning is enabled for a given line.
1759
1760 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1761
1762         * const.cs: Add more descriptive error report, tahnks to
1763         Sebastien. 
1764
1765 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1766
1767         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1768
1769 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1770
1771         * expression.cs: Apply patch from Ben: Remove dead code from
1772         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1773         as that code just threw an exception anwyays.
1774
1775         * const.cs: Remove the call to the turnintoconstant, for details
1776         see bug: #63144
1777         
1778         * literal.cs: The type of the null-literal is the null type;  So
1779         we use a placeholder type (literal.cs:System.Null, defined here)
1780         for it.
1781
1782         * expression.cs (Conditional.DoResolve): Remove some old code that
1783         is no longer needed, conversions have been fixed.
1784
1785         (ArrayCreationExpression.DoResolve): Return false if we fail to
1786         resolve the inner expression.
1787
1788 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1789
1790         Fix test-290.cs.
1791         * cs-parser.jay (delegate_declaration): Record a delegate
1792         declaration as a type declaration.
1793         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1794
1795 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1796
1797         * parameter.cs: Do not crash if the type can not be resolved. 
1798
1799         * expression.cs: Report errors with unsafe pointers, fixes #64896
1800
1801 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1802
1803         * expression.cs: Pointer arith always needs to do a conv.i
1804         if the operand is a long. fix 65320
1805
1806 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1807
1808         Fixed cs0619-37.cs, cs0619-38.cs
1809
1810         * enum.cs (GetObsoleteAttribute): Removed.
1811
1812         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1813         on Enum member is double staged. The first is tested member
1814         and then enum.
1815
1816 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1817
1818         Fixed #56986, #63631, #65231
1819
1820         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1821         adds member to name container.
1822         (TypeContainer.AddToTypeContainer): New method, adds type to
1823         name container.
1824         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1825         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1826         AddOperator): Simplified by reusing AddToMemberContainer.
1827         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1828         instead of field.
1829         (Method.CheckForDuplications): Fixed implementation to test all
1830         possibilities.
1831         (MemberBase): Detection whether member is explicit interface
1832         implementation is now in constructor.
1833         (MemberBase.UpdateMemberName): Handles IndexerName.
1834         (Accessor): Changed to keep also location information.
1835         (AbstractPropertyEventMethod): Is derived from MemberCore.
1836         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1837         will be emited or not.
1838         (PropertyBase.AreAccessorsDuplicateImplementation):
1839         Tests whether accessors are not in collision with some method.
1840         (Operator): Is derived from MethodCore to simplify common
1841         operations.
1842
1843         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1844         must be performed.
1845         (DeclSpace.AddToContainer): Adds the member to defined_names
1846         table. It tests for duplications and enclosing name conflicts.
1847
1848         * enum.cs (EnumMember): Clean up to reuse the base structures
1849
1850 2004-09-03  Martin Baulig  <martin@ximian.com>
1851
1852         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1853         into TypeContainer, to make partial classes work again.
1854
1855 2004-09-03  Martin Baulig  <martin@ximian.com>
1856
1857         * rootcontext.cs (RootContext.V2): Removed.
1858
1859 2004-03-23  Martin Baulig  <martin@ximian.com>
1860
1861         * expression.cs (Invocation.OverloadResolve): Added `bool
1862         may_fail' argument and use it instead of the Location.IsNull() hack.
1863
1864 2004-09-03  Martin Baulig  <martin@ximian.com>
1865
1866         Merged latest changes into gmcs.  Please keep this comment in
1867         here, it makes it easier for me to see what changed in MCS since
1868         the last time I merged.
1869
1870 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1871
1872         Fix #61128.
1873         * expression.cs (BetterConversion): Don't allow either conversion 
1874         to be null.  Remove redundant implicit conversion test when 'q ==
1875         null' -- when this function is invoked, we already know that the
1876         implicit conversion exists.
1877         (BetterFunction): Assume that 'best' is non-null.  Remove
1878         redundant reimplementation of IsApplicable when 'best' is null.
1879         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1880         number of arguments.
1881         (IsAncestralType): Extract from OverloadResolve.
1882         (OverloadResolve): Make robust to the MethodGroupExpr being
1883         unsorted.  Implement all the logic of Section 14.5.5.1, and
1884         support overloading of methods from multiple applicable types.
1885         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1886
1887         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1888         (RealError, Warning): Append type of report to related symbol.
1889
1890 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1891
1892         * enum.cs: Fixed CLS-Compliance checks for enum members.
1893         Error tests cs3008-8.cs, cs3014-8.cs
1894
1895 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1896
1897         Fixed bug #62342, #63102
1898         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1899         like ImplementMethod.
1900
1901 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1902
1903         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1904         Fixed bug #65170.
1905
1906 2004-09-02  Martin Baulig  <martin@ximian.com>
1907
1908         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1909         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1910         on the MethodBase.
1911
1912 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1913
1914         C# 2.0 Static classes implemented
1915
1916         * class.cs (TypeContainer): instance_constructors,
1917         initialized_fields, initialized_static_fields,
1918         default_constructor, base_inteface_types are protected to be
1919         accessible from StaticClass.
1920         (TypeContainer.DefineDefaultConstructor): New virtual method
1921         for custom default constructor generating
1922         (StaticClass): New class to handle "Static classes" feature.
1923
1924         * cs-parser.jay: Handle static keyword on class like instance
1925         of StaticClass.
1926
1927         * driver.cs: Added "/langversion" command line switch with two
1928         options (iso-1, default).
1929
1930 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1931
1932         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1933
1934 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1935
1936         * delegate.cs: Style.
1937
1938 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1939
1940         * delegate.cs: Add seperate instance expr field for miguel.
1941
1942 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1943
1944         * PointerArithmetic (Resolve): make sure we are not doing
1945         pointer arith on void*. Also, make sure we are resolved
1946         by not setting eclass until resolve.
1947
1948         All callers: Make sure that PointerArithmetic gets resolved.
1949
1950 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1951
1952         * ArrayCreation (LookupType): If the type does not resolve 
1953         to an array, give an error.
1954
1955 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1956
1957         * statement.cs (Try.Resolve): Fixed bug #64222
1958
1959 2004-08-27  Martin Baulig  <martin@ximian.com>
1960
1961         * class.cs
1962         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1963         crash here.     
1964
1965 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1966
1967         * ecore.cs (Constantify): Get underlying type via
1968         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1969         Windows in special cases.
1970
1971 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1972
1973         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1974         for obtaining also private methods.
1975         (GetRemoveMethod): Used GetRemoveMethod (true)
1976         for obtaining also private methods.
1977
1978 2004-08-24  Martin Baulig  <martin@ximian.com>
1979
1980         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1981         MethodAttributes.HideBySig for operators.
1982
1983 2004-08-23  Martin Baulig  <martin@ximian.com>
1984
1985         Back to the old error reporting system :-)
1986
1987         * report.cs (Message): Removed.
1988         (Report.MessageData, ErrorData, WarningData): Removed.
1989         (Report.Error, Warning): Back to the old system.
1990
1991 2004-08-23  Martin Baulig  <martin@ximian.com>
1992
1993         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1994
1995         * class.cs (TypeContainer.ParentContainer): New public virtual
1996         method; replaces the explicit interface implementation.
1997         (ClassPart.ParentContainer): Override.
1998
1999 2004-08-23  Martin Baulig  <martin@ximian.com>
2000
2001         * statement.cs (Switch): Added support for constant switches; see
2002         #59428 or test-285.cs.
2003
2004 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2005
2006         Fixed bug #62740.
2007         * statement.cs (GetEnumeratorFilter): Removed useless
2008         logic because C# specs is strict. GetEnumerator must be
2009         public.
2010
2011 2004-08-22  Martin Baulig  <martin@ximian.com>
2012
2013         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2014         a switch and may break, reset the barrier.  Fixes #59867.
2015
2016 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2017
2018         CLS-Compliance speed up (~5% for corlib)
2019
2020         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2021         New method. Tests container for CLS-Compliant names
2022
2023         * class.cs (TypeContainer.VerifyClsName): New method.
2024         Checks whether container name is CLS Compliant.
2025         (Constructor): Implements IMethodData.
2026
2027         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2028         low-case table for CLS Compliance test.
2029         (MemberCache.VerifyClsParameterConflict): New method.
2030         Checks method parameters for CS3006 error.
2031
2032         * enum.cs (EnumMember): Is derived from MemberCore.
2033         (Enum.VerifyClsName): Optimized for better performance.
2034
2035 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2036
2037         * report.cs: Renamed Error_T to Error and changed all
2038         references.
2039
2040 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2041
2042         * class.cs (TypeContainer.IndexerArrayList): New inner class
2043         container for indexers.
2044         (TypeContainer.DefaultIndexerName): New constant for default
2045         indexer name. Replaced all "Item" with this constant.
2046         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2047
2048         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2049         DefaultMemberAttribute constructor.
2050
2051 2004-08-05  Martin Baulig  <martin@ximian.com>
2052
2053         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2054         Fix bug #59429.
2055
2056 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2057
2058         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2059         multi platforms problem.
2060
2061         * compiler.csproj: Included shared files.
2062
2063 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2064
2065         Fix bug 60333, 55971 in the more general way
2066         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2067         Added arg_type argument for constant conversion.
2068         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2069
2070 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2071
2072         Fix bug #59760
2073         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2074         OperatorArrayList, MethodCoreArrayList for typecontainer
2075         containers. Changed class member types to these new types.
2076         (MethodArrayList.DefineMembers): Added test for CS0659.
2077
2078 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2079
2080         * cfold.cs: Synchronize the folding with the code in expression.cs
2081         Binary.DoNumericPromotions for uint operands.
2082
2083         * attribute.cs: Revert patch from Raja, it introduced a regression
2084         while building Blam-1.2.1 (hard to isolate a test case).
2085
2086 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2087
2088         Fix for #55382
2089         * class.cs:
2090         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2091         name collision.
2092         (MethodCore.parent_method): New member. The method we're overriding
2093         if this is an override method.
2094         (MethodCore.CheckBase): Moved from Method class and made common.
2095         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2096         private.
2097         (MethodCore.CheckForDuplications): New abstract method. For custom
2098         member duplication search in a container
2099         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2100         method and its return type.
2101         (Event.conflict_symbol): New member. Symbol with same name in the
2102         parent class.
2103
2104         * decl.cs:
2105         (MemberCache.FindMemberWithSameName): New method. The method
2106         is looking for conflict with inherited symbols.
2107
2108 2004-08-04  Martin Baulig  <martin@ximian.com>
2109
2110         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2111
2112         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2113
2114 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2115
2116         * report.cs (Message): New enum for better error, warning reference in
2117         the code.
2118         (MessageData): New inner abstract class. It generally handles printing of
2119         error and warning messages.
2120         Removed unused Error, Warning, Message methods.
2121
2122 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2123
2124         Fix for cs0592-8.cs test
2125         * attribute.cs
2126         (Attributable.ValidAttributeTargets): Made public.
2127         (Attribute.ExplicitTarget): New member for explicit target value.
2128         (Attribute.CheckTargets): Now we translate explicit attribute
2129         target to Target here.
2130
2131 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2132
2133         * ecore.cs (MethodGroupExpr): new IsBase property.
2134
2135         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2136
2137         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2138         rather than an instance expr.
2139
2140         (DelegateCreation.Emit): Use the method group rather than
2141         the instance expression. Also, if you have base.Foo as the
2142         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2143
2144         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2145
2146         (NewDelegate.DoResolve): Only check for the existance of Invoke
2147         if the method is going to be needed. Use MethodGroupExpr.
2148
2149         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2150
2151         * expression.cs: For pointer arith., make sure to use
2152         the size of the type, not the size of the pointer to
2153         the type.
2154
2155 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2156
2157         Fix for #60722
2158         * class.cs (Class): Added error CS0502 test.
2159
2160 2004-08-03  John Luke  <jluke@cfl.rr.com>
2161             Raja R Harinath  <rharinath@novell.com>
2162
2163         Fix for #60997.
2164         * attribute.cs (Attribute.complained_before): New flag.
2165         (Attribute.ResolveType, Attribute.Resolve),
2166         (Attribute.DefinePInvokeMethod): Set it.
2167         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2168         
2169 2004-08-03  Martin Baulig  <martin@ximian.com>
2170
2171         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2172         use a user-defined operator; we still need to do numeric
2173         promotions in case one argument is a builtin type and the other
2174         one has an implicit conversion to that type.  Fixes #62322.
2175
2176 2004-08-02  Martin Baulig  <martin@ximian.com>
2177
2178         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2179         (LocalInfo.IsThis): New public property.
2180         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2181
2182 2004-08-01  Martin Baulig  <martin@ximian.com>
2183
2184         * class.cs (TypeContainer.GetClassBases): Don't set the default
2185         here since we may get called from GetPartialBases().
2186         (TypeContainer.DefineType): If GetClassBases() didn't return a
2187         parent, use the default one.
2188
2189 2004-07-30  Duncan Mak  <duncan@ximian.com>
2190
2191         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2192
2193 2004-07-30  Martin Baulig  <martin@ximian.com>
2194
2195         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2196
2197         * class.cs (SourceMethod): New public class, derive from the
2198         symbol writer's ISourceMethod.
2199         (Method): Use the new symbol writer API.
2200
2201         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2202         as argument and use the new symbol writer.
2203
2204         * location.cs
2205         (SourceFile): Implement the symbol writer's ISourceFile.
2206         (Location.SymbolDocument): Removed.
2207         (Location.SourceFile): New public property.
2208
2209         * symbolwriter.cs: Use the new symbol writer API.
2210
2211 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2212
2213         * Makefile (install-local): Remove.  Functionality moved to
2214         executable.make.
2215
2216 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2217
2218         * Makefile: Install mcs.exe.config file together with mcs.exe.
2219         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2220         correct runtime version.
2221         
2222 2004-07-25  Martin Baulig  <martin@ximian.com>
2223
2224         * class.cs
2225         (TypeContainer.RegisterOrder): Removed, this was unused.
2226         (TypeContainer, interface_order): Removed.
2227         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2228         TypeContainer as argument since we can also be called with a
2229         `PartialContainer' for a partial class/struct/interface.
2230         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2231         of checking whether we're an `Interface' - we could be a
2232         `PartialContainer'.
2233         (PartialContainer.Register): Override; call
2234         AddClass()/AddStruct()/AddInterface() on our parent.
2235
2236         * cs-parser.jay (interface_member_declaration): Add things to the
2237         `current_container', not the `current_class'.
2238
2239         * rootcontext.cs (RegisterOrder): The overloaded version which
2240         takes an `Interface' was unused, removed.
2241
2242         * typemanager.cs (TypeManager.LookupInterface): Return a
2243         `TypeContainer', not an `Interface'.
2244         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2245         contain a `PartialContainer' for an interface, so check it's
2246         `Kind' to figure out what it is.
2247
2248 2004-07-25  Martin Baulig  <martin@ximian.com>
2249
2250         * class.cs (Class.DefaultTypeAttributes): New public constant.
2251         (Struct.DefaultTypeAttributes): Likewise.
2252         (Interface.DefaultTypeAttributes): Likewise.
2253         (PartialContainer.TypeAttr): Override this and add the
2254         DefaultTypeAttributes.
2255
2256 2004-07-25  Martin Baulig  <martin@ximian.com>
2257
2258         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2259         we can just use the `Parent' field instead.
2260
2261 2004-07-25  Martin Baulig  <martin@ximian.com>
2262
2263         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2264
2265 2004-07-25  Martin Baulig  <martin@ximian.com>
2266
2267         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2268         our parts before defining any methods.
2269         (TypeContainer.VerifyImplements): Make this virtual.
2270         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2271         on our PartialContainer.
2272
2273 2004-07-25  Martin Baulig  <martin@ximian.com>
2274
2275         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2276
2277         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2278         argument, we can just use the `Parent' field instead.
2279
2280         * class.cs
2281         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2282         (MemberBase.DoDefine): Likewise.
2283
2284 2004-07-24  Martin Baulig  <martin@ximian.com>
2285
2286         * decl.cs (MemberCore.Parent): New public field.
2287         (DeclSpace.Parent): Moved to MemberCore.
2288
2289         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2290         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2291         parent's .ctor.
2292         (FieldBase, Field, Operator): Likewise.
2293         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2294         (EventField, Event): Likewise.
2295
2296 2004-07-23  Martin Baulig  <martin@ximian.com>
2297
2298         * class.cs (PartialContainer): New public class.
2299         (ClassPart): New public class.
2300         (TypeContainer): Added support for partial classes.
2301         (TypeContainer.GetClassBases): Splitted some of the functionality
2302         out into GetNormalBases() and GetPartialBases().
2303
2304         * cs-tokenizer.cs (Token.PARTIAL): New token.
2305         (Tokenizer.consume_identifier): Added some hacks to recognize
2306         `partial', but only if it's immediately followed by `class',
2307         `struct' or `interface'.
2308
2309         * cs-parser.jay: Added support for partial clases.
2310
2311 2004-07-23  Martin Baulig  <martin@ximian.com>
2312
2313         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2314         a `DeclSpace' and also made it readonly.
2315         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2316         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2317         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2318
2319         * cs-parser.jay: Pass the `current_class', not the
2320         `current_container' (at the moment, this is still the same thing)
2321         to a new Method, Property, Event, Indexer or Constructor.
2322
2323 2004-07-23  Martin Baulig  <martin@ximian.com>
2324
2325         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2326         and removed the `current_interface' one.
2327         (struct_declaration, class_declaration, interface_declaration):
2328         Set `current_class' to the newly created class/struct/interface;
2329         set their `Bases' and call Register() before parsing their body.
2330
2331 2004-07-23  Martin Baulig  <martin@ximian.com>
2332
2333         * class.cs (Kind): New public enum.
2334         (TypeContainer): Made this class abstract.
2335         (TypeContainer.Kind): New public readonly field.
2336         (TypeContainer.CheckDef): New public method; moved here from
2337         cs-parser.jay.
2338         (TypeContainer.Register): New public abstract method.
2339         (TypeContainer.GetPendingImplementations): New public abstract
2340         method.
2341         (TypeContainer.GetClassBases): Removed the `is_class' and
2342         `is_iface' parameters.
2343         (TypeContainer.DefineNestedTypes): Formerly known as
2344         DoDefineType().
2345         (ClassOrStruct): Made this class abstract.
2346
2347         * tree.cs (RootTypes): New public type. 
2348
2349 2004-07-20  Martin Baulig  <martin@ximian.com>
2350
2351         * tree.cs (Tree.RecordNamespace): Removed.
2352         (Tree.Namespaces): Removed.
2353
2354         * rootcontext.cs (RootContext.IsNamespace): Removed.
2355
2356         * cs-parser.jay (namespace_declaration): Just create a new
2357         NamespaceEntry here.
2358
2359 2004-07-20  Martin Baulig  <martin@ximian.com>
2360
2361         * statement.cs (ExceptionStatement): New abstract class.  This is
2362         now used as a base class for everyone who's using `finally'.
2363         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2364         our local variables before using them.
2365
2366         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2367         virtual method.  This is used by Yield.Resolve() to "steal" an
2368         outer block's `finally' clauses.
2369         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2370         argument.
2371
2372         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2373         version which takes an ExceptionStatement.  This version must be
2374         used to create exception branchings.
2375
2376         * iterator.cs
2377         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2378         (Iterator.EmitMoveNext): Added exception support; protect the
2379         block with a `fault' clause, properly handle 'finally' clauses.
2380         (Iterator.EmitDispose): Run all the `finally' clauses here.
2381
2382 2004-07-20  Martin Baulig  <martin@ximian.com>
2383
2384         * iterator.cs: This is the first of a set of changes in the
2385         iterator code.  Match the spec more closely: if we're an
2386         IEnumerable, then GetEnumerator() must be called.  The first time
2387         GetEnumerator() is called, it returns the current instance; all
2388         subsequent invocations (if any) must create a copy.
2389
2390 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2391
2392         * expression.cs: Resolve the constant expression before returning
2393         it. 
2394
2395 2004-07-19  Martin Baulig  <martin@ximian.com>
2396
2397         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2398         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2399         the return type of the new EmitContext.
2400
2401 2004-07-18  Martin Baulig  <martin@ximian.com>
2402
2403         * class.cs (Property.Define): Fix iterators.
2404
2405         * iterators.cs (Iterator.Define): Moved the
2406         `container.AddInterator (this)' call here from the .ctor; only do
2407         it if we resolved successfully.
2408
2409 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2410
2411         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2412         `true' for preprocessing directives that we parse.  The return
2413         value indicates whether we should return to regular tokenizing or
2414         not, not whether it was parsed successfully.
2415
2416         In the past if we were in: #if false ... #line #endif, we would
2417         resume parsing after `#line'.  See bug 61604.
2418
2419         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2420         building: IsEnumType should return true only for enums, not for
2421         enums or System.Enum itself.  This fixes #61593.
2422
2423         Likely what happened is that corlib was wrong: mcs depended on
2424         this bug in some places.  The bug got fixed, we had to add the
2425         hack, which caused bug 61593.
2426
2427         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2428         that was a workaround for the older conditions.
2429
2430 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2431
2432         * assign.cs: IAssignMethod has a new interface, as documented
2433         inline. All assignment code now uses this new api.
2434
2435         * ecore.cs, expression.cs: All classes which implement
2436         IAssignMethod now use the new interface.
2437
2438         * expression.cs (Invocation): add a hack to EmitCall so that
2439         IndexerAccess can be the target of a compound assignment without
2440         evaluating its arguments twice.
2441
2442         * statement.cs: Handle changes in Invocation api.
2443
2444 2004-07-16  Martin Baulig  <martin@ximian.com>
2445
2446         * iterators.cs: Rewrote this.  We're now using one single Proxy
2447         class for both the IEnumerable and the IEnumerator interface and
2448         `Iterator' derives from Class so we can use the high-level API.
2449
2450         * class.cs (TypeContainer.AddIterator): New method.
2451         (TypeContainer.DoDefineType): New protected virtual method, which
2452         is called from DefineType().
2453         (TypeContainer.DoDefineMembers): Call DefineType() and
2454         DefineMembers() on all our iterators.
2455         (TypeContainer.Emit): Call Emit() on all our iterators.
2456         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2457
2458         * codegen.cs (EmitContext.CurrentIterator): New public field.
2459
2460 2004-07-15  Martin Baulig  <martin@ximian.com>
2461
2462         * typemanager.cs
2463         (TypeManager.not_supported_exception_type): New type.   
2464
2465 2004-07-14  Martin Baulig  <martin@ximian.com>
2466
2467         * iterators.cs: Use real error numbers.
2468
2469 2004-07-14  Martin Baulig  <martin@ximian.com>
2470
2471         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2472         requires this to be a System.Collection.IEnumerable and not a
2473         class implementing that interface.
2474         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2475
2476 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2477
2478         * class.cs: Fixed previous fix, it broke some error tests.
2479
2480 2004-07-12  Martin Baulig  <martin@ximian.com>
2481
2482         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2483         Fixes #61293.
2484
2485 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2486
2487         * assign.cs (LocalTemporary): Add new argument: is_address,If
2488         `is_address' is true, then the value that we store is the address
2489         to the real value, and not the value itself.
2490         
2491         * ecore.cs (PropertyExpr): use the new local temporary
2492         stuff to allow us to handle X.Y += z (where X is a struct)
2493
2494 2004-07-08  Martin Baulig  <martin@ximian.com>
2495
2496         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2497         not always return, just like we're doing in Using.Resolve().
2498
2499 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2500
2501         * cs-parser.jay (fixed_statement): flag this as Pinned.
2502
2503 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2504
2505         * typemanager.cs (TypeManager): Removed MakePinned method, this
2506         mechanism is replaced with the .NET 2.x compatible mechanism of
2507         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2508
2509         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2510         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2511         `IsFixed' property which has a different meaning.
2512
2513 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2514
2515         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2516         visible from inside a nested class, not just the names of the
2517         immediately enclosing class.
2518         Fix for bug #60730.
2519
2520 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2521
2522         * expression.cs (BetterConversion): Remove buggy special-case
2523         handling of "implicit constant expression conversions".  At this
2524         point, we already know that the conversion is possible -- we're
2525         only checking to see which is better.
2526
2527 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2528
2529         * cs-parser.jay: Added error CS0210 test.
2530
2531 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2532
2533         * cs-parser.jay: Added error CS0134 test.
2534
2535 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2536
2537         Fix bug #52507
2538         * cs-parser.jay: Added error CS0145 test.
2539
2540 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2541
2542         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2543
2544 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2545         
2546         * expression.cs (StackAlloc.Resolve): The argument may not
2547         be a constant; deal with this case.
2548         
2549 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2550
2551         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2552         GetIndexerAttributeValue.
2553         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2554
2555         * class.cs (Indexer.Define): Added error tests for CS0415,
2556         CS0609.
2557
2558 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2559
2560         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2561         property code.
2562
2563 2004-06-23  Martin Baulig  <martin@ximian.com>
2564
2565         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2566         neither return nor throw, reset the barrier as well.  Fixes #60457.
2567
2568 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2569
2570         * class.cs : EventAttributes is now set to None by default.
2571           This fixes bug #60459.
2572
2573 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2574
2575         Fix bug #60219
2576         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2577         Don't throw exception but return null (it's sufficient now).
2578
2579 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2580
2581         * typemanager.cs (GetArgumentTypes): Faster implementation.
2582
2583 2004-06-18  Martin Baulig  <martin@ximian.com>
2584
2585         * attribute.cs (Attribute.Resolve): Check whether we're an
2586         EmptyCast which a Constant child.  Fixes #60333.
2587
2588 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2589
2590         * statement.cs (EmitCollectionForeach): Account for the fact that
2591         not all valuetypes are in areas which we can take the address of.
2592         For these variables, we store to a temporary variable. Also, make
2593         sure that we dont emit a `callvirt' on a valuetype method.
2594
2595 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2596
2597         * expression.cs (StackAlloc.DoReSolve): Added test for
2598         negative parameter (CS0247).
2599
2600 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2601
2602         Fix bug #59792
2603         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2604
2605 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2606
2607         Fix bug #59781
2608         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2609         ulong.
2610
2611 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2612
2613         Fix bug #58254 & cs1555.cs, cs1556.cs
2614         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2615
2616 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2617
2618         * cs-parser.jay: Added error CS1669 test for indexers.
2619
2620 2004-06-11  Martin Baulig  <martin@ximian.com>
2621
2622         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2623         call this twice: for params and varargs methods.
2624
2625 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2626
2627         * class.cs:
2628         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2629
2630 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2631
2632         * attribute.cs (Attribute.GetValidTargets): Made public.
2633
2634         * class.cs: 
2635         (AbstractPropertyEventMethod): New class for better code sharing.
2636         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2637         CS1667 report.
2638         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2639
2640 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2641
2642         Fix bug #59477.
2643         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2644         that the call to Resolve is part of a MemberAccess.
2645         (Expression.Resolve): Use it for SimpleName resolution.
2646         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2647         Add 'intermediate' boolean argument.
2648         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2649         error message when the SimpleName can be resolved ambiguously
2650         between an expression and a type.
2651         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2652         public.
2653         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2654         call on the left-side.
2655
2656 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2657
2658         * class.cs:
2659         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2660
2661 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2662
2663         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2664
2665 2004-06-11  Martin Baulig  <martin@ximian.com>
2666
2667         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2668         varargs methods if applicable.
2669
2670 2004-06-11  Martin Baulig  <martin@ximian.com>
2671
2672         * expression.cs (Invocation.EmitCall): Don't use
2673         `method.CallingConvention == CallingConventions.VarArgs' since the
2674         method could also have `CallingConventions.HasThis'.
2675
2676 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2677
2678         * class.cs (Event.GetSignatureForError): Implemented.
2679         Fixed crash in error test cs3010.cs
2680
2681 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2682
2683         * cs-tokenizer.cs: Change the way we track __arglist to be
2684         consistent with the other keywords.
2685
2686 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2687
2688         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2689         tomorrow.
2690
2691 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2692
2693         * codegen.cs: Check that all referenced assemblies have a strongname
2694         before strongnaming the compiled assembly. If not report error CS1577.
2695         Fix bug #56563. Patch by Jackson Harper.
2696         * typemanager.cs: Added a method to return all referenced assemblies.
2697         Fix bug #56563. Patch by Jackson Harper.
2698
2699 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2700
2701         * class.cs:
2702         (Method.ApplyAttributeBuilder): Moved and added conditional
2703         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2704
2705         * delegate.cs:
2706         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2707
2708 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2709
2710         Fixed #59640
2711         * class.cs: (EventField.attribute_targets): Changed default target.
2712
2713 2004-06-08  Martin Baulig  <martin@ximian.com>
2714
2715         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2716
2717 2004-06-08  Martin Baulig  <martin@ximian.com>
2718
2719         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2720
2721 2004-06-07  Martin Baulig  <martin@ximian.com>
2722
2723         Added support for varargs methods.
2724
2725         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2726         keyword.
2727
2728         * cs-parser.jay: Added support for `__arglist'.
2729
2730         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2731
2732         * expression.cs (Argument.AType): Added `ArgList'.
2733         (Invocation): Added support for varargs methods.
2734         (ArglistAccess): New public class.
2735         (Arglist): New public class.
2736
2737         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2738
2739         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2740         a method's top-level block if the method has varargs.
2741
2742         * support.cs (ReflectionParameters, InternalParameters): Added
2743         support for varargs methods.    
2744
2745 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2746
2747         * class.cs: Provide location in indexer error report.
2748
2749         * driver.cs: Use standard names.
2750
2751         * namespace.cs: Catch the use of using after a namespace has been
2752         declared also on using aliases.
2753
2754 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2755
2756         Bug #50820.
2757         * typemanager.cs (closure_private_ok, closure_invocation_type)
2758         (closure_qualifier_type, closure_invocation_assembly)
2759         (FilterWithClosure): Move to ...
2760         (Closure): New internal nested class.
2761         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2762         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2763         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2764         (MemberLookup, MemberLookupFailed): Use it.
2765         * expression.cs (New.DoResolve): Treat the lookup for the
2766         constructor as being qualified by the 'new'ed type.
2767         (Indexers.GetIndexersForTypeOrInterface): Update.
2768
2769 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2770
2771         * attribute.cs
2772         (GetConditionalAttributeValue): New method. Returns
2773         condition of ConditionalAttribute.
2774         (SearchMulti): New method.  Returns all attributes of type 't'.
2775         Use it when attribute is AllowMultiple = true.
2776         (IsConditionalMethodExcluded): New method.
2777
2778         * class.cs
2779         (Method.IsExcluded): Implemented. Returns true if method has conditional
2780         attribute and the conditions is not defined (method is excluded).
2781         (IMethodData): Extended interface for ConditionalAttribute support.
2782         (PropertyMethod.IsExcluded): Implemented.
2783
2784         * decl.cs
2785         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2786
2787         * expression.cs
2788         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2789         on the method.
2790
2791 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2792
2793         * expression.cs (ArrayCreationExpression): Make this just an
2794         `expression'. It can't be a statement, so the code here was
2795         dead.
2796
2797 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2798
2799         Fixed #59072
2800         * typemanager.cs (GetFullNameSignature): New method for
2801         MethodBase types.
2802
2803 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2804
2805         Fixed #56452
2806         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2807         Use this method when MethodBuilder is null.
2808         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2809         Added test for error CS0626 (MONO reports error for this situation).
2810         (IMethodData.GetSignatureForError): Extended interface.
2811
2812 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2813
2814         * attribute.cs
2815         (AttributeTester.GetObsoleteAttribute): Returns instance of
2816         ObsoleteAttribute when type is obsolete.
2817
2818         * class.cs
2819         (TypeContainer.VerifyObsoleteAttribute): Override.
2820         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2821         (MethodCode.VerifyObsoleteAttribute): Override.
2822         (MemberBase.VerifyObsoleteAttribute): Override.
2823
2824         * decl.cs
2825         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2826         and report proper error.
2827
2828         *delegate.cs
2829         Delegate.VerifyObsoleteAttribute): Override.
2830
2831         * ecore.cs
2832         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2833         and report proper error.
2834         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2835
2836         * enum.cs
2837         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2838         and enum member.
2839
2840         * expression.cs
2841         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2842         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2843         Added test for ObsoleteAttribute.
2844
2845         * statement.cs
2846         (Catch): Derived from Statement.
2847
2848 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2849  
2850         Fixed bug #59071 & cs0160.cs
2851  
2852         * statement.cs (Try.Resolve): Check here whether order of catch
2853         clauses matches their dependencies.
2854
2855 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2856
2857         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2858         caused a regression: #59343.  Referencing nested classes from an
2859         assembly stopped working.
2860
2861 2004-05-31  Martin Baulig  <martin@ximian.com>
2862
2863         MCS is now frozen for beta 2.
2864
2865 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2866
2867         * convert.cs: add a trivial cache for overload operator resolution.
2868
2869 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2870
2871         * decl.cs: If possible, use lookuptypedirect here. We can only do
2872         this if there is no `.' after the namespace. Avoids using
2873         LookupType, which does lots of slow processing.
2874         (FindNestedType) New method, does what it says :-).
2875         * namespace.cs: use LookupTypeDirect.
2876         * rootcontext.cs: use membercache, if possible.
2877         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2878
2879 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2880
2881         * expression.cs:
2882         According to the spec, 
2883
2884         In a member access of the form E.I, if E is a single identifier,
2885         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2886         field, property, localvariable, or parameter with the same type as
2887         the meaning of E as a type-name (§3.8), then both possible
2888         meanings of E are permitted.
2889
2890         We did not check that E as a simple-name had the same type as E as
2891         a type name.
2892
2893         This trivial check gives us 5-7% on bootstrap time.
2894
2895 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2896
2897         * expression.cs (Invocation.OverloadResolve): Avoid the
2898         use of hashtables and boxing here by allocating on demand.
2899
2900 2004-05-30  Martin Baulig  <martin@ximian.com>
2901
2902         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2903         we're doing a silent lookup.  Don't try to lookup nested types in
2904         TypeManager.object_type (thanks to Ben Maurer).
2905
2906 2004-05-30  Martin Baulig  <martin@ximian.com>
2907
2908         Committing a patch from Ben Maurer.
2909
2910         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2911
2912 2004-05-29  Martin Baulig  <martin@ximian.com>
2913
2914         * class.cs (IMethodData.ShouldIgnore): New method.
2915
2916         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2917         `Location' argument, we don't need it anywhere.  Use
2918         `IMethodData.ShouldIgnore ()' instead of
2919         `MethodData.GetMethodFlags ()'.
2920         (TypeManager.AddMethod): Removed.
2921         (TypeManager.AddMethod2): Renamed to AddMethod.
2922
2923 2004-05-29  Martin Baulig  <martin@ximian.com>
2924
2925         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2926
2927         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2928         converting from a class type S to an interface type and we already
2929         have an object on the stack, don't box it again.  Fixes #52578.
2930
2931 2004-05-29  Martin Baulig  <martin@ximian.com>
2932
2933         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2934         Added support for `params' parameters.  Fixes #59267.
2935
2936 2004-05-29  Martin Baulig  <martin@ximian.com>
2937
2938         * literal.cs (NullPointer): Provide a private .ctor which sets
2939         `type' to TypeManager.object_type.  Fixes #59048.
2940
2941 2004-05-29  Martin Baulig  <martin@ximian.com>
2942
2943         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2944         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2945
2946         * ecore.cs (EventExpr.instance_expr): Make the field private.
2947
2948 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2949
2950         Fixed bug #50080 & cs0214-2.cs
2951         * expression.cs (Cast.DoResolve): Check unsafe context here.
2952         
2953         * statement.cs (Resolve.DoResolve): Likewise.
2954
2955 2004-05-26  Martin Baulig  <martin@ximian.com>
2956
2957         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2958
2959         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2960         (RootContext.LookupType): Pass down the `silent' flag.
2961
2962 2004-05-25  Martin Baulig  <martin@ximian.com>
2963
2964         * expression.cs
2965         (MethodGroupExpr.IdenticalTypeName): New public property.
2966         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2967         expression actually refers to a type.
2968
2969 2004-05-25  Martin Baulig  <martin@ximian.com>
2970
2971         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2972         for #56176 and made it actually work.
2973
2974 2004-05-25  Martin Baulig  <martin@ximian.com>
2975
2976         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2977         (FieldExpr, PropertyExpr): Override and implement
2978         CacheTemporaries.  Fixes #52279.
2979
2980 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2981
2982         * location.cs: In the new compiler listing a file twice is a
2983         warning, not an error.
2984
2985 2004-05-24  Martin Baulig  <martin@ximian.com>
2986
2987         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2988         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2989
2990 2004-05-24  Martin Baulig  <martin@ximian.com>
2991
2992         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2993         walking the `using' list.  Fixes #53921.
2994
2995 2004-05-24  Martin Baulig  <martin@ximian.com>
2996
2997         * const.cs (Const.LookupConstantValue): Added support for
2998         EmptyCast's; fixes #55251.
2999
3000 2004-05-24  Martin Baulig  <martin@ximian.com>
3001
3002         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3003         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3004         which does the CS0135 check.  The reason is that we first need to
3005         check whether the variable actually exists.
3006
3007 2004-05-24  Martin Baulig  <martin@ximian.com>
3008
3009         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3010         than RootContext.LookupType() to find the explicit interface
3011         type.  Fixes #58584.
3012
3013 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3014
3015         * Makefile: Simplify.  Use executable.make.
3016         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3017
3018 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3019
3020         * decl.cs:
3021         * enum.cs:
3022         Use the invariant culture when doing String.Compare for CLS case
3023         sensitivity.
3024         
3025 2004-05-23  Martin Baulig  <martin@ximian.com>
3026
3027         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3028         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3029
3030         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3031         
3032 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3033
3034         * class.cs (MemberBase.Define): Reuse MemberType member for 
3035         resolved type. Other methods can use it too.
3036
3037 2004-05-23  Martin Baulig  <martin@ximian.com>
3038
3039         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3040         the variable also exists in the current block (otherwise, we need
3041         to report a CS0103).  Fixes #58670.
3042
3043 2004-05-23  Martin Baulig  <martin@ximian.com>
3044
3045         * flowanalysis.cs (Reachability.Reachable): Compute this
3046         on-the-fly rather than storing it as a field.
3047
3048 2004-05-23  Martin Baulig  <martin@ximian.com>
3049
3050         * flowanalysis.cs (Reachability.And): Manually compute the
3051         resulting `barrier' from the reachability.      
3052        
3053 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3054
3055         Fix bug #57835
3056         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3057         instance of ObsoleteAttribute when symbol is obsolete.
3058
3059         * class.cs
3060         (IMethodData): Extended interface for ObsoleteAttribute support.
3061
3062 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3063
3064         * attribute.cs: Fix bug #55970
3065
3066 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3067
3068         Fix bug #52705
3069         * attribute.cs
3070         (GetObsoleteAttribute): New method. Creates the instance of
3071         ObsoleteAttribute.
3072         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3073         ObsoleteAttribute when member is obsolete.
3074         (AttributeTester.Report_ObsoleteMessage): Common method for
3075         Obsolete error/warning reporting.
3076
3077         * class.cs
3078         (TypeContainer.base_classs_type): New member for storing parent type.
3079
3080         * decl.cs
3081         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3082         for this MemberCore.
3083
3084 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3085
3086         * attribute.cs, const.cs: Fix bug #58590
3087
3088 2004-05-21  Martin Baulig  <martin@ximian.com>
3089
3090         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3091         out parameters if the end of the method is unreachable.  Fixes
3092         #58098. 
3093
3094 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3095
3096         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3097         Hari was right, why extra method.
3098
3099 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3100
3101         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3102
3103 2004-05-20  Martin Baulig  <martin@ximian.com>
3104
3105         Merged this back from gmcs to keep the differences to a minumum.
3106
3107         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3108         instead of a Declspace.
3109         (Attribute.ResolveType): Likewise.
3110         (Attributes.Search): Likewise.
3111         (Attributes.Contains): Likewise.
3112         (Attributes.GetClsCompliantAttribute): Likewise.
3113
3114         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3115         argument.
3116         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3117         DeclSpace.
3118
3119 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3120
3121         Fix bug #58688 (MCS does not report error when the same attribute
3122         is assigned twice)
3123
3124         * attribute.cs (Attribute.Emit): Distinction between null and default.
3125
3126 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3127
3128         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3129         of a top-level attribute without an attribute target.
3130         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3131         Make non-static.
3132         (Attribute.Conditional_GetConditionName), 
3133         (Attribute.Obsolete_GetObsoleteMessage): Update.
3134         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3135         part of ScanForIndexerName.
3136         (Attribute.CanIgnoreInvalidAttribute): New function.
3137         (Attribute.ScanForIndexerName): Move to ...
3138         (Attributes.ScanForIndexerName): ... here.
3139         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3140         (Attributes.Search): New internal variant that can choose not to
3141         complain if types aren't resolved.  The original signature now
3142         complains.
3143         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3144         complaints suppressed.
3145         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3146         only if it not useful.
3147         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3148         top-level for attributes that are shared between the assembly
3149         and a top-level class.
3150         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3151         * class.cs: Update to reflect changes.
3152         (DefineIndexers): Fuse loops.
3153         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3154         a couple more variants of attribute names.
3155
3156 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3157
3158         Fix bug #52585 (Implemented explicit attribute declaration)
3159
3160         * attribute.cs:
3161         (Attributable.ValidAttributeTargets): New abstract method. It gets
3162         list of valid attribute targets for explicit target declaration.
3163         (Attribute.Target): It holds target itself.
3164         (AttributeSection): Removed.
3165         (Attribute.CheckTargets): New method. It checks whether attribute
3166         target is valid for the current element.
3167
3168         * class.cs:
3169         (EventProperty): New class. For events that are declared like
3170         property (with add and remove accessors).
3171         (EventField): New class. For events that are declared like field.
3172         class.cs
3173
3174         * cs-parser.jay: Implemented explicit attribute target declaration.
3175
3176         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3177         Override ValidAttributeTargets.
3178
3179         * parameter.cs:
3180         (ReturnParameter): Class for applying custom attributes on 
3181         the return type.
3182         (ParameterAtribute): New class. Class for applying custom
3183         attributes on the parameter type.
3184
3185 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3186
3187         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3188         definitions. 
3189
3190         (Method): Allow UNSAFE here.
3191
3192         * modifiers.cs: Support unsafe reporting.
3193
3194 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3195
3196         * decl.cs: Fix bug #58478.
3197
3198 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3199
3200         * statement.cs: When checking for unreachable code on an EmptyStatement,
3201         set the location. Fixes bug #58488.
3202
3203 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3204
3205         * driver.cs: Add -pkg handling.
3206
3207         From Gonzalo: UseShelLExecute=false
3208
3209 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3210
3211         * attribute.cs:
3212         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3213         for attribute.
3214         (Attribute.IsClsCompliaceRequired): Moved to base for better
3215         accesibility.
3216         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3217         when attribute is AttributeUsageAttribute.
3218         (Attribute.GetValidTargets): Simplified.
3219         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3220         attribute for this type.
3221         (Attribute.ApplyAttributes): Method renamed to Emit and make
3222         non-static.
3223         (GlobalAttributeSection): New class for special handling of global
3224         attributes (assembly, module).
3225         (AttributeSection.Emit): New method.
3226
3227         * class.cs: Implemented Attributable abstract methods.
3228         (MethodCore.LabelParameters): Moved to Parameter class.
3229         (Accessor): Is back simple class.
3230         (PropertyMethod): Implemented Attributable abstract class.
3231         (DelegateMethod): Implemented Attributable abstract class.
3232         (Event): New constructor for disctintion between normal Event
3233         and Event with accessors.
3234
3235         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3236
3237         * codegen.cs, const.cs, decl.cs, delegate.cs:
3238         (CommonAssemblyModulClass): Implemented Attributable abstract class
3239         and simplified.
3240
3241         * enum.cs: Implement IAttributeSupport interface.
3242         (EnumMember): New class for emum members. Implemented Attributable
3243         abstract class
3244
3245         * parameter.cs:
3246         (ParameterBase): Is abstract.
3247         (ReturnParameter): New class for easier [return:] attribute handling.
3248
3249         * typemanager.cs: Removed builder_to_attr.
3250
3251 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3252
3253         Fix bug #57151.
3254         * attribute.cs (Attribute.GetPositionalValue): New function.
3255         * class.cs (TypeContainer.VerifyMembers): New function.
3256         (TypeContainer.Emit): Use it.
3257         (ClassOrStruct): New base class for Class and Struct.
3258         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3259         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3260         class.
3261         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3262         then each non-static field should have a FieldOffset attribute.
3263         Otherwise, none of the fields should have a FieldOffset attribute.
3264         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3265         and FieldOffset attributes.
3266         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3267         (TypeManager.field_offset_attribute_type): New core types.
3268         (TypeManager.InitCoreTypes): Initialize them.
3269
3270 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3271
3272         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3273         Return correct type.
3274         From bug #58270.
3275
3276 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3277
3278         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3279         be implicitly converted to ulong.
3280         
3281         * expression.cs: The logic for allowing operator &, | and ^ worked
3282         was wrong, it worked before because we did not report an error in
3283         an else branch.  Fixes 57895.
3284
3285         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3286         allow volatile fields to be reference types.
3287
3288 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3289
3290         * driver.cs: Add support for /debug-
3291
3292 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3293
3294         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3295         Add a 'complain' parameter to silence errors.
3296         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3297         silently overlooked type-resolutions.
3298         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3299         to reflect changes.
3300         (Attributes.Search): New function.
3301         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3302         (Attributes.GetAttributeFullName): Remove hack.
3303         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3304         Update to reflect changes.
3305         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3306         Use Attributes.Search instead of nested loops.
3307
3308 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3309
3310         * decl.cs:
3311         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3312         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3313         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3314
3315         * report.cs: (Report.Warning): Renamed to Warning_T because of
3316         parameter collision.
3317
3318 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3319
3320         * expression.cs (MemberAccess.ResolveMemberAccess):
3321         Exit with non-zero status after Report.Error.
3322         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3323         Likewise.
3324         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3325
3326 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3327
3328         * support.cs: Don't hang when the file is empty.
3329
3330 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3331
3332         * support.cs: In SeekableStreamReader, compute the preamble size of the
3333           underlying stream. Position changes should take into account that initial
3334           count of bytes.
3335
3336 2004-05-03  Todd Berman  <tberman@sevenl.net>
3337
3338         * driver.cs: remove unused GetSysVersion function.
3339
3340 2004-05-03  Todd Berman  <tberman@sevenl.net>
3341
3342         * driver.cs: Remove the hack from saturday, as well as the hack
3343         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3344         link_paths to get that bit proper.
3345
3346 2004-05-01  Todd Berman  <tberman@sevenl.net>
3347
3348         * driver.cs: Try a LoadFrom before a Load, this checks the current
3349         path. This is currently a bug in mono that is be fixed, however, this
3350         provides a workaround for now. This will be removed when the bug
3351         is fixed.
3352
3353 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3354
3355         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3356         incomplete key pairs (#57941).
3357
3358 2004-05-01  Todd Berman  <tberman@sevenl.net>
3359
3360         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3361         from the GAC
3362
3363 2004-04-30  Jackson Harper  <jackson@ximian.com>
3364
3365         * codegen.cs: Open keys readonly.
3366         
3367 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3368
3369         * typemanager.cs: don't report cyclic struct layout when a struct
3370         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3371         which has 2 Pango.Rectangle fields.
3372
3373 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3374
3375         * expression.cs: Handle IntPtr comparisons with IL code
3376         rather than a method call.
3377
3378 2004-04-29  Martin Baulig  <martin@ximian.com>
3379
3380         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3381         the list of PropertyInfo's in class hierarchy and find the
3382         accessor.  Fixes #56013.
3383
3384 2004-04-29  Martin Baulig  <martin@ximian.com>
3385
3386         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3387
3388 2004-04-29  Martin Baulig  <martin@ximian.com>
3389
3390         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3391
3392         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3393
3394 2004-04-29  Martin Baulig  <martin@ximian.com>
3395
3396         * class.cs (ConstructorInitializer.Resolve): Check whether the
3397         parent .ctor is accessible.  Fixes #52146.
3398
3399 2004-04-29  Martin Baulig  <martin@ximian.com>
3400
3401         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3402
3403         * statement.cs (Using.EmitLocalVariableDecls): Use
3404         TypeManager.idisposable_type, not typeof (IDisposable).
3405         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3406
3407 2004-04-29  Martin Baulig  <martin@ximian.com>
3408
3409         * class.cs (Event.Define): Don't emit the field and don't set
3410         RTSpecialName and SpecialName for events on interfaces.  Fixes
3411         #57703. 
3412
3413 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3414
3415         Refactor Attribute.ApplyAttributes.
3416         * attribute.cs (Attributable): New base class for objects that can
3417         have Attributes applied on them.
3418         (Attribute): Make AttributeUsage fields public.
3419         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3420         (Attribute.IsInternalCall): New property.
3421         (Attribute.UsageAttr): Convert to a public read-only property.
3422         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3423         (Attribute.ResolveType, Attribute.Resolve)
3424         (Attribute.ScanForIndexerName): Update to reflect changes.
3425         (Attribute.CheckAttributeTarget): Re-format.
3426         (Attribute.ApplyAttributes): Refactor, to various
3427         Attributable.ApplyAttributeBuilder methods.
3428         * decl.cs (MemberCore): Make Attributable.
3429         * class.cs (Accessor): Make Attributable.
3430         (MethodData.ApplyAttributes): Use proper attribute types, not
3431         attribute names.
3432         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3433         (TypeContainer.ApplyAttributeBuilder)
3434         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3435         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3436         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3437         (Operator.ApplyAttributeBuilder): New factored-out methods.
3438         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3439         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3440         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3441         * parameter.cs (ParameterBase): New Attributable base class
3442         that can also represent Return types.
3443         (Parameter): Update to the changes.
3444
3445 2004-04-29  Jackson Harper  <jackson@ximian.com>
3446
3447         * driver.cs: Prefer the corlib system version when looking for
3448         assemblies in the GAC. This is still a hack, but its a better hack
3449         now.
3450         
3451 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3452
3453         * decl.cs, enum.cs: Improved error 3005 reporting.
3454   
3455         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3456         (related_symbols): New private member for list of symbols
3457         related to reported error/warning.
3458         
3459         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3460
3461 2004-04-29  Martin Baulig  <martin@ximian.com>
3462
3463         * ecore.cs (Expression.Constantify): If we're an enum and
3464         TypeManager.TypeToCoreType() doesn't give us another type, use
3465         t.UnderlyingSystemType.  Fixes #56178.  
3466
3467 2004-04-29  Martin Baulig  <martin@ximian.com>
3468
3469         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3470         interfaces and for each interface, only add members directly
3471         declared in that interface.  Fixes #53255.
3472
3473 2004-04-28  Martin Baulig  <martin@ximian.com>
3474
3475         * expression.cs (ConditionalLogicalOperator): Use a temporary
3476         variable for `left' to avoid that we evaluate it more than once;
3477         bug #52588.
3478
3479 2004-04-28  Martin Baulig  <martin@ximian.com>
3480
3481         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3482         `void[]' (CS1547).
3483
3484 2004-04-28  Martin Baulig  <martin@ximian.com>
3485
3486         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3487         void (CS1547).
3488
3489         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3490         whether the type is not void (CS1547).
3491
3492 2004-04-28  Martin Baulig  <martin@ximian.com>
3493
3494         * expression.cs (Unary.DoResolveLValue): Override this and report
3495         CS0131 for anything but Operator.Indirection.
3496
3497 2004-04-28  Martin Baulig  <martin@ximian.com>
3498
3499         Committing a patch from Ben Maurer; see bug #50820.
3500
3501         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3502         check for classes.
3503
3504         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3505         classes.        
3506
3507 2004-04-28  Martin Baulig  <martin@ximian.com>
3508
3509         Committing a patch from Ben Maurer; see bug #50820.
3510
3511         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3512         check for classes.
3513
3514         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3515         classes.        
3516
3517 2004-04-28  Martin Baulig  <martin@ximian.com>
3518
3519         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3520         (Block.AddLabel): Call DoLookupLabel() to only search in the
3521         current block.
3522
3523 2004-04-28  Martin Baulig  <martin@ximian.com>
3524
3525         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3526         comparing StringConstants and NullLiterals in Equality and Inequality.
3527
3528 2004-04-28  Jackson Harper  <jackson@ximian.com>
3529
3530         * driver.cs: Attempt to load referenced assemblies from the
3531         GAC. This is the quick and dirty version of this method that
3532         doesnt take into account versions and just takes the first
3533         canidate found. Will be good enough for now as we will not have more
3534         then one version installed into the GAC until I update this method.
3535
3536 2004-04-28  Martin Baulig  <martin@ximian.com>
3537
3538         * typemanager.cs (TypeManager.CheckStructCycles): New public
3539         static method to check for cycles in the struct layout.
3540
3541         * rootcontext.cs (RootContext.PopulateTypes): Call
3542         TypeManager.CheckStructCycles() for each TypeContainer.
3543         [Note: We only need to visit each type once.]
3544
3545 2004-04-28  Martin Baulig  <martin@ximian.com>
3546
3547         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3548
3549         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3550         success and added `out object value'.  Use a `bool resolved' field
3551         to check whether we've already been called rather than
3552         `ConstantValue != null' since this breaks for NullLiterals.
3553
3554 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3555
3556         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3557         setting of this flag, since the 'set' method may be non-public.
3558
3559 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3560
3561         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3562         check on current_vector.Block.
3563
3564 2004-04-27  Martin Baulig  <martin@ximian.com>
3565
3566         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3567         a field initializer.  Fixes #56459.
3568
3569 2004-04-27  Martin Baulig  <martin@ximian.com>
3570
3571         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3572         we're not attempting to use an indexer.  Fixes #52154.
3573
3574 2004-04-27  Martin Baulig  <martin@ximian.com>
3575
3576         * statement.cs (Return): Don't create a return label if we don't
3577         need it; reverts my change from January 20th.  Thanks to Ben
3578         Maurer for this.
3579
3580 2004-04-27  Martin Baulig  <martin@ximian.com>
3581
3582         According to the spec, `goto' can only leave a nested scope, but
3583         never enter it.
3584
3585         * statement.cs (Block.LookupLabel): Only lookup in the current
3586         block, don't recurse into parent or child blocks.
3587         (Block.AddLabel): Check in parent and child blocks, report
3588         CS0140/CS0158 if we find a duplicate.
3589         (Block): Removed this indexer for label lookups.
3590         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3591         this already does the error reporting for us.
3592
3593         * flowanalysis.cs
3594         (FlowBranching.UsageVector.Block): New public variable; may be null.
3595         (FlowBranching.CreateSibling): Added `Block' argument.
3596         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3597         label for the target of a `goto' and check whether we're not
3598         leaving a `finally'.
3599
3600 2004-04-27  Martin Baulig  <martin@ximian.com>
3601
3602         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3603         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3604         just for returns).
3605
3606 2004-04-27  Martin Baulig  <martin@ximian.com>
3607
3608         * statement.cs (Block.AddLabel): Also check for implicit blocks
3609         and added a CS0158 check.
3610
3611 2004-04-27  Martin Baulig  <martin@ximian.com>
3612
3613         * flowanalysis.cs (FlowBranchingLoop): New class.
3614         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3615         UsageVector's instead of an ArrayList.
3616         (FlowBranching.Label): Likewise.
3617         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3618         (FlowBranching.AddBreakVector): New method.
3619
3620 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3621
3622         * attribute.cs: Small regression fix: only convert the type if we
3623         the type is different, fixes System.Drawing build.
3624
3625 2004-04-27  Martin Baulig  <martin@ximian.com>
3626
3627         * attribute.cs (Attribute.Resolve): If we have a constant value
3628         for a named field or property, implicity convert it to the correct
3629         type.
3630
3631 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3632
3633         * statement.cs (Block.Block): Implicit blocks share
3634         'child_variable_names' fields with parent blocks.
3635         (Block.AddChildVariableNames): Remove.
3636         (Block.AddVariable): Mark variable as "used by a child block" in
3637         every surrounding block.
3638         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3639         been used in a child block, complain about violation of "Invariant
3640         meaning in blocks" rule.
3641         * cs-parser.jay (declare_local_variables): Don't use
3642         AddChildVariableNames.
3643         (foreach_statement): Don't create an implicit block: 'foreach'
3644         introduces a scope.
3645
3646 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3647
3648         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3649         converting from 0L to ulong.  Fixes 57522.
3650
3651 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3652
3653         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3654         derived class hides via 'new' keyword field from base class (test-242.cs).
3655         TODO: Handle this in the more general way.
3656         
3657         * class.cs (CheckBase): Ditto.
3658
3659 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3660
3661         * decl.cs (caching_flags): New member for storing cached values
3662         as bit flags.
3663         (MemberCore.Flags): New enum where bit flags for caching_flags
3664         are defined.
3665         (MemberCore.cls_compliance): Moved to caching_flags.
3666         (DeclSpace.Created): Moved to caching_flags.
3667
3668         * class.cs: Use caching_flags instead of DeclSpace.Created
3669         
3670 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3671
3672         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3673         if we are only a derived class, not a nested class.
3674
3675         * typemanager.cs: Same as above, but do this at the MemberLookup
3676         level (used by field and methods, properties are handled in
3677         PropertyExpr).   Allow for the qualified access if we are a nested
3678         method. 
3679
3680 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3681
3682         * class.cs: Refactoring.
3683         (IMethodData): New inteface; Holds links to parent members
3684         to avoid member duplication (reduced memory allocation).
3685         (Method): Implemented IMethodData interface.
3686         (PropertyBase): New inner classes for get/set methods.
3687         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3688         (Event): New inner classes for add/remove methods.
3689         (Event.DelegateMethod): Implemented IMethodData interface.
3690
3691         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3692         EmitContext (related to class.cs refactoring).
3693
3694 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3695
3696         * delegate.cs (Delegate.VerifyApplicability): If the number of
3697         arguments are the same as the number of parameters, first try to
3698         verify applicability ignoring  any 'params' modifier on the last
3699         parameter.
3700         Fixes #56442.
3701
3702 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3703
3704         * class.cs (TypeContainer.AddIndexer): Use
3705         'ExplicitInterfaceName' to determine if interface name was
3706         explicitly specified.  'InterfaceType' is not initialized at this time.
3707         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3708         Indexers array is already in the required order.  Initialize
3709         'IndexerName' only if there are normal indexers.
3710         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3711         (TypeContainer.Emit): Emit DefaultMember attribute only if
3712         IndexerName is initialized.
3713         Fixes #56300.
3714
3715 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3716
3717         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3718         Fixes #57007
3719
3720 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3721
3722         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3723         attributes.
3724         Fix for #56456.
3725
3726         * attribute.cs (Attribute.Resolve): Check for duplicate named
3727         attributes.
3728         Fix for #56463.
3729
3730 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3731
3732         * iterators.cs (MarkYield): track whether we are in an exception,
3733         and generate code accordingly.  Use a temporary value to store the
3734         result for our state.
3735
3736         I had ignored a bit the interaction of try/catch with iterators
3737         since their behavior was not entirely obvious, but now it is
3738         possible to verify that our behavior is the same as MS .NET 2.0
3739
3740         Fixes 54814
3741
3742 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3743
3744         * iterators.cs: Avoid creating temporaries if there is no work to
3745         do. 
3746
3747         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3748         Enumerations, use TypeManager.EnumToUnderlying and call
3749         recursively. 
3750
3751         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3752         bug #57013
3753
3754         (This.Emit): Use EmitContext.EmitThis to emit our
3755         instance variable.
3756
3757         (This.EmitAssign): Ditto.
3758
3759         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3760         codepaths, we will move all the functionality into
3761         Mono.CSharp.This 
3762
3763         (FieldExpr.EmitAssign): Ditto.
3764
3765         This fixes several hidden bugs that I uncovered while doing a code
3766         review of this today.
3767
3768         * codegen.cs (EmitThis): reworked so the semantics are more clear
3769         and also support value types "this" instances.
3770
3771         * iterators.cs: Changed so that for iterators in value types, we
3772         do not pass the value type as a parameter.  
3773
3774         Initialization of the enumerator helpers is now done in the caller
3775         instead of passing the parameters to the constructors and having
3776         the constructor set the fields.
3777
3778         The fields have now `assembly' visibility instead of private.
3779
3780 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3781
3782         * expression.cs (Argument.Resolve): Check if fields passed as ref
3783         or out are contained in a MarshalByRefObject.
3784
3785         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3786         another compiler type.
3787
3788 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3789
3790         * class.cs (Indexer.Define): use the new name checking method.
3791         Also, return false on an error.
3792         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3793         (is_identifier_[start/part]_character): make static.
3794
3795 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3796
3797         * expression.cs (Binary.ResolveOperator): Do no append strings
3798         twice: since we can be invoked more than once (array evaluation)
3799         on the same concatenation, take care of this here.  Based on a fix
3800         from Ben (bug #56454)
3801
3802 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3803
3804         * codegen.cs: Fix another case where CS1548 must be reported (when 
3805         delay-sign isn't specified and no private is available #56564). Fix
3806         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3807         error when MCS is used on the MS runtime and we need to delay-sign 
3808         (which seems unsupported by AssemblyBuilder - see #56621).
3809
3810 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3811
3812         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3813         (TypeManager.ComputeNamespaces): Faster implementation for
3814         Microsoft runtime.
3815
3816         * compiler.csproj: Updated AssemblyName to mcs.
3817
3818 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3819
3820         * rootcontext.cs: Add new types to the boot resolution.
3821
3822         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3823         MulticastDelegate is not allowed.
3824
3825         * typemanager.cs: Add new types to lookup: System.TypedReference
3826         and ArgIterator.
3827
3828         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3829         check for TypedReference or ArgIterator, they are not allowed. 
3830
3831         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3832         makes us properly catch 1510 in some conditions (see bug 56016 for
3833         details). 
3834
3835 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3836
3837         * CryptoConvert.cs: update from corlib version
3838         with endian fixes.
3839
3840 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3841
3842         * class.cs (Indexer.Define): Check indexername declaration
3843
3844 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3845
3846         * attribute.cs (IsClsCompliant): Fixed problem with handling
3847         all three states (compliant, not-compliant, undetected).
3848
3849 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3850
3851         * attribute.cs (Attribute): Location is now public.
3852         (Resolve): Store resolved arguments (pos_values) in attribute class.
3853         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3854         (GetClsCompliantAttributeValue): New method that gets
3855         CLSCompliantAttribute value.
3856         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3857         if exists else null.
3858         (AttributeTester): New class for CLS-Compliant verification routines.
3859
3860         * class.cs (Emit): Add CLS-Compliant verification.
3861         (Method.GetSignatureForError): Implemented.
3862         (Constructor.GetSignatureForError): Implemented
3863         (Constructor.HasCompliantArgs): Returns if constructor has
3864         CLS-Compliant arguments.
3865         (Constructor.Emit): Override.
3866         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3867         is needed to test only parameters.
3868         (FieldBase.GetSignatureForError): Implemented.
3869         (TypeContainer): New member for storing base interfaces.
3870         (TypeContainer.FindMembers): Search in base interfaces too.
3871
3872         * codegen.cs (GetClsComplianceAttribute): New method that gets
3873         assembly or module CLSCompliantAttribute value.
3874         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3875         for assembly.
3876         (ModuleClass.Emit): Add error 3012 test.
3877
3878         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3879
3880         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3881         state for all decl types.
3882         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3883         if CLS-Compliant tests are required.
3884         (IsClsCompliaceRequired): New method. Analyze whether code
3885         must be CLS-Compliant.
3886         (IsExposedFromAssembly): New method. Returns true when MemberCore
3887         is exposed from assembly.
3888         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3889         value or gets cached value.
3890         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3891         is explicitly marked with CLSCompliantAttribute.
3892         (IsIdentifierClsCompliant): New abstract method. This method is
3893         used to testing error 3005.
3894         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3895         for identifier and parameters CLS-Compliant testing.
3896         (VerifyClsCompliance): New method. The main virtual method for
3897         CLS-Compliant verifications.
3898         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3899         null. I don't know why is null (too many public members !).
3900         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3901         and get value of first CLSCompliantAttribute that found.
3902
3903         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3904         (VerifyClsCompliance): Override and add extra tests.
3905
3906         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3907         clscheck- disable CLS-Compliant verification event if assembly is has
3908         CLSCompliantAttribute(true).
3909
3910         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3911         ApllyAttribute is now called in emit section as in the other cases.
3912         Possible future Emit integration.
3913         (IsIdentifierClsCompliant): New override.
3914         (VerifyClsCompliance): New override.
3915         (GetEnumeratorName): Returns full enum name.
3916
3917         * parameter.cs (GetSignatureForError): Implemented.
3918
3919         * report.cs (WarningData): New struct for Warning message information.
3920         (LocationOfPreviousError): New method.
3921         (Warning): New method. Reports warning based on the warning table.
3922         (Error_T): New method. Reports error based on the error table.
3923
3924         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3925         verifications are done here.
3926
3927         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3928
3929         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3930         CLSCompliantAttribute.
3931         (all_imported_types): New member holds all imported types from other
3932         assemblies.
3933         (LoadAllImportedTypes): New method fills static table with exported types
3934         from all referenced assemblies.
3935         (Modules): New property returns all assembly modules.
3936
3937 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3938
3939         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3940         throwing a parser error.
3941
3942         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3943         which removes the hardcoded get_/set_ prefixes for properties, as
3944         IL allows for the properties to be named something else.  
3945
3946         Bug #56013
3947
3948         * expression.cs: Do not override operand before we know if it is
3949         non-null.  Fix 56207
3950
3951 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3952
3953         * typemanager.cs: support for pinned variables.
3954
3955 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3956
3957         * decl.cs, typemanager.cs: Avoid using an arraylist
3958         as a buffer if there is only one result set.
3959
3960 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3961
3962         * expression.cs: Make sure you cant call a static method
3963         with an instance expression, bug #56174.
3964
3965 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3966
3967         * class.cs (IsDuplicateImplementation): Improve error reporting to
3968         flag 663 (method only differs in parameter modifier).
3969
3970         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3971         in preprocessor directives.
3972
3973         * location.cs (LookupFile): Allow for the empty path.
3974
3975         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3976         better approach for some of that patch, but its failing with the
3977         CharSet enumeration.  For now try/catch will do.
3978
3979         * typemanager.cs: Do not crash if a struct does not have fields.
3980         Fixes 56150.
3981
3982 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3983
3984         * expression.cs: cs0213, cant fix a fixed expression.
3985         fixes 50231.
3986
3987 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3988
3989         * cs-parser.jay: detect invalid embeded statements gracefully.
3990         bug #51113.
3991
3992 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3993
3994         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3995         As a regex:
3996         s/
3997         the invocation type may not be a subclass of the tye of the item/
3998         The type of the item must be a subclass of the invocation item.
3999         /g
4000
4001         Fixes bug #50820.
4002
4003 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4004
4005         * attribute.cs: Added methods to get a string and a bool from an
4006         attribute. Required to information from AssemblyKeyFileAttribute,
4007         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4008         * codegen.cs: Modified AssemblyName creation to include support for
4009         strongnames. Catch additional exceptions to report them as CS1548.
4010         * compiler.csproj: Updated include CryptoConvert.cs.
4011         * compiler.csproj.user: Removed file - user specific configuration.
4012         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4013         Mono.Security assembly. The original class is maintained and tested in
4014         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4015         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4016         like CSC 8.0 (C# v2) supports.
4017         * Makefile: Added CryptoConvert.cs to mcs sources.
4018         * rootcontext.cs: Added new options for strongnames.
4019
4020 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4021
4022         * driver.cs: For --expect-error, report error code `2'
4023         if the program compiled with no errors, error code `1' if
4024         it compiled with an error other than the one expected.
4025
4026 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4027
4028         * compiler.csproj: Updated for Visual Studio .NET 2003.
4029         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4030         * compiler.sln: Updated for Visual Studio .NET 2003.
4031
4032 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4033
4034         * expression.cs: Fix bug #47234. We basically need to apply the
4035         rule that we prefer the conversion of null to a reference type
4036         when faced with a conversion to 'object' (csc behaviour).
4037
4038 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4039
4040         * statement.cs: Shorter form for foreach, eliminates
4041         a local variable. r=Martin.
4042
4043 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4044
4045         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4046         checks if we can use brtrue/brfalse to test for 0.
4047         * expression.cs: use the above in the test for using brtrue/brfalse.
4048         cleanup code a bit.
4049
4050 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4051
4052         * expression.cs: Rewrite string concat stuff. Benefits:
4053
4054         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4055         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4056         rather than a concat chain.
4057
4058         * typemanager.cs: Add lookups for more concat overloads.
4059
4060 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4061
4062         * expression.cs: Emit shorter il code for array init.
4063
4064         newarr
4065         dup
4066         // set 1
4067
4068         // set 2
4069
4070         newarr
4071         stloc.x
4072
4073         ldloc.x
4074         // set 1
4075
4076         ldloc.x
4077         // set 2
4078
4079 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4080
4081         * statement.cs: Before, two switch blocks would be merged if the
4082         total size of the blocks (end_item - begin_item + 1) was less than
4083         two times the combined sizes of the blocks.
4084
4085         Now, it will only merge if after the merge at least half of the
4086         slots are filled.
4087
4088         fixes 55885.
4089
4090 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4091
4092         * class.cs : csc build fix for GetMethods(). See bug #52503.
4093
4094 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4095
4096         * expression.cs: Make sure fp comparisons work with NaN.
4097         This fixes bug #54303. Mig approved this patch a long
4098         time ago, but we were not able to test b/c the runtime
4099         had a related bug.
4100
4101 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4102
4103         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4104
4105 2004-03-19  Martin Baulig  <martin@ximian.com>
4106
4107         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4108         error here and not in our caller.
4109
4110 2004-03-19  Martin Baulig  <martin@ximian.com>
4111
4112         * interface.cs: Completely killed this file.
4113         (Interface): We're now a TypeContainer and live in class.cs.
4114
4115         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4116         argument; we're now also called for interfaces.
4117         (TypeContainer.DefineMembers): Allow this method being called
4118         multiple times.
4119         (TypeContainer.GetMethods): New public method; formerly known as
4120         Interface.GetMethod().  This is used by PendingImplementation.
4121         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4122         it's now private and non-static.
4123         (Interface): Moved this here; it's now implemented similar to
4124         Class and Struct.
4125         (Method, Property, Event, Indexer): Added `bool is_interface'
4126         argument to their .ctor's.
4127         (MemberBase.IsInterface): New public field.
4128
4129         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4130         instances instead of InterfaceMethod, InterfaceProperty, etc.
4131         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4132         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4133
4134 2004-03-19  Martin Baulig  <martin@ximian.com>
4135
4136         * class.cs (MethodCore.IsDuplicateImplementation): New private
4137         method which does the CS0111 checking.
4138         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4139         Use IsDuplicateImplementation().
4140
4141 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4142
4143         * decl.cs (FindMemberToOverride): New method to find the correct
4144         method or property to override in the base class.
4145         * class.cs
4146             - Make Method/Property use the above method to find the
4147               version in the base class.
4148             - Remove the InheritableMemberSignatureCompare as it is now
4149               dead code.
4150
4151         This patch makes large code bases much faster to compile, as it is
4152         O(n) rather than O(n^2) to do this validation.
4153
4154         Also, it fixes bug 52458 which is that nested classes are not
4155         taken into account when finding the base class member.
4156
4157         Reviewed/Approved by Martin.
4158
4159 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4160
4161         * interface.cs: In all interface classes removed redundant
4162         member initialization.
4163
4164 2004-03-16  Martin Baulig  <martin@ximian.com>
4165
4166         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4167
4168 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4169
4170         * decl.cs (DefineTypeAndParents): New helper method to define a
4171         type's containers before the type itself is defined;  This is a
4172         bug exposed by the recent changes to Windows.Forms when an
4173         implemented interface was defined inside a class that had not been
4174         built yet.   
4175
4176         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4177
4178         (Check): Loop correctly to report errors modifiers
4179         (UNSAFE was not in the loop, since it was the same as TOP).
4180
4181         * interface.cs: Every interface member now takes a ModFlags,
4182         instead of a "is_new" bool, which we set on the base MemberCore. 
4183
4184         Every place where we called "UnsafeOk" in the interface, now we
4185         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4186         the unsafe settings from the member declaration instead of the
4187         container interface. 
4188
4189         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4190
4191         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4192         `set_indexer_name' to the pending bits (one per type).
4193
4194         We fixed a bug today that was picking the wrong method to
4195         override, since for properties the existing InterfaceMethod code
4196         basically ignored the method name.  Now we make sure that the
4197         method name is one of the valid indexer names.
4198
4199 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4200  
4201         * support.cs (SeekableStreamReader): Keep track of stream byte
4202         positions and don't mix them with character offsets to the buffer.
4203
4204         Patch from Gustavo Giráldez
4205
4206 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4207
4208         * interface.cs (InterfaceSetGetBase): Removed double member
4209         initialization, base class does it as well.
4210
4211 2004-03-13  Martin Baulig  <martin@ximian.com>
4212
4213         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4214         when compiling corlib.
4215
4216 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4217
4218         * convert.cs (ExplicitConversion): We were reporting an error on
4219         certain conversions (object_type source to a value type, when the
4220         expression was `null') before we had a chance to pass it through
4221         the user defined conversions.
4222
4223         * driver.cs: Replace / and \ in resource specifications to dots.
4224         Fixes 50752
4225
4226         * class.cs: Add check for duplicate operators.  Fixes 52477
4227
4228 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4229
4230         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4231         that are in the middle of the statements, not only at the end.
4232         Fixes #54987
4233
4234         * class.cs (TypeContainer.AddField): No longer set the
4235         `HaveStaticConstructor' flag, now we call it
4236         `UserDefineStaticConstructor' to diferentiate the slightly
4237         semantic difference.
4238
4239         The situation is that we were not adding BeforeFieldInit (from
4240         Modifiers.TypeAttr) to classes that could have it.
4241         BeforeFieldInit should be set to classes that have no static
4242         constructor. 
4243
4244         See:
4245
4246         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4247
4248         And most importantly Zoltan's comment:
4249
4250         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4251
4252         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4253          before its static fields are used', i.e. initialization does not need
4254          to be triggered by the first access to the type. Setting this flag
4255          helps the JIT to compile better code, since it can run the static
4256          constructor at JIT time, and does not need to generate code to call it
4257          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4258          this flag for lots of classes like String. 
4259          
4260          csc sets this flag if the type does not have an explicit static 
4261          constructor. The reasoning seems to be that if there are only static
4262          initalizers for a type, and no static constructor, then the programmer
4263          does not care when this initialization happens, so beforefieldinit
4264          can be used.
4265          
4266          This bug prevents the AOT compiler from being usable, since it 
4267          generates so many calls to mono_runtime_class_init that the AOT code
4268          is much slower than the JITted code. The JITted code is faster, 
4269          because it does not generate these calls if the vtable is type is
4270          already initialized, which is true in the majority of cases. But the
4271          AOT compiler can't do this."
4272
4273 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4274
4275         * class.cs (MethodData.Emit): Refactor the code so symbolic
4276         information is generated for destructors;  For some reasons we
4277         were taking a code path that did not generate symbolic information
4278         before. 
4279
4280 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4281
4282         * class.cs: Create a Constructor.CheckBase method that
4283         takes care of all validation type code. The method
4284         contains some code that was moved from Define.
4285
4286         It also includes new code that checks for duplicate ctors.
4287         This fixes bug #55148.
4288
4289 2004-03-09  Joshua Tauberer <tauberer@for.net>
4290
4291         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4292         a { ... }-style array creation invokes EmitStaticInitializers
4293         which is not good for reference-type arrays.  String, decimal
4294         and now null constants (NullCast) are not counted toward
4295         static initializers.
4296
4297 2004-03-05  Martin Baulig  <martin@ximian.com>
4298
4299         * location.cs (SourceFile.HasLineDirective): New public field;
4300         specifies whether the file contains or is referenced by a "#line"
4301         directive.
4302         (Location.DefineSymbolDocuments): Ignore source files which
4303         either contain or are referenced by a "#line" directive.        
4304
4305 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4306
4307         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4308         direct access to our parent, so check the method inline there.
4309
4310 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4311
4312         * expression.cs (Invocation.EmitCall): Miguel's last commit
4313         caused a regression. If you had:
4314
4315             T t = null;
4316             t.Foo ();
4317
4318         In Foo the implict this would be null.
4319
4320 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4321
4322         * expression.cs (Invocation.EmitCall): If the method is not
4323         virtual, do not emit a CallVirt to it, use Call.
4324
4325         * typemanager.cs (GetFullNameSignature): Improve the method to
4326         cope with ".ctor" and replace it with the type name.
4327
4328         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4329         as an argument the ConstructorBuilder where it is being defined,
4330         to catch the recursive constructor invocations.
4331
4332 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4333
4334         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4335         routines to check if a type is an enumerable/enumerator allow
4336         classes that implement the IEnumerable or IEnumerator interfaces.
4337
4338         * class.cs (Property, Operator): Implement IIteratorContainer, and
4339         implement SetYields.
4340
4341         (Property.Define): Do the block swapping for get_methods in the
4342         context of iterators.   We need to check if Properties also
4343         include indexers or not.
4344
4345         (Operator): Assign the Block before invoking the
4346         OperatorMethod.Define, so we can trigger the Iterator code
4347         replacement. 
4348
4349         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4350         Property and Operator classes are not created when we parse the
4351         declarator but until we have the block completed, so we use a
4352         singleton SimpleIteratorContainer.Simple to flag whether the
4353         SetYields has been invoked.
4354
4355         We propagate this setting then to the Property or the Operator to
4356         allow the `yield' to function.
4357
4358 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4359
4360         * codegen.cs: Implemented attribute support for modules.
4361         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4362         Assembly/Module functionality.
4363
4364         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4365         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4366         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4367
4368 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4369
4370         * interface.cs (FindMembers): The operation is performed on all base
4371         interfaces and not only on the first. It is required for future CLS Compliance patch.
4372
4373 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4374
4375         * statement.cs, codegen.cs:
4376         This patch deals with patterns such as:
4377
4378         public class List : IEnumerable {
4379
4380                 public MyEnumerator GetEnumerator () {
4381                         return new MyEnumerator(this);
4382                 }
4383
4384                 IEnumerator IEnumerable.GetEnumerator () {
4385                         ...
4386                 }
4387                 
4388                 public struct MyEnumerator : IEnumerator {
4389                         ...
4390                 }
4391         }
4392
4393         Before, there were a few things we did wrong:
4394         1) we would emit callvirt on a struct, which is illegal
4395         2) we emited ldarg when we needed to emit ldarga
4396         3) we would mistakenly call the interface methods on an enumerator
4397         type that derived from IEnumerator and was in another assembly. For example:
4398
4399         public class MyEnumerator : IEnumerator
4400
4401         Would have the interface methods called, even if there were public impls of the
4402         method. In a struct, this lead to invalid IL code.
4403
4404 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4405
4406         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4407           renamed to Emit.
4408
4409         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4410
4411 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4412
4413         * cs-parser.jay: Fix small regression: we were not testing V2
4414         compiler features correctly.
4415
4416         * interface.cs: If the emit context is null, then create one
4417
4418 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4419
4420         * decl.cs (GetSignatureForError): New virtual method to get full name
4421           for error messages.
4422
4423         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4424           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4425
4426         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4427           Duplicated members and code in these classes has been removed.
4428           Better encapsulation in these classes.
4429
4430 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4431
4432         * assign.cs (Assign.DoResolve): When dealing with compound
4433         assignments, there is a new rule in ECMA C# 2.4 (might have been
4434         there before, but it is documented here) that states that in:
4435
4436         a op= b;
4437
4438         If b is of type int, and the `op' is a shift-operator, then the
4439         above is evaluated as:
4440
4441         a = (int) a op b 
4442
4443         * expression.cs (Binary.ResolveOperator): Instead of testing for
4444         int/uint/long/ulong, try to implicitly convert to any of those
4445         types and use that in pointer arithmetic.
4446
4447         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4448         method to print information for from the type, not from the
4449         null-method we were given.
4450
4451 2004-02-01  Duncan Mak  <duncan@ximian.com>
4452
4453         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4454         parsing for cmd, fixes bug #53694.
4455
4456 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4457
4458         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4459         in the member name duplication tests. Property and operator name duplication
4460         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4461
4462 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4463
4464         * interface.cs (PopulateMethod): Fixed crash when interface method
4465         returns not existing type (error test cs0246-3.cs).
4466
4467 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4468
4469         * cs-parser.jay (interface_accessors): Re-write actions to also
4470         store attributes attached to get and set methods. Fix spelling
4471         while at it.
4472
4473         (inteface_property_declaration): Modify accordingly.
4474
4475         (InterfaceAccessorInfo): New helper class to store information to pass
4476         around between rules that use interface_accessors.
4477
4478         * interface.cs (Emit): Apply attributes on the get and set
4479         accessors of properties and indexers too.
4480
4481         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4482         right MethodBuilder when applying attributes to the get and set accessors.
4483
4484 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4485
4486         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4487
4488 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4489
4490         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4491
4492 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4493
4494         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4495         changes that treat `yield' specially when present before `break'
4496         or `return' tokens.
4497
4498         * cs-tokenizer.cs: yield is no longer a keyword.
4499
4500 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4501
4502         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4503         setting for default constructors.
4504         For default constructors are almost every time set wrong Modifier. The
4505         generated IL code has been alright. But inside mcs this values was
4506         wrong and this was reason why several of my CLS Compliance tests
4507         failed.
4508
4509 2004-01-22  Martin Baulig  <martin@ximian.com>
4510
4511         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4512         not a QualifiedIdentifier.  This is what `type_name_expression'
4513         was previously doing.
4514         (type_name_expression): Removed; the code is now in
4515         `namespace_or_type_name'.
4516         (qualified_identifier): Removed, use `namespace_or_type_name'
4517         instead.
4518         (QualifiedIdentifier): Removed this class.      
4519
4520 2004-01-22  Martin Baulig  <martin@ximian.com>
4521
4522         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4523         not a string as alias name.
4524
4525 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4526
4527         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4528         #52730 bug, and instead compute correctly the need to use a
4529         temporary variable when requesting an address based on the
4530         static/instace modified of the field and the constructor.
4531  
4532 2004-01-21  Martin Baulig  <martin@ximian.com>
4533
4534         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4535         class and namespace before looking up aliases.  Fixes #52517.
4536
4537 2004-01-21  Martin Baulig  <martin@ximian.com>
4538
4539         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4540         assinged in a 'try'; fixes exception4.cs.
4541
4542 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4543         * class.cs : Implemented parameter-less constructor for TypeContainer
4544
4545         * decl.cs: Attributes are now stored here. New property OptAttributes
4546
4547         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4548
4549         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4550
4551 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4552
4553         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4554           (CSharpSignature): New method for indexer and property signature.
4555
4556 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4557
4558         * pending.cs (IsVirtualFilter): Faster implementation.
4559
4560 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4561
4562         * typemanager.cs: Avoid inclusion of same assembly more than once.
4563
4564 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4565
4566         * cs-parser.jay: Fixed problem where the last assembly attribute
4567           has been applied also to following declaration (class, struct, etc.)
4568           
4569 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4570
4571         * class.cs: Added error CS0538, CS0539 reporting.
4572         Fixed crash on Microsoft runtime when field type is void.
4573
4574         * cs-parser.jay: Added error CS0537 reporting.
4575
4576         * pending.cs: Added error CS0535 reporting.
4577         Improved error report for errors CS0536, CS0534.
4578
4579 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4580
4581         Merge a few bits from the Anonymous Method MCS tree.
4582
4583         * statement.cs (ToplevelBlock): New class for toplevel methods,
4584         will hold anonymous methods, lifted variables.
4585
4586         * cs-parser.jay: Create toplevel blocks for delegates and for
4587         regular blocks of code. 
4588
4589 2004-01-20  Martin Baulig  <martin@ximian.com>
4590
4591         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4592         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4593         and `NeedExplicitReturn'; added `IsLastStatement'.
4594         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4595         have a `ReturnLabel' or we're not unreachable.
4596
4597         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4598         child's reachability; don't just override ours with it.  Fixes
4599         #58058 (lluis's example).
4600         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4601         InFinally(), InLoop(), InSwitch() and
4602         BreakCrossesTryCatchBoundary() methods.
4603
4604         * statement.cs (Return): Do all error checking in Resolve().
4605         Unless we are the last statement in a top-level block, always
4606         create a return label and jump to it.
4607         (Break, Continue): Do all error checking in Resolve(); also make
4608         sure we aren't leaving a `finally'.
4609         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4610         statement in a top-level block.
4611         (Block.Flags): Added `IsDestructor'.
4612         (Block.IsDestructor): New public property.
4613
4614 2004-01-20  Martin Baulig  <martin@ximian.com>
4615
4616         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4617
4618 2004-01-20  Martin Baulig  <martin@ximian.com>
4619
4620         * statement.cs (Statement.ResolveUnreachable): New public method.
4621         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4622         (Block.Resolve): Resolve unreachable statements.
4623
4624 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4625
4626         * expression.cs: We need to fix the case where we do
4627         not have a temp variable here.
4628
4629         * assign.cs: Only expression compound assignments need
4630         temporary variables.
4631
4632 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4633
4634         * flowanalysis.cs: Reduce memory allocation in a few ways:
4635           - A block with no variables should not allocate a bit
4636             vector for itself.
4637           - A method with no out parameters does not need any tracking
4638             for assignment of the parameters, so we need not allocate
4639             any data for it.
4640           - The arrays:
4641                 public readonly Type[] VariableTypes;
4642                 public readonly string[] VariableNames;
4643             Are redundant. The data is already stored in the variable
4644             map, so we need not allocate another array for it.
4645           - We need to add alot of checks for if (params | locals) == null
4646             due to the first two changes.
4647
4648 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4649
4650         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4651         implement IMemoryLocation, we store a copy on a local variable and
4652         take the address of it.  Patch from Benjamin Jemlich
4653
4654         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4655         to use a special "type_name_expression" rule which reduces the
4656         number of "QualifiedIdentifier" classes created, and instead
4657         directly creates MemberAccess expressions.
4658
4659 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4660
4661         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4662         that fixes #52853.  Null literal assignment to ValueType
4663
4664         * class.cs (MethodData.Emit): Instead of checking the name of the
4665         method to determine if its a destructor, create a new derived
4666         class from Method called Destructor, and test for that.  
4667
4668         * cs-parser.jay: Create a Destructor object instead of a Method.  
4669
4670         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4671
4672         Fixes: 52933
4673
4674 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4675
4676         * expression.cs (Binary.ResolveOperator): Perform an implicit
4677         conversion from MethodGroups to their delegate types on the
4678         Addition operation.
4679
4680         * delegate.cs: Introduce a new class DelegateCreation that is the
4681         base class for `NewDelegate' and `ImplicitDelegateCreation',
4682         factor some code in here.
4683
4684         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4685         conversion from MethodGroups to compatible delegate types. 
4686
4687         * ecore.cs (Expression.Resolve): Do not flag error 654
4688         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4689         we allow conversions from MethodGroups to delegate types now.
4690
4691         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4692         assignments in v2 either.
4693
4694 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4695
4696         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4697         static read-only fields in ctors.
4698
4699         Applied patch from Benjamin Jemlich 
4700
4701         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4702
4703 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4704
4705         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4706         here to return true, as they can be used like this:
4707
4708                 (XXX) int.MEMBER ()
4709
4710         Fixed 49836 and all the other dups
4711
4712 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4713
4714         * driver.cs: Implement /win32res and /win32icon.
4715
4716 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4717
4718         * cs-parser.jay: Add a rule to improve error handling for the
4719         common mistake of placing modifiers after the type.
4720
4721 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4722
4723         * cs-parser.jay (interface_event_declaration): Catch
4724         initialization of events on interfaces, and report cs0068
4725
4726         * cs-parser.jay (interface_event_declaration): Catch
4727         initialization of events. 
4728
4729         * ecore.cs: Better report missing constructors.
4730
4731         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4732         the error reporting done in the wrong place.  Fix.
4733
4734         * expression.cs (Binary.ResolveOperator): Catch the 
4735         operator + (E x, E y) error earlier, and later allow for implicit
4736         conversions in operator +/- (E e, U x) from U to the underlying
4737         type of E.
4738
4739         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4740         52596, if the container class is abstract, the default constructor
4741         is protected otherwise its public (before, we were always public).
4742
4743         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4744         fixed statement.
4745
4746         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4747         Jemlich that fixes bug #52597, MCS was generating invalid code for
4748         idisposable structs.   Thanks to Ben for following up with this
4749         bug as well.
4750
4751 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4752
4753         * driver.cs: Allow assemblies without code to be generated, fixes
4754         52230.
4755
4756 2004-01-07  Nick Drochak <ndrochak@gol.com>
4757
4758         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4759
4760 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4761
4762         * cs-parser.jay: Add rules to improve error reporting if fields or
4763         methods are declared at the namespace level (error 116)
4764
4765         * Add rules to catch event add/remove
4766
4767 2004-01-04  David Sheldon <dave-mono@earth.li>
4768
4769   * expression.cs: Added matching ")" to error message for 
4770   CS0077
4771
4772 2004-01-03 Todd Berman <tberman@gentoo.org>
4773
4774         * ecore.cs, attribute.cs:
4775         Applying fix from #52429.
4776
4777 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4778
4779         * ecore.cs, expression.cs, statement.cs:
4780         Total rewrite of how we handle branching. We
4781         now handle complex boolean expressions with fewer
4782         jumps. As well if (x == 0) no longer emits a ceq.
4783
4784         if (x is Foo) is much faster now, because we generate
4785         better code.
4786
4787         Overall, we get a pretty big improvement on our benchmark
4788         tests. The code we generate is smaller and more readable.
4789
4790         I did a full two-stage bootstrap. The patch was reviewed
4791         by Martin and Miguel.
4792
4793 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4794
4795         * cs-parser.jay: Make primary_expression not take a QI.
4796         we dont need this because the member_access rule covers
4797         us here. So we replace the rule with just IDENTIFIER.
4798
4799         This has two good effects. First, we remove a s/r conflict.
4800         Second, we allocate many fewer QualifiedIdentifier objects.
4801
4802 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4803
4804         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4805         set the correct information via SRE. This prevents
4806         hanging on the MS runtime. Fixes #29374.
4807
4808 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4809
4810         * convert.cs: correctly handle conversions to value types
4811         from Enum and ValueType as unboxing conversions.
4812
4813         Fixes bug #52569. Patch by Benjamin Jemlich.
4814
4815 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4816
4817         * expression.cs (BetterConversion): Prefer int -> uint
4818         over int -> ulong (csc's behaviour). This fixed bug #52046.
4819
4820 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4821
4822         * decl.cs (MemberCache.FindMembers): now returns a
4823         MemberInfo [].
4824
4825         * typemanager.cs: In general, go with with ^^.
4826         (CopyNewMethods): take an IList.
4827         (RealMemberLookup): Only allocate an arraylist
4828         if we copy from two sets of methods.
4829
4830         This change basically does two things:
4831         1) Fewer array lists allocated due to CopyNewMethods.
4832         2) the explicit cast in MemberList costed ALOT.
4833
4834 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4835
4836         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4837         a hashtable to avoid needless string allocations when an identifier is
4838         used more than once (the common case).
4839
4840 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4841
4842         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4843         is broken, it will not return anything. So, we
4844         have to use the information we have in mcs to
4845         do the task.
4846
4847         * typemanager.cs: Add a cache for GetInterfaces,
4848         since this will now be used more often (due to ^^)
4849
4850         (GetExplicitInterfaces) New method that gets the
4851         declared, not effective, interfaces on a type
4852         builder (eg, if you have interface IFoo, interface
4853         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4854         { IBar }.
4855
4856         This patch makes MCS able to bootstrap itself on
4857         Windows again.
4858
4859 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4860
4861         * expression.cs: Remove the Nop's that Miguel put
4862         in by mistake.
4863
4864 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4865
4866         * report.cs, codegen.cs: Give the real stack trace to
4867         the error when an exception is thrown.
4868
4869 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4870
4871         * decl.cs: only allocate hashtables for ifaces if 
4872         it is an iface!
4873
4874 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4875
4876         * expression.cs: fix the error from cs0121-2.cs
4877         (a parent interface has two child interfaces that
4878         have a function with the same name and 0 params
4879         and the function is called through the parent).
4880
4881 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4882
4883         * class.cs, rootcontext.cs, typmanager.cs: do not
4884         leak pointers.
4885
4886 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4887
4888         * codegen.cs: remove stack for the ec flow branching.
4889         It is already a linked list, so no need.
4890
4891 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4892
4893         * Makefile: Allow custom profiler here.
4894
4895 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4896
4897         * typemanager.cs (LookupType):
4898           - Use a static char [], because split takes
4899             a param array for args, so it was allocating
4900             every time.
4901           - Do not store true in a hashtable, it boxes.
4902
4903 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4904
4905         * flowanalysis.cs: bytify common enums.
4906
4907 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4908
4909         * modifiers.cs: Add a new set of flags for the
4910         flags allowed on explicit interface impls.
4911         * cs-parser.jay: catch the use of modifiers in
4912         interfaces correctly.
4913         * class.cs: catch private void IFoo.Blah ().
4914
4915         All related to bug #50572.
4916
4917 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4918
4919         * decl.cs: Rewrite the consistant accessability checking.
4920         Accessability is not linear, it must be implemented in
4921         a tableish way. Fixes #49704.
4922
4923 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4924
4925         * expression.cs: Handle negation in a checked context.
4926         We must use subtraction from zero. Fixes #38674.
4927
4928 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4929
4930         * class.cs: Ignore static void main in DLLs.
4931         * rootcontext.cs: Handle the target type here,
4932         since we are have to access it from class.cs
4933         * driver.cs: account for the above.
4934
4935 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4936
4937         * report.cs: Give line numbers and files if available.
4938
4939 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4940
4941         * driver.cs: Implement /addmodule.
4942
4943         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4944         ModuleBuilders.
4945
4946 2003-12-20  Martin Baulig  <martin@ximian.com>
4947
4948         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4949         (FieldBase.IsAssigned): Removed this field.
4950         (FieldBase.SetAssigned): New public method.
4951         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4952
4953 2003-12-20  Martin Baulig  <martin@ximian.com>
4954
4955         * expression.cs (LocalVariableReference.DoResolve): Don't set
4956         `vi.Used' if we're called from DoResolveLValue().
4957
4958         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4959         returns the usage vector it just merged into the current one -
4960         pass this one to UsageWarning().
4961         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4962         of the `EmitContext', don't call this recursively on our children.
4963
4964 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4965
4966         * driver.cs: Implement /target:module.
4967
4968 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4969
4970         * support.cs (CharArrayHashtable): New helper class.
4971
4972         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4973         char arrays, not strings, so we can avoid creating a string in
4974         consume_identifier if the identifier is a keyword.
4975
4976 2003-12-16  Martin Baulig  <martin@ximian.com>
4977
4978         * statement.cs (LocalInfo.Assigned): Removed this property.
4979         (LocalInfo.Flags): Removed `Assigned'.
4980         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4981         and uses flow analysis.
4982         (Block.UsageWarning): Made this method private.
4983         (Block.Resolve): Call UsageWarning() if appropriate.
4984
4985         * expression.cs (LocalVariableReference.DoResolve): Always set
4986         LocalInfo.Used here.
4987
4988 2003-12-13  Martin Baulig  <martin@ximian.com>
4989
4990         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4991         any value here; we're now using flow analysis to figure out
4992         whether a statement/block returns a value.
4993
4994 2003-12-13  Martin Baulig  <martin@ximian.com>
4995
4996         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4997         working again.
4998         (FlowBranching.MergeFinally): Don't call
4999         `branching.CheckOutParameters()' here, this is called in
5000         MergeTopBlock().
5001         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5002         when adding the `finally' vector.       
5003
5004 2003-12-13  Martin Baulig  <martin@ximian.com>
5005
5006         * flowanalysis.cs
5007         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5008         actually work and also fix #48962.
5009
5010 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5011
5012         * decl.cs: Do not check System.Object for nested types,
5013         since we know it does not have any. Big bang for buck:
5014
5015         BEFORE:
5016            Run 1:   8.35 seconds
5017            Run 2:   8.32 seconds
5018            corlib:  17.99 seconds
5019         AFTER:
5020            Run 1:   8.17 seconds
5021            Run 2:   8.17 seconds
5022            corlib:  17.39 seconds
5023
5024 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5025
5026         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5027         time we are returning 0 members, so we save alot here.
5028
5029 2003-12-11  Martin Baulig  <martin@ximian.com>
5030
5031         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5032         `MergeChild()', also just take the `FlowBranching' as argument;
5033         call Merge() on it and return the result.
5034         (FlowBranching.Merge): We don't need to do anything if we just
5035         have one sibling.
5036
5037 2003-12-11  Martin Baulig  <martin@ximian.com>
5038
5039         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5040         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5041         Maurer for this idea.
5042
5043 2003-12-11  Martin Baulig  <martin@ximian.com>
5044
5045         * flowanalysis.cs (MergeResult): This class is now gone; we now
5046         use the `UsageVector' for this.  The reason for this is that if a
5047         branching just has one sibling, we don't need to "merge" them at
5048         all - that's the next step to do.
5049         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5050         `MergeResult'.
5051
5052 2003-12-11  Martin Baulig  <martin@ximian.com>
5053
5054         Reworked flow analyis and made it more precise and bug-free.  The
5055         most important change is that we're now using a special `Reachability'
5056         class instead of having "magic" meanings of `FlowReturns'.  I'll
5057         do some more cleanups and optimizations and also add some more
5058         documentation this week.
5059
5060         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5061         largely reworked this class.
5062         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5063         the new `Reachability' class instead of having "magic" values here.
5064         (FlowBranching): We're now using an instance of `Reachability'
5065         instead of having separate `Returns', `Breaks' etc. fields.
5066
5067         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5068         based on flow analysis; ignore the return value of block.Emit ().
5069
5070 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5071
5072         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5073         if they are private.
5074
5075 2003-12-09  Martin Baulig  <martin@ximian.com>
5076
5077         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5078         call them directly on the UsageVector.
5079
5080 2003-12-09  Martin Baulig  <martin@ximian.com>
5081
5082         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5083         Changed return type from `FlowReturns' to `Reachability'.
5084
5085 2003-12-09  Martin Baulig  <martin@ximian.com>
5086
5087         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5088         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5089         `Reachable' fields with a single `Reachability' one.
5090
5091 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5092
5093         * class.cs (FindMembers): Remove foreach's.
5094
5095         Bootstrap times:
5096
5097         BEFORE
5098                 Run 1:   8.74 seconds
5099                 Run 2:   8.71 seconds
5100
5101         AFTER
5102                 Run 1:   8.64 seconds
5103                 Run 2:   8.58 seconds
5104
5105
5106 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5107
5108         * cs-parser.jay:
5109         * gen-treedump.cs:
5110         * statement.cs:
5111         This patch does a few things:
5112                 1. EmptyStatement is now a singleton, so it is never reallocated.
5113                 2. All blah is EmptyStatement constructs have been changed to
5114                    blah == EmptyStatement.Value, which is much faster and valid
5115                    now that EmptyStatement is a singleton.
5116                 3. When resolving a block, rather than allocating a new array for
5117                    the non-empty statements, empty statements are replaced with
5118                    EmptyStatement.Value
5119                 4. Some recursive functions have been made non-recursive.
5120         Mainly the performance impact is from (3), however (1) and (2) are needed for
5121         this to work. (4) does not make a big difference in normal situations, however
5122         it makes the profile look saner.
5123
5124         Bootstrap times:
5125
5126         BEFORE
5127         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5128         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5129         Total memory allocated: 56397 KB
5130
5131         AFTER
5132         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5133         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5134         Total memory allocated: 55666 KB
5135
5136 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5137
5138         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5139         than the hashtable in a hashtable version
5140
5141         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5142         we always end up concating a string. This results in a huge perf
5143         loss, because many strings have to be tracked by the GC. In this
5144         patch, we first use a hashtable that works with two keys, so that
5145         the strings do not need to be concat'ed.
5146
5147         Bootstrap times:
5148         BEFORE
5149                 Run 1:   8.74 seconds
5150                 Run 2:   8.71 seconds
5151
5152         AFTER
5153                 Run 1:   8.65 seconds
5154                 Run 2:   8.56 seconds
5155
5156 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5157
5158         * Makefile: Add a new target `do-time' that does a quick and simple
5159         profile, leaving easy to parse output.
5160
5161 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5162
5163         * codegen.cs (Init): Create the dynamic assembly with 
5164         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5165
5166 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5167
5168         * support.cs: Make the PtrHashtable use only one
5169         instance of its comparer.
5170
5171 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5172
5173         * typemanager.cs: Fix lookup of GetNamespaces.
5174
5175 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5176
5177         * expression.cs: Removed redundant line.
5178
5179         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5180         ArrayLists, use for loops with bounds.  
5181
5182         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5183         arraylist.
5184
5185         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5186         arraylists, use for loop with bounds.
5187
5188         The above three changes give us a 0.071 second performance
5189         improvement out of 3.294 seconds down to 3.223.  On my machine
5190         the above changes reduced the memory usage by 1,387 KB during
5191         compiler bootstrap.
5192
5193         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5194         QualifiedIdentifiers.  Before we created a new string through
5195         concatenation, and mostly later on, the result would be
5196         manipulated by DecomposeQI through string manipulation.
5197
5198         This reduced the compiler memory usage for bootstrapping from
5199         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5200         compile times in 0.05 seconds.
5201
5202 2003-11-28  Dick Porter  <dick@ximian.com>
5203
5204         * support.cs: Do string compares with the Invariant culture.
5205
5206         * rootcontext.cs: 
5207         * gen-treedump.cs: 
5208         * expression.cs: 
5209         * driver.cs: 
5210         * decl.cs: 
5211         * codegen.cs: 
5212         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5213         the comparison is done with the Invariant culture.
5214
5215 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5216
5217         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5218         GetEnumerator method.
5219
5220         (ProbeCollectionType): Iterate starting at the most specific type
5221         upwards looking for a GetEnumerator
5222
5223         * expression.cs: Shift count can be up to 31 for int/uint and 63
5224         for long/ulong.
5225
5226 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5227
5228         * statement.cs (Block.LookupLabel): Also look for the label on the
5229         children blocks.  Use a hash table to keep track of visited
5230         nodes. 
5231
5232         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5233         we actually did transform the other operand, otherwise fall back
5234         to the common codepath that casts to long.
5235
5236         * cs-tokenizer.cs: Use the same code pattern as the int case.
5237         Maybe I should do the parsing myself, and avoid depending on the
5238         Parse routines to get this done.
5239
5240 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5241
5242         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5243         which fixes bug 51347.  This time test it.
5244
5245         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5246         attributes for example can not tell the difference between these.
5247         The difference was only a syntax feature of the language. 
5248
5249         * attribute.cs: Apply attributes to delegates.
5250
5251         * delegate.cs: Call the apply attributes method.
5252
5253 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5254
5255         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5256         comparing 0 vs Byte.MinValue, not the value
5257
5258         (ImplicitConversionRequired): When reporting a conversion error,
5259         use error 31 to print out the constant error instead of the
5260         simpler 29.
5261
5262         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5263         which fixes bug 51347.
5264
5265 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5266
5267         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5268         which fixes the -warnaserror command line option.
5269
5270 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5271
5272         * cfold.cs (DoNumericPromotions): During constant folding of
5273         additions on UIntConstant, special case intconstants with
5274         IntConstants like we do on the expression binary operator. 
5275
5276 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5277
5278         * convert.cs (ImplicitReferenceConversion): We were missing a case
5279         (System.Enum are not value types or class types, so we need to
5280         classify them separatedly).
5281
5282         * driver.cs: We do not support error 2007.
5283
5284 2003-11-12 Jackson Harper <jackson@ximian.com>
5285
5286         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5287         system directory. Also use the full file name so users can
5288         libraries names mscorlib-o-tron.dll in a non system dir.
5289
5290 2003-11-10  Martin Baulig  <martin@ximian.com>
5291
5292         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5293         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5294         calling `ResolveType()' on them, directly assign their `Type'.
5295
5296 2003-11-08  Martin Baulig  <martin@ximian.com>
5297
5298         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5299         return value and the `out parent' parameter.
5300         (TypeContainer.DefineType): Moved the CS0644 check into
5301         GetClassBases().  Don't pass the interface types to the
5302         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5303         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5304
5305         * ecore.cs (TypeExpr.IsAttribute): New property.
5306         (TypeExpr.GetInterfaces): New method.
5307
5308         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5309         TypeExpr instead of a Type.
5310         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5311         (Interface.DefineType): Don't pass the interface types to the
5312         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5313         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5314
5315         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5316         instead of a `Type[]'.
5317         (TypeManager.RegisterBuilder): Likewise.
5318         (TypeManager.AddUserInterface): Likewise.
5319         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5320         `Type[]' and also return a `TypeExpr[]'.
5321         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5322
5323 2003-11-08  Martin Baulig  <martin@ximian.com>
5324
5325         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5326         Expression.     
5327
5328 2003-11-08  Martin Baulig  <martin@ximian.com>
5329
5330         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5331         TypeManager.ResolveExpressionTypes().
5332
5333         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5334         instead of an Expression.
5335         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5336         (TypeExpression): New public class; formerly known as `TypeExpr'.
5337
5338         * expression.cs (ComposedCast): Derive from TypeExpr.
5339
5340         * typemanager.cs (TypeManager.system_*_expr): These are now
5341         TypExpr's instead of Expression's.
5342         (TypeManager.ResolveExpressionTypes): New public static function;
5343         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5344         of them.        
5345
5346 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5347
5348         * expression.cs (New.DoResolve): Do not dereference value that
5349         might be a null return.
5350
5351         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5352         sure that the constant value has the right type.  Fixes an
5353         unreported bug, similar to 50425.
5354
5355         * const.cs (Const.LookupConstantValue): Call
5356         ImplicitStandardConversionExists before doing a conversion to
5357         avoid havng the TypeManager.ChangeType do conversions.
5358
5359         Reduced the number of casts used
5360
5361         (Const.ChangeType): New routine to enable reuse of the constant
5362         type changing code from statement.
5363
5364         * typemanager.cs (ChangeType): Move common initialization to
5365         static global variables.
5366
5367         Fixes #50425.
5368
5369         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5370         every value type to go through, even if it was void.  Fix that. 
5371
5372         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5373         character of the define, and the is_identifier_part_character for
5374         the rest of the string.
5375
5376 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5377
5378         * expression.cs (UnaryMutator.EmitCode): When I updated
5379         LocalVariableReference.DoResolve, I overdid it, and dropped an
5380         optimization done on local variable references.
5381
5382 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5383
5384         * ecore.cs: Convert the return from Ldlen into an int.
5385
5386 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5387
5388         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5389         the accessibility, this is a special case for toplevel non-public
5390         classes (internal for instance).
5391
5392 2003-10-20  Nick Drochak <ndrochak@gol.com>
5393
5394         * ecore.cs: Fix typo and build.  Needed another right paren.
5395
5396 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5397
5398         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5399         `internal' case regular and protected, but not allowing protected
5400         to be evaluated later.  Bug 49840
5401
5402 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5403
5404         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5405         to kb.Nlast, and not the kb.nFirst to isolate the switch
5406         statement.
5407
5408         Extract the underlying type, so enumerations of long/ulong are
5409         treated like long/ulong.
5410
5411 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5412
5413         * expression.cs (New): Overload the meaning of RequestedType to
5414         track the possible creation of the NewDelegate type, since
5415         DoResolve is invoked more than once for new constructors on field
5416         initialization.
5417
5418         See bugs: #48800 and #37014
5419
5420         * cs-parser.jay (declare_local_constants): Take an arraylist
5421         instead of a single constant.
5422
5423         (local_constant_declaration): It should take a
5424         constant_declarators, not a constant_declarator.  Fixes 49487
5425
5426         * convert.cs: Fix error report.
5427
5428 2003-10-13 Jackson Harper <jackson@ximian.com>
5429
5430         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5431         bug #49611
5432
5433 2003-10-09  Martin Baulig  <martin@ximian.com>
5434
5435         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5436         to the .ctor.
5437         (MethodCore.DoDefineParameters): Removed the TypeContainer
5438         argument; use the DeclSpace which was passed to the .ctor instead.
5439         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5440         TypeContainer; we only need a DeclSpace here.
5441
5442 2003-10-09  Martin Baulig  <martin@ximian.com>
5443
5444         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5445         to the .ctor.
5446         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5447         EmitContext's .ctor.    
5448
5449 2003-10-09  Martin Baulig  <martin@ximian.com>
5450
5451         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5452         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5453         AsAccessible(), moved them as well.
5454
5455         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5456
5457 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5458
5459         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5460
5461 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5462
5463         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5464         generation for >=, as spotted by Paolo, bug 48679.  
5465         Patch from David Waite.
5466
5467         * cs-tokenizer.cs: Add handling for #pragma.
5468
5469         * cs-parser.jay: Allow for both yield and yield return in the
5470         syntax.  The anti-cobolization of C# fight will go on!
5471
5472         * class.cs (TypeBuilder.DefineType): Catch error condition here
5473         (Parent.DefineType erroring out and returning null).
5474
5475         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5476         coping with enumerations variables, we were mistakenly processing
5477         them as a regular value type instead of built-in types.  Fixes the
5478         bug #48063
5479
5480         * typemanager.cs (IsBuiltinOrEnum): New method.
5481
5482 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5483
5484         * cs-parser.jay: Upgrade: yield now needs the return clause.
5485
5486 2003-09-19  Martin Baulig  <martin@ximian.com>
5487
5488         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5489         `MemberCache parent' argument.  Normally, an interface doesn't
5490         have a parent type except System.Object, but we use this in gmcs
5491         for generic type parameters.
5492
5493 2003-09-18  Martin Baulig  <martin@ximian.com>
5494
5495         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5496         on `type.IsInterface'; don't check whether the type has a parent
5497         to determine whether it's an interface.
5498
5499 2003-09-15  Martin Baulig  <martin@ximian.com>
5500
5501         * class.cs (TypeContainer.DefineType): Added an error flag to
5502         avoid reporting duplicate CS0146's ("class definition is
5503         circular.").
5504
5505         * driver.cs (Driver.MainDriver): Abort if
5506         RootContext.ResolveTree() reported any errors.
5507
5508 2003-09-07  Martin Baulig  <martin@ximian.com>
5509
5510         * report.cs (Error, Warning): Added overloaded versions which take
5511         a `params object[] args' and call String.Format().
5512
5513 2003-09-07  Martin Baulig  <martin@ximian.com>
5514
5515         * decl.cs (DeclSpace..ctor): Don't call
5516         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5517         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5518         (DeclSpace.RecordDecl): New method.
5519
5520         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5521
5522 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5523
5524         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5525         value attributes to be applied to ParameterBuilders.
5526
5527         * class.cs (MethodCore.LabelParameters): Make static and more
5528         generic so that it can be used from other places - like interface
5529         methods, for instance.
5530
5531         * interface.cs (Interface.Emit): Call LabelParameters before
5532         emitting attributes on the InterfaceMethod.
5533
5534 2003-08-26  Martin Baulig  <martin@ximian.com>
5535
5536         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5537         resolving aliases; fixes #47927.
5538
5539 2003-08-26  Martin Baulig  <martin@ximian.com>
5540
5541         * statement.cs (Using.DoResolve): This is internally emitting a
5542         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5543         do not always return.  Fixes #47681.
5544
5545 2003-08-26  Martin Baulig  <martin@ximian.com>
5546
5547         * decl.cs (MemberCore): Moved WarningNotHiding(),
5548         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5549         into MemberBase.
5550         (AdditionResult): Make this nested in DeclSpace.
5551         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5552         argument; call NamespaceEntry.Define() unless we're nested in a
5553         class or struct.
5554
5555         * namespace.cs (Namespace.DefineName): New public function.  This
5556         is called from DeclSpace's .ctor to add 
5557         (Namespace.Lookup): Include DeclSpaces in the lookup.
5558
5559         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5560
5561         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5562
5563 2003-08-25  Martin Baulig  <martin@ximian.com>
5564
5565         * convert.cs (Convert.ExplicitReferenceConversion): When
5566         converting from an interface type to a class, unbox if the target
5567         type is a struct type.  Fixes #47822.
5568
5569 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5570
5571         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5572         #47854.
5573
5574 2003-08-22  Martin Baulig  <martin@ximian.com>
5575
5576         * class.cs (TypeManager.DefineType): When defining a nested type,
5577         call DefineType() on our parent; fixes #47801.
5578
5579 2003-08-22  Martin Baulig  <martin@ximian.com>
5580
5581         * class.cs (MethodData.Define): While checking if a method is an
5582         interface implementation, improve the test a bit more to fix #47654.
5583
5584 2003-08-22  Martin Baulig  <martin@ximian.com>
5585
5586         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5587         correctly; fixes #47722.
5588
5589 2003-08-22  Martin Baulig  <martin@ximian.com>
5590
5591         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5592         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5593
5594         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5595
5596 2003-08-22  Martin Baulig  <martin@ximian.com>
5597
5598         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5599         can only be assigned in static constructors.  Fixes #47161.
5600
5601 2003-08-22  Martin Baulig  <martin@ximian.com>
5602
5603         Rewrote and improved the flow analysis code.
5604
5605         * flowbranching.cs (FlowBranching): Make this class abstract.
5606         (FlowBranching.CreateBranching): New static function to create a
5607         new flow branching.
5608         (FlowBranchingBlock, FlowBranchingException): New classes.
5609         (FlowBranching.UsageVector.Type): New public readonly field.
5610         (FlowBranching.UsageVector.Breaks): Removed the setter.
5611         (FlowBranching.UsageVector.Returns): Removed the setter.
5612         (FlowBranching.UsageVector): Added Break(), Return(),
5613         NeverReachable() and Throw() methods to modify the reachability.
5614         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5615         done by FlowBranching.Merge().
5616         (FlowBranching.UsageVector.MergeChild): New method; merges the
5617         merge result into the current vector.
5618         (FlowBranching.Merge): New abstract method to merge a branching.
5619
5620 2003-08-12  Martin Baulig  <martin@ximian.com>
5621
5622         * expression.cs (Indirection.CacheTemporaries): Create the
5623         LocalTemporary with the pointer type, not its element type.
5624
5625 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5626
5627         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5628         token was a keyword or not.
5629
5630         Add `error' options where an IDENTIFIER was expected;  Provide
5631         CheckToken and CheckIdentifierToken convenience error reporting
5632         functions. 
5633
5634         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5635
5636         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5637         NameSpaceEntry NameSpaceEntry.
5638
5639         (LookupInterfaceOrClass): Avoid creating a full qualified name
5640         from namespace and name: avoid doing lookups when we know the
5641         namespace is non-existant.   Use new Tree.LookupByNamespace which
5642         looks up DeclSpaces based on their namespace, name pair.
5643
5644         * driver.cs: Provide a new `parser verbose' to display the
5645         exception thrown during parsing.  This is turned off by default
5646         now, so the output of a failure from mcs is more graceful.
5647
5648         * namespace.cs: Track all the namespaces defined in a hashtable
5649         for quick lookup.
5650
5651         (IsNamespace): New method
5652
5653 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5654
5655         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5656         we know that we need to concatenate (full typename can never be
5657         null). 
5658
5659         * class.cs: ditto.
5660
5661         * statement.cs: Use a bitfield;  Do not initialize to null things
5662         which are done by the constructor by default.
5663
5664         * cs-parser.jay: bug fix, parameter was 4, not 3.
5665
5666         * expression.cs: Just use the property;
5667
5668         * statement.cs: No need for GetVariableInfo method.
5669
5670 2003-08-08  Martin Baulig  <martin@ximian.com>
5671
5672         * flowanalysis.cs (FlowReturns): This is now nested in the
5673         `FlowBranching' class.
5674         (MyBitVector): Moved this here from statement.cs.
5675         (FlowBranching.SiblingType): New enum type.
5676         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5677
5678 2003-08-07  Martin Baulig  <martin@ximian.com>
5679
5680         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5681         `FlowBranching' class and called `BranchingType'.
5682
5683 2003-08-07  Martin Baulig  <martin@ximian.com>
5684
5685         * flowanalysis.cs: Moved all the control flow analysis code into
5686         its own file.
5687
5688 2003-08-07  Martin Baulig  <martin@ximian.com>
5689
5690         * assign.cs (Assign.DoResolve): `target' must either be an
5691         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5692         #37319.
5693
5694 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5695
5696         * expression.cs (BinaryMethod): This kind of expression is created by the
5697         Binary class if it determines that the operator has to be handled
5698         by a method.
5699
5700         (BinaryDelegate): This kind of expression is created if we are
5701         dealing with a + or - operator on delegates.
5702
5703         (Binary): remove method, argumetns, and DelegateOperator: when
5704         dealing with methods, 
5705
5706         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5707
5708         * statement.cs (Block): use bitfields for the three extra booleans
5709         we had in use.   Remove unused topblock parameter.
5710
5711         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5712
5713         * assign.cs: Drop extra unneeded tests.
5714
5715 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5716
5717         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5718
5719         * statement.cs (Foreach): Use VariableStorage instead of
5720         LocalBuilders.   
5721
5722         * codegen.cs (VariableStorage): New class used by clients that
5723         require a variable stored: locals or fields for variables that
5724         need to live across yield.
5725
5726         Maybe provide a convenience api for EmitThis+EmitLoad?
5727
5728         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5729         these bad boys.
5730
5731 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5732
5733         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5734         RemapParameterLValue): New methods that are used to turn a
5735         precomputed FieldInfo into an expression like this:
5736
5737                 instance.FieldInfo
5738
5739         The idea is to use this instead of making LocalVariableReference
5740         have more than one meaning.
5741
5742         * cs-parser.jay: Add error production to BASE.
5743
5744         * ecore.cs: Deal with TypeManager.GetField returning null, which
5745         is now a valid return value.
5746
5747         (FieldExprNoAddress): New expression for Fields whose address can
5748         not be taken.
5749
5750         * expression.cs (LocalVariableReference): During the resolve
5751         phases, create new expressions if we are in a remapping context.
5752         Remove code that dealt with remapping here.
5753
5754         (ParameterReference): same.
5755
5756         (ProxyInstance): New expression, like the `This' expression, but
5757         it is born fully resolved.  We know what we are doing, so remove
5758         the errors that are targeted to user-provided uses of `this'.
5759
5760         * statement.cs (Foreach): our variable is now stored as an
5761         Expression;  During resolution, follow the protocol, dont just
5762         assume it will return this.
5763
5764 2003-08-06  Martin Baulig  <martin@ximian.com>
5765
5766         * support.cs (SeekableStreamReader.cs): New public class.
5767
5768         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5769         SeekableStreamReader instead of the normal StreamReader.
5770
5771 2003-08-04  Martin Baulig  <martin@ximian.com>
5772
5773         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5774         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5775         deambiguate casts and delegate invocations.
5776         (parenthesized_expression): Use the new tokens to ensure this is
5777         not a cast of method invocation.
5778
5779         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5780         when reading a `)' and Deambiguate_CloseParens () was previously
5781         called.
5782
5783         * expression.cs (ParenthesizedExpression): New class.  This is
5784         just used for the CS0075 test.
5785         (Binary.DoResolve): Check for CS0075.   
5786
5787 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5788
5789         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5790         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5791         reference comparison.
5792
5793         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5794         examine the ReturnType for equality - this is necessary in the
5795         cases of implicit and explicit operators whose signature also
5796         includes the return type.
5797
5798 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5799
5800         * namespace.cs: Cache the result of the namespace computation,
5801         instead of computing it every time.
5802
5803 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5804
5805         * decl.cs: Use a global arraylist that we reuse over invocations
5806         to avoid excesive memory consumption.  Reduces memory usage on an
5807         mcs compile by one meg (45 average).
5808
5809         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5810         private, work around that.
5811
5812 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5813
5814         * literal.cs (IntLiteral): Define Zero and One static literals. 
5815
5816         * cs-parser.jay (integer_literal): use static literals to reduce
5817         memory usage for the most used literals (0, 1 and -1).  211kb
5818         reduced in memory usage.
5819
5820         Replace all calls to `new ArrayList' with `new
5821         ArrayList(4)' which is a good average number for most allocations,
5822         and also requires only 16 bytes of memory for its buffer by
5823         default. 
5824
5825         This reduced MCS memory usage in seven megabytes for the RSS after
5826         bootstrapping.
5827
5828 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5829
5830         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5831         handle params methods the correct way by forming only one
5832         applicable set with params and normal methods in them. Earlier we
5833         were looking at params methods only if we found no normal methods
5834         which was not the correct thing to do.
5835
5836         (Invocation.BetterFunction): Take separate arguments indicating
5837         when candidate and the best method are params methods in their
5838         expanded form.
5839
5840         This fixes bugs #43367 and #46199.
5841
5842         * attribute.cs: Documentation updates.
5843
5844         (CheckAttribute): Rename to CheckAttributeTarget.
5845         (GetValidPlaces): Rename to GetValidTargets.
5846
5847         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5848         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5849
5850         Fixes bug #44468.
5851
5852 2003-07-28  Martin Baulig  <martin@ximian.com>
5853
5854         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5855         name when looking up the base class of a nested class.  Fixes #46977.
5856
5857 2003-07-26  Martin Baulig  <martin@ximian.com>
5858
5859         * expression.cs (Indexers.Indexer): New nested struct; contains
5860         getter, setter and the indexer's type.
5861         (Indexers.Properties): This is now an ArrayList of
5862         Indexers.Indexer's.
5863         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5864         indexer doesn't have any getters.
5865
5866         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5867         for embedded property and indexer assignments.
5868
5869 2003-07-26  Martin Baulig  <martin@ximian.com>
5870
5871         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5872         preprocessor directive is not the first non-whitespace character
5873         on a line.
5874
5875 2003-07-26  Martin Baulig  <martin@ximian.com>
5876
5877         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5878         namespace parsing, follow the spec more closely.
5879
5880         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5881         NamespaceEntry.Lookup().
5882
5883 2003-07-25  Martin Baulig  <martin@ximian.com>
5884
5885         * MethodCore.cs (OverridesSomething): New public field; it's set
5886         from TypeContainer.DefineMembers if this method overrides
5887         something (which doesn't need to be a method).  Fix #39462.
5888
5889 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5890
5891         * typemanager.cs (GetMembers): Ensure that the list of members is
5892         reversed. This keeps things in sync.
5893
5894         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5895         find an AttributeUsage attribute.
5896
5897         * expression.cs (Invocation.OverloadResolve): Perform the check
5898         which disallows Invoke to be directly called on a Delegate.
5899
5900         (Error_InvokeOnDelegate): Report error cs1533.
5901
5902 2003-07-25  Martin Baulig  <martin@ximian.com>
5903
5904         * expression.cs (Indexers.GetIndexersForType): Only look in the
5905         interface hierarchy if the requested type is already an
5906         interface.  Fixes #46788 while keeping #46502 fixed.
5907
5908 2003-07-25  Martin Baulig  <martin@ximian.com>
5909
5910         * class.cs (TypeContainer.DefineMembers): Check whether all
5911         readonly fields have been assigned and report warning CS0649 if
5912         not.
5913
5914         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5915         a valuetype.
5916
5917 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5918
5919         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5920         returned from GetMethods to make things consistent with the
5921         assumptions MCS makes about ordering of methods.
5922
5923         This should comprehensively fix bug #45127 and it does :-)
5924
5925         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5926         ordering is actually reverse.
5927
5928         * Clean up some debug messages I left lying around.
5929
5930         * interface.cs (Populate*): Get rid of code which emits attributes
5931         since the stage in which we emit attributes is the 'Emit' stage,
5932         not the define stage.
5933
5934         (Emit): Move attribute emission for interface members here.
5935
5936 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5937
5938         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5939         closely: we eliminate methods in base types when we have an
5940         applicable method in a top-level type.
5941
5942         Please see section 14.5.5.1 for an exact description of what goes
5943         on. 
5944
5945         This fixes bug #45127 and a host of other related to corlib compilation.
5946
5947         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5948         array is the method corresponding to the top-level type (this is
5949         because of the changes made to icall.c) so we change this
5950         accordingly.
5951
5952         (MethodGroupExpr.Name): This too.
5953
5954         * typemanager.cs (GetElementType): New method which does the right
5955         thing when compiling corlib. 
5956
5957         * everywhere: Make use of the above in the relevant places.
5958
5959 2003-07-22  Martin Baulig  <martin@ximian.com>
5960
5961         * cs-parser.jay (invocation_expression): Moved
5962         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5963         `cast_expression', but create a InvocationOrCast which later
5964         resolves to either an Invocation or a Cast.
5965
5966         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5967         method; call this before EmitStatement() to make sure that this
5968         expression can be used as a statement.
5969
5970         * expression.cs (InvocationOrCast): New class; resolves to either
5971         an Invocation or a Cast.
5972
5973         * statement.cs (StatementExpression): Call ResolveStatement() on
5974         the ExpressionStatement before emitting it.
5975
5976 2003-07-21  Martin Baulig  <martin@ximian.com>
5977
5978         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5979         `ref' and `out' attributes match; fixes #46220.
5980         (MemberAccess.ResolveMemberAccess): You can't reference a type
5981         through an expression; fixes #33180.
5982         (Indexers.GetIndexersForType): Don't return the indexers from
5983         interfaces the class implements; fixes #46502.
5984
5985 2003-07-21  Martin Baulig  <martin@ximian.com>
5986
5987         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5988         CS0661 checks; fixes bug #30442.
5989
5990 2003-07-21  Martin Baulig  <martin@ximian.com>
5991
5992         * decl.cs (AdditionResult): Added `Error'.
5993
5994         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5995
5996         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5997         makes cs0031.cs actually work.
5998
5999 2003-07-20  Martin Baulig  <martin@ximian.com>
6000
6001         * namespace.cs: Fixed that bug which caused a crash when compiling
6002         the debugger's GUI.
6003
6004 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6005
6006         * typemanager.cs (LookupTypeReflection): Never expose types which
6007         are NotPublic, NestedPrivate, NestedAssembly, or
6008         NestedFamANDAssem.  We used to return these, and later do a check
6009         that would report a meaningful error, but the problem is that we
6010         would not get the real match, if there was a name override.
6011
6012 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6013
6014         * namespace.cs (Namespace, Name): Do not compute the namespace
6015         name dynamically, compute it in the constructor.  This reduced
6016         memory usage by 1697 KB.
6017
6018         * driver.cs: Use --pause to pause at the end.
6019
6020 2003-07-17  Peter Williams  <peter@newton.cx>
6021
6022         * Makefile: Change the name of the test target so that it doesn't
6023         conflict with the recursive test target.
6024
6025 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6026
6027         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6028         AddressOf): Do not use EmitThis, that was wrong, use the actual
6029         this pointer.
6030
6031 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6032
6033         * class.cs (MethodData.Define): While checking if a method is an
6034         interface implementation, improve the test: If we are not public
6035         (use new test here: use the computed MethodAttributes directly,
6036         instead of the parsed modifier flags) check if the `implementing'
6037         method comes from an interface or not.
6038
6039         * pending.cs (VerifyPendingMethods): Slightly better error
6040         message.
6041
6042         * makefile: add test target that does the mcs bootstrap.
6043
6044 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6045
6046         * interface.cs (Define): Do nothing here since there are no
6047         members to populate etc. Move the attribute emission out of here
6048         since this was just totally the wrong place to put it. Attribute
6049         application happens during the 'Emit' phase, not in the 'Define'
6050         phase.
6051
6052         (Emit): Add this method and move the attribute emission here
6053
6054         * rootcontext.cs (EmitCode): Call the Emit method on interface
6055         types too.
6056
6057 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6058
6059         * expression.cs (OverloadResolve): Report error only if Location
6060         is not 'Null' which means that there was a probe going on.
6061
6062 2003-07-14  Martin Baulig  <martin@ximian.com>
6063
6064         * expression.cs (ConditionalLogicalOperator): New public class to
6065         implement user defined conditional logical operators.
6066         This is section 14.11.2 in the spec and bug #40505.
6067
6068 2003-07-14  Martin Baulig  <martin@ximian.com>
6069
6070         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6071
6072 2003-07-14  Martin Baulig  <martin@ximian.com>
6073
6074         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6075
6076         * ecore.cs (IVariable.VerifyFixed): New interface method.
6077
6078         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6079         operator, check whether the variable is actually fixed.  Fixes bug
6080         #36055.  Set a variable definitely assigned when taking its
6081         address as required by the spec.
6082
6083         * statement.cs (LocalInfo.IsFixed): New field.
6084         (LocalInfo.MakePinned): Set `IsFixed' to true.
6085
6086 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6087
6088         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6089         for .ctors, ensure that we only ask for members declared in the
6090         attribute type (BindingFlags.DeclaredOnly).
6091
6092         Fixes bug #43632.
6093
6094         * expression.cs (Error_WrongNumArguments): Report error 1501
6095         correctly the way CSC does.
6096
6097 2003-07-13  Martin Baulig  <martin@ximian.com>
6098
6099         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6100         lookup on the fully qualified name, to make things like "X.X" work
6101         where "X.X" is a fully qualified type name, but we also have a
6102         namespace "X" in the using list.  Fixes #41975.
6103
6104 2003-07-13  Martin Baulig  <martin@ximian.com>
6105
6106         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6107         function. If we're a CompoundAssign, we need to create an embedded
6108         CompoundAssign, not an embedded Assign.
6109         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6110         Fixes #45854.
6111
6112 2003-07-13  Martin Baulig  <martin@ximian.com>
6113
6114         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6115         work to fix bug #46088.
6116
6117 2003-07-13  Ravi Pratap <ravi@ximian.com>
6118
6119         * class.cs (Operator.Emit): Do not emit attributes here - it is
6120         taken care of by the Method class that we delegate too. This takes
6121         care of bug #45876.
6122
6123 2003-07-10  Martin Baulig  <martin@ximian.com>
6124
6125         * expression.cs (TypeOfVoid): New class.
6126         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6127
6128 2003-07-10  Martin Baulig  <martin@ximian.com>
6129
6130         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6131         bug #35957.
6132
6133 2003-07-10  Martin Baulig  <martin@ximian.com>
6134
6135         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6136         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6137
6138         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6139
6140         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6141
6142 2003-07-10  Martin Baulig  <martin@ximian.com>
6143
6144         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6145         of decimal.  Fixes #42850.
6146
6147         NOTE: I also fixed the created byte blob, but this doesn't work on
6148         the MS runtime and csc never produces any byte blobs for decimal
6149         arrays.
6150
6151 2003-07-10  Martin Baulig  <martin@ximian.com>
6152
6153         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6154         structs; fixes #32068.
6155         (Block.AddChildVariableNames): Fixed #44302.
6156
6157 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6158
6159         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6160
6161 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6162
6163         * attribute.cs: And this test is onger needed.
6164
6165 2003-07-08  Martin Baulig  <martin@ximian.com>
6166
6167         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6168         inaccessible types.  Fixes #36313.
6169
6170         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6171
6172         * namespace.cs (NamespaceEntry): Create implicit entries for all
6173         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6174         implicit entries for N1.N2 and N1.
6175
6176 2003-07-08  Martin Baulig  <martin@ximian.com>
6177
6178         Rewrote the handling of namespaces to fix a lot of the issues
6179         wrt. `using' aliases etc.
6180
6181         * namespace.cs (Namespace): Splitted this class into a
6182         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6183
6184         * typemanager.cs (TypeManager.IsNamespace): Removed.
6185         (TypeManager.ComputeNamespaces): Only compute namespaces from
6186         loaded assemblies here, not the namespaces from the assembly we're
6187         currently compiling.
6188
6189 2003-07-08  Martin Baulig  <martin@ximian.com>
6190
6191         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6192
6193 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6194
6195         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6196         already fixed it.  
6197
6198         I thought about the memory savings here, but LookupTypeReflection
6199         is used under already very constrained scenarios.  Compiling
6200         corlib or mcs only exposes one hit, so it would not really reduce
6201         any memory consumption.
6202
6203 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6204
6205         * typemanager.cs: fixes bug #45889 by only adding public types from
6206         other assemblies to the list of known types.
6207
6208 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6209
6210         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6211         on the type we resolved.
6212
6213 2003-07-05  Martin Baulig  <martin@ximian.com>
6214
6215         * pending.cs (PendingImplementation.ParentImplements): Don't
6216         create the proxy if the parent is abstract.
6217
6218         * class.cs (TypeContainer.DefineIndexers): Process explicit
6219         interface implementations first.  Fixes #37714.
6220
6221 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6222
6223         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6224         defined recursively;  but since we modify the input parameters
6225         (left is set to `this' temporarily), we reset this value if the
6226         left_is_explicit is false, which gives the original semantics to
6227         the code.  
6228
6229         * literal.cs (NullPointer): new class used to represent a null
6230         literal in a pointer context.
6231
6232         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6233         type is a pointer, use a NullPointer object instead of a
6234         NullLiteral.   Closes 43687
6235
6236         (ExplicitConversion): Convert pointer values using
6237         the conv opcode to the proper type.
6238
6239         * ecore.cs (New): change ValueTypeVariable property into a method,
6240         that returns whether the valuetype is suitable for being used.
6241
6242         * expression.cs (Binary.DoNumericPromotions): Only return if we
6243         the int constant was a valid uint, and we can return both left and
6244         right as uints.  If not, we continue processing, to trigger the
6245         type conversion.  This fixes 39018.
6246
6247         * statement.cs (Block.EmitMeta): During constant resolution, set
6248         the CurrentBlock property on the emitcontext, so that we resolve
6249         constants propertly.
6250
6251 2003-07-02  Martin Baulig  <martin@ximian.com>
6252
6253         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6254         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6255
6256         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6257         than emitting it here.
6258
6259         * statement.cs: Fixed some more flow analysis bugs.
6260
6261 2003-07-02  Martin Baulig  <martin@ximian.com>
6262
6263         * class.cs (MethodData.Define): When implementing interface
6264         methods, set Final unless we're Virtual.
6265
6266         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6267         check work for interface methods.
6268
6269 2003-07-01  Martin Baulig  <martin@ximian.com>
6270
6271         * ecore.cs (EmitContext.This): Replaced this property with a
6272         GetThis() method which takes a Location argument.  This ensures
6273         that we get the correct error location for a CS0188.
6274
6275 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6276
6277         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6278         ImplicitStandardConversion.
6279
6280         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6281
6282 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6283
6284         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6285         optimization.
6286
6287 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6288
6289         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6290         constructors.
6291
6292         (MethodData.Define): Turn off initlocals for unsafe methods.
6293
6294 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6295
6296         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6297         complete;  Fixes #37521.
6298
6299         * delegate.cs: Use Modifiers.TypeAttr to compute the
6300         TypeAttributes, instead of rolling our own.  This makes the flags
6301         correct for the delegates.
6302
6303 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6304
6305         * class.cs (Constructor.Define): Set the private flag for static
6306         constructors as well.
6307
6308         * cs-parser.jay (statement_expression): Set the return value to
6309         null, to avoid a crash when we catch an error.
6310
6311 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6312
6313         * cs-parser.jay: Applied patch from Jackson that adds support for
6314         extern and unsafe modifiers to destructor declarations.
6315
6316         * expression.cs: Report error 21 if the user is trying to index a
6317         System.Array.
6318
6319         * driver.cs: Add an error message, suggested by the bug report.
6320
6321         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6322         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6323
6324 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6325
6326         * namespace.cs: Add some information to reduce FAQs.
6327
6328 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6329
6330         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6331         underlying enumeration types.  Fixes #43915.
6332
6333         * expression.cs: Treat ushort/short as legal values to be used in
6334         bitwise operations.
6335
6336 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6337
6338         * delegate.cs: transfer custom attributes for paramenters from
6339         the delegate declaration to Invoke and BeginInvoke.
6340
6341 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6342
6343         * attribute.cs: handle custom marshalers and emit marshal info
6344         for fields, too.
6345
6346 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6347
6348         * makefile.gnu: Added anonymous.cs to the compiler sources.
6349
6350 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6351
6352         * iterators.cs: Change the name of the proxy class to include two
6353         underscores.
6354
6355         * cs-parser.jay: Update grammar to include anonymous methods.
6356
6357         * anonymous.cs: new file.
6358
6359 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6360
6361         * class.cs (Field.Define): Add missing test for pointers and
6362         safety. 
6363
6364 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6365
6366         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6367         we use the stobj opcode.
6368
6369         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6370         since it wasn't the correct fix. 
6371
6372         It still is puzzling that we are required to use stobj for IntPtr
6373         which seems to be a ValueType.
6374
6375 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6376
6377         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6378         during regular simple name resolution.   Now, the trick is that
6379         instead of returning for processing the simplename, we do a
6380         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6381         contextual lookup type).   If a match is found, return that, if
6382         not, return for further composition.
6383
6384         This fixes long-standing 30485.
6385
6386         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6387         using the address to initialize an object, do an Stobj instead of
6388         using the regular Stelem.
6389
6390         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6391         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6392         Because if we are a BaseIndexerAccess that value will be true.
6393         Fixes 43643.
6394
6395         * statement.cs (GotoCase.Resolve): Return after reporting an
6396         error, do not attempt to continue. 
6397
6398         * expression.cs (PointerArithmetic.Emit): If our operand is a
6399         long, convert our constants to match the operand before
6400         multiplying.  Convert to I type before adding.   Fixes 43670.
6401
6402 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6403
6404         * enum.cs (ImplicitConversionExists) : Rename to
6405         ImplicitEnumConversionExists to remove ambiguity. 
6406
6407         * ecore.cs (NullCast): New type of cast expression class which
6408         basically is very similar to EmptyCast with the difference being
6409         it still is a constant since it is used only to cast a null to
6410         something else
6411         (eg. (string) null)
6412
6413         * convert.cs (ImplicitReferenceConversion): When casting a null
6414         literal, we return a NullCast.
6415
6416         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6417         should be around anymore.
6418
6419         The renaming (reported was slightly wrong). Corrections:
6420
6421         ConvertImplicitStandard -> ImplicitConversionStandard
6422         ConvertExplicitStandard -> ExplicitConversionStandard
6423
6424         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6425         before passing them in !
6426
6427         * convert.cs (ImplicitConversionStandard): When comparing for
6428         equal expr and target types, ensure that expr is not a
6429         NullLiteral.
6430
6431         In general, we must not be checking (expr_type ==
6432         target_type) in the top level conversion methods
6433         (ImplicitConversion, ExplicitConversion etc). This checking is
6434         done in the methods that they delegate to.
6435
6436 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6437
6438         * convert.cs: Move Error_CannotConvertType,
6439         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6440         ImplicitNumericConversion, ImplicitConversionExists,
6441         ImplicitUserConversionExists, StandardConversionExists,
6442         FindMostEncompassedType, FindMostSpecificSource,
6443         FindMostSpecificTarget, ImplicitUserConversion,
6444         ExplicitUserConversion, GetConversionOperators,
6445         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6446         TryImplicitIntConversion, Error_CannotConvertImplicit,
6447         ConvertImplicitRequired, ConvertNumericExplicit,
6448         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6449         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6450         its own file.
6451
6452         Perform the following renames:
6453
6454         StandardConversionExists -> ImplicitStandardConversionExists
6455         ConvertImplicit -> ImplicitConversion
6456         ConvertImplicitStandard -> ImplicitStandardConversion
6457         TryImplicitIntConversion -> ImplicitIntConversion
6458         ConvertImplicitRequired -> ImplicitConversionRequired
6459         ConvertNumericExplicit -> ExplicitNumericConversion
6460         ConvertReferenceExplicit -> ExplicitReferenceConversion
6461         ConvertExplicit -> ExplicitConversion
6462         ConvertExplicitStandard -> ExplicitStandardConversion
6463
6464 2003-05-19  Martin Baulig  <martin@ximian.com>
6465
6466         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6467         (TypeInfo): Added support for structs having structs as fields.
6468
6469         * ecore.cs (FieldExpr): Implement IVariable.
6470         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6471         VariableInfo for the field.
6472
6473 2003-05-18  Martin Baulig  <martin@ximian.com>
6474
6475         * expression.cs (This.DoResolve): Report a CS0027 if we're
6476         emitting a field initializer.
6477
6478 2003-05-18  Martin Baulig  <martin@ximian.com>
6479
6480         * expression.cs (This.ResolveBase): New public function.
6481         (This.DoResolve): Check for CS0188.
6482
6483         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6484         This.Resolve().
6485
6486         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6487         `instance_expression' to null if we don't have any non-static
6488         methods.
6489
6490 2003-05-18  Martin Baulig  <martin@ximian.com>
6491
6492         Reworked the way how local variables and parameters are handled by
6493         the flow analysis code.
6494
6495         * statement.cs (TypeInfo, VariableMap): New public classes.
6496         (VariableInfo): New public class.  This is now responsible for
6497         checking whether a variable has been assigned.  It is used for
6498         parameters and local variables.
6499         (Block.EmitMeta): Take the InternalParameters as argument; compute
6500         the layout of the flow vectors here.
6501         (Block.LocalMap, Block.ParameterMap): New public properties.
6502         (FlowBranching): The .ctor doesn't get the InternalParameters
6503         anymore since Block.EmitMeta() now computes the layout of the flow
6504         vector.
6505         (MyStructInfo): This class is now known as `StructInfo' and nested
6506         in `TypeInfo'; we don't access this directly anymore.
6507
6508         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6509         property and removed IsAssigned(), IsFieldAssigned(),
6510         SetAssigned() and SetFieldAssigned(); we now call them on the
6511         VariableInfo so we don't need to duplicate this code everywhere.
6512
6513         * expression.cs (ParameterReference): Added `Block block' argument
6514         to the .ctor.
6515         (LocalVariableReference, ParameterReference, This): The new
6516         VariableInfo class is now responsible for all the definite
6517         assignment stuff.
6518
6519         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6520         IsParameterAssigned, SetParameterAssigned): Removed.
6521
6522 2003-05-18  Martin Baulig  <martin@ximian.com>
6523
6524         * typemanager.cs (InitCoreTypes): Try calling
6525         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6526         the 3-args-version.  Corlib now also needs our `void_type'.
6527         (GetMethod): Added overloaded version which takes an optional
6528         `bool report_errors' to allow lookups of optional methods.
6529
6530 2003-05-12  Martin Baulig  <martin@ximian.com>
6531
6532         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6533         only used for locals and not for parameters.
6534
6535 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6536
6537         * support.cs (InternalParameters.ParameterType): Return the
6538         ExternalType of the parameter.
6539
6540         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6541         they were unused.
6542
6543 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6544
6545         * class.cs (MethodData.Define): Do not set the `newslot' on
6546         interface members, if they are also flagged as "override".
6547
6548         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6549         better code for ++i and i++.  This only works for static fields
6550         and local variables.
6551
6552         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6553         want to pull the DeclSpace out of the builder_to_declspace instead
6554         of the TypeBuilder (like in TypeContainer.FindMembers).
6555
6556         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6557         instead of LookupTypeContainer.  Fixes the crash on .NET for
6558         looking up interface members.
6559
6560         * const.cs: Create our own emit context during the Definition
6561         stage, so that constants are evaluated in the proper context, when
6562         a recursive definition happens.
6563
6564 2003-05-11  Martin Baulig  <martin@ximian.com>
6565
6566         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6567         new block for a switch section.
6568         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6569         the adding/lookup in the switch block.  Fixes #39828.
6570
6571 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6572
6573         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6574         functionality: I needed to convert the data after I had performed
6575         the add/sub operation into the operands type size.
6576
6577         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6578         pass the type for the box operation, otherwise the resulting
6579         object would have been of type object.
6580
6581         (BoxedCast): Add constructor to specify the type to box as.
6582
6583 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6584
6585         * iterators.cs: I was reusing the `count' variable inadvertently,
6586         take steps to not allow this to happen.
6587
6588 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6589
6590         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6591         by creating an array at the point where the params starts and
6592         putting all those arguments there, then adjusting the size of the
6593         array.
6594
6595 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6596
6597         * expression.cs (New.AddressOf): Implement interface
6598         IMemoryLocation.  This is used when the `new' operator is used in
6599         the context of an invocation to a method on a value type.
6600
6601         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6602         example. 
6603
6604         * namespace.cs: Also check the using aliases here.
6605
6606         * driver.cs: Move the test for using validity after the types have
6607         been entered, so we do a single pass that also includes the using
6608         aliases. 
6609
6610         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6611         in the regular case.   CreateSiblingForFinally is doing extra
6612         error checking.
6613
6614         * attribute.cs (GetAttributeArgumentExpression): Store the result
6615         on an out value, and use the return value to indicate failure
6616         instead of using null (which is a valid return for Constant.GetValue).
6617
6618         * statement.cs: Perform the analysis flow for the increment
6619         portion after the statement, because this will be the real flow of
6620         execution.  Fixes #42385
6621
6622         * codegen.cs (EmitContext.EmitArgument,
6623         EmitContext.EmitStoreArgument): New helper functions when the
6624         RemapToProxy flag is set.
6625
6626         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6627         function.
6628
6629         Add support for remapping parameters. 
6630
6631         * iterators.cs: Propagate parameter values;  Store parameter
6632         values in the proxy classes.
6633
6634 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6635
6636         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6637         need a proxy reference;  I do not know what I was thinking
6638
6639         * cs-parser.jay (constructor_initializer): catch another error,
6640         and display nice message.
6641
6642         (field_declaration): catch void field declaration
6643         to flag a better error. 
6644
6645         * class.cs (MemberBase.CheckBase): Report an error instead of a
6646         warning if a new protected member is declared in a struct. 
6647         (Field.Define): catch the error of readonly/volatile.
6648
6649         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6650
6651         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6652         volatile variable is taken
6653
6654 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6655
6656         * statement.cs (Fixed.Resolve): Report an error if we are not in
6657         an unsafe context.
6658
6659 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6660
6661         * typemanager.cs: reuse the code that handles type clashes for
6662         delegates and enumerations.
6663
6664         * class.cs (Report28): Always report.
6665
6666         * expression.cs (EncodeAsAttribute): Allow nulls here.
6667
6668 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6669
6670         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6671         the functionality for testing whether an expression is valid for
6672         an attribute here.  Also handle the case of arrays of elements
6673         being stored. 
6674
6675         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6676         encoding a linear array into an array of objects that are suitable
6677         to be passed to an CustomAttributeBuilder.
6678
6679         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6680
6681         * ecore.cs: (FieldExpr): Handle field remapping here.
6682
6683         * iteratators.cs: Pass the instance variable (if the method is an
6684         instance method) to the constructors, so we can access the field
6685         variables on the class.
6686
6687         TODO: Test this with structs.  I think the THIS variable on
6688         structs might have to be a pointer, and not a refenrece
6689
6690 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6691
6692         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6693         local variables to fields in a proxy class.
6694
6695         * iterators.cs (PopulateProxy): Rename our internal fields to
6696         <XXX>.  
6697         Create a <THIS> field if we are an instance method, so we can
6698         reference our parent container variables.
6699         (MapVariable): Called back from the EmitContext code to enter a
6700         new variable to field mapping into the proxy class (we just create
6701         a FieldBuilder).
6702
6703         * expression.cs
6704         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6705         for using the remapped locals to fields.
6706
6707         I placed the code here, because that gives the same semantics to
6708         local variables, and only changes the Emit code.
6709
6710         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6711         statements inside iterators.
6712         (VariableInfo): Add a FieldBuilder for the cases when we are
6713         remapping local variables to fields in a proxy class
6714
6715         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6716         current_block != null.
6717
6718         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6719         not cope with strings, as it has been moved to the
6720         TableSwitchEmit.  Fixed bug in switch generation.
6721
6722         * expression.cs (New.DoResolve): Provide more context for the user
6723         when reporting an error.
6724
6725         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6726         pointers. 
6727
6728         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6729         check the permissions for it.  Note than in a type-resolution
6730         context the check was already present in DeclSpace.ResolveType,
6731         but was missing from the MemberAccess.
6732
6733         (ArrayCreation.CheckIndices): warn if the user has
6734         more nested levels of expressions, but there are no more
6735         dimensions specified.  Avoids crash on bug 41906.
6736
6737 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6738
6739         * statement.cs (Block): replace Implicit bool, for a generic
6740         flags.   
6741         New flag: `Unchecked'.  This is used during the EmitMeta phase
6742         (which is out-of-line with the regular Resolve/Emit process for a
6743         statement, as this is done ahead of time, but still gets a chance
6744         to call constant resolve).
6745
6746         (Block.Flags): new enum for adding a new flag.
6747
6748         (Block.EmitMeta): track the state of unchecked.
6749
6750         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6751         to enable constant resolution to work there as well.
6752
6753 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6754
6755         * typemanager.cs (ienumerable_type): Also look up
6756         System.Collections.IEnumerable. 
6757
6758 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6759
6760         TODO: Test more than one conditional per method.
6761
6762         * class.cs (Indexer.Define): Report the location where the user is
6763         referencing the unsupported feature.
6764
6765         (MethodData): Overload the use of `conditionals' to
6766         minimize the creation of needless ArrayLists.   This saves roughly
6767         212kb on my machine.
6768
6769         (Method): Implement the new IIteratorContainer interface.
6770         (Method.SetYields): Implement the method by setting the ModFlags
6771         to contain METHOD_YIELDS.
6772
6773         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6774         which just got set to null.
6775
6776         * iterators.cs: New file.
6777
6778         (Yield, YieldBreak): New statements.
6779
6780         * statement.cs (Return.Resolve): Flag an error if we are used in
6781         an iterator method.
6782
6783         * codegen.cs (InIterator): New flag set if the code is being
6784         compiled in an iterator method.
6785
6786         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6787         internal modifier, and we just use it to avoid adding extra
6788         fields, as this is seldom used.  
6789
6790         * cs-parser.jay: Add yield_statement (yield and yield break).
6791
6792         * driver.cs: New flag -v2 to turn on version 2 features. 
6793
6794         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6795         hashtable when v2 is enabled.
6796
6797 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6798
6799         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6800         there is already a namespace defined with this name.
6801
6802         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6803         people upgraded their corlibs.
6804
6805         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6806         always use fully qualified types, no need to use the compiler
6807         front end.
6808
6809         (TypeManager.IsNamespace): Use binarysearch.
6810
6811         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6812         AddDelegate): I did not quite use the new IsValid API properly: I
6813         have to pass the short-name and the fullname.  I was passing only
6814         the basename instead of the fullname sometimes. 
6815
6816         (TypeContainer.DefineType): call NamespaceClash.
6817
6818         * interface.cs (Interface.DefineType): use NamespaceClash before
6819         defining the type.
6820
6821         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6822         defining the type.
6823
6824         * enum.cs: (Enum.DefineType): use NamespaceClash before
6825         defining the type.
6826
6827         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6828         speed increase.  First, use the negative_hits cache when we get a
6829         negative.  Second, add the type with its full original name
6830         instead of the new . and + encoded name (reflection uses + to
6831         separate type from a nested type).  Use LookupTypeReflection
6832         directly which bypasses the type->name hashtable (that we already
6833         know does not contain the type.
6834
6835         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6836         location/container type. 
6837
6838         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6839
6840 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6841
6842         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6843
6844         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6845         method is being referenced in the method group from a static
6846         context, and report error 120 if so.
6847
6848         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6849         Error118. 
6850
6851         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6852         is created, we create the A namespace).
6853
6854         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6855         Fixes #41591
6856
6857 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6858
6859         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6860         invocation to ModuleBuilder.GetType with the same values will
6861         return a new type instance, so we need to cache its return
6862         values. 
6863
6864         * expression.cs (Binary.ResolveOperator): Only allow the compare
6865         operators on enums if they are of the same type.
6866
6867         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6868         types of ValueType on their own case.  Before we were giving them
6869         the same treatment as objects.
6870
6871         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6872         fullname.  Short name is used to compare against container name.
6873         Fullname is used to check against defined namespace names.
6874
6875         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6876         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6877
6878         (Method.CheckBase): Call parent.
6879         (MemberBase.CheckBase): Check for protected members on sealed
6880         classes.
6881         (PropertyBase.CheckBase): Call parent.
6882         (Field.Define): Call parent.
6883
6884         * report.cs: Negative error codes are now mapped to 8000 - code,
6885         so that the display is render more nicely.
6886
6887         * typemanager.cs: Do not use try/catch, instead report a regular
6888         error. 
6889
6890         (GetPointerType, GetReferenceType): These methods provide
6891         mechanisms to obtain the T* and T& from a T.  We had the code
6892         previously scattered around the code base, and it also used
6893         TypeManager.LookupType that would go through plenty of caches.
6894         This one goes directly to the type source.
6895
6896         In some places we did the Type.GetType followed by
6897         ModuleBuilder.GetType, but not in others, so this unifies the
6898         processing as well.
6899
6900         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6901         statements now that we have namespace information.
6902
6903         * typemanager.cs (IsNamespace): New method, returns whether the
6904         string presented is a namespace or not.
6905
6906         (ComputeNamespaces): New public entry point, computes the list of
6907         available namespaces, using the GetNamespaces API call in Mono, or
6908         the slower version in MS.NET.   
6909
6910         Now before we start the semantic analysis phase, we have a
6911         complete list of namespaces including everything that the user has
6912         provided.
6913
6914         Deleted old code to cache namespaces in .nsc files.
6915
6916 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6917
6918         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6919         class/struct location definition Location for the implicit
6920         constructor location.
6921
6922         (Operator.Define): Use the location of the operator for the
6923         implicit Method definition.
6924
6925         (Constructor.Emit): use the constructor location for the implicit
6926         base initializer constructor.
6927
6928         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6929         and the Expression class now contains two new methods:
6930
6931         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6932         isolate type lookup from the rest of the resolution process.
6933
6934         Since we use Expressions to hold type definitions due to the way
6935         we parse the input we have historically overloaded Resolve to
6936         perform the Type lookups if a special flag is passed.  Now this is
6937         eliminated and two methods take their place. 
6938
6939         The differences in the two methods between xStep and xTerminal is
6940         that xStep is involved in our current lookup system that uses
6941         SimpleNames to compose a name, while xTerminal is used just to
6942         catch the case where the simplename lookup failed.
6943
6944 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6945
6946         * expression.cs (ResolveMemberAccess): Remove redundant code.
6947         TypeExpr expressions are always born fully resolved.
6948
6949         * interface.cs (PopulateMethod): Do not lookup the types twice.
6950         We were doing it once during SemanticAnalysis and once during
6951         PopulateMethod.
6952
6953         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6954         in local variable type definitions, were being returned as a
6955         SimpleName (we decomposed everything into a string), that is
6956         because primary_expression was being used instead of a type in the
6957         grammar (reduce/reduce conflicts).
6958
6959         The part that was wrong is that we converted the expression into a
6960         string (an oversimplification in one hand, compounded with primary
6961         expressions doing string concatenation).
6962
6963         So things like:
6964
6965         A.B.C [] x;
6966
6967         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6968         using clauses from working on this particular context.  And a type
6969         was being matched directly against "A.B.C[]".
6970
6971         We now use the correct approach, and allow for ComposedCast to be
6972         part of the unary expression.  So the "A.B.C []" become a composed
6973         cast of "A.B.C" (as a nested group of MemberAccess with a
6974         SimpleName at the end) plus the rank composition "[]". 
6975
6976         Also fixes 35567
6977
6978 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6979
6980         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6981         for the access level checking.
6982
6983         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6984         `TypeContainer container', because I kept getting confused when I
6985         was debugging this code.
6986
6987         * expression.cs (Indexers): Instead of tracking getters/setters,
6988         we now track them in parallel.  We create one arraylist less, but
6989         most importantly it is possible now for the LValue code to find a
6990         matching get for a set.
6991
6992         (IndexerAccess.DoResolveLValue): Update the code.
6993         GetIndexersForType has been modified already to extract all the
6994         indexers from a type.  The code assumed it did not.
6995
6996         Also make the code set the correct return type for the indexer.
6997         This was fixed a long time ago for properties, but was missing for
6998         indexers.  It used to be void_type.
6999
7000         (Binary.Emit): Test first for doubles instead of
7001         floats, as they are more common.
7002
7003         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7004         when dealing with floats and the <=, >= operators.  This fixes bug
7005         #39314 
7006
7007         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7008         to load the array value by emitting a load on the foreach variable
7009         type.  This was incorrect.  
7010
7011         We now emit the code to load an element using the the array
7012         variable type, and then we emit the conversion operator.
7013
7014         Fixed #40176
7015
7016 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7017
7018         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7019
7020 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7021
7022         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7023         test for protection before we test for signatures. 
7024
7025         (MethodSignature.ToString): implement.
7026
7027         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7028         to the case where we reduced into a LongConstant.
7029
7030         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7031         depend on whether the information is acurrate, because the
7032         Microsoft runtime will always claim that the array type is public,
7033         regardless of the real state.
7034
7035         If the type is a pointer, another problem happens: the type is
7036         reported as non-public in Microsoft.  
7037
7038         In both cases we have to call CheckAccessLevel recursively with
7039         the underlying type as the argument to be tested.
7040
7041 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7042
7043         * assign.cs (Assign.Emit): If we are dealing with a compound
7044         assignment expression, we should use the code path that stores the
7045         intermediate result in a temporary value.  This fixes #40903.
7046
7047         *expression.cs (Indirection.ToString): Provide ToString method for
7048         debugging. 
7049
7050 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7051
7052         * class.cs: Null out fields holding references to Block objects so
7053         they can be garbage collected.
7054
7055         * expression.cs (OverloadResolve): Remove unused local.
7056
7057 2003-04-07  Martin Baulig  <martin@ximian.com>
7058
7059         * codegen.cs (EmitContext.CurrentFile): New public field.
7060         (EmitContext.Mark): Use the CurrentFile to check whether the
7061         location is in the correct file.
7062         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7063
7064 2003-04-07  Martin Baulig  <martin@ximian.com>
7065
7066         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7067
7068         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7069         location.  [FIXME: The location argument which gets passed to this
7070         method is sometimes wrong!]
7071
7072 2003-04-07  Nick Drochak <ndrochak@gol.com>
7073
7074         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7075
7076 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7077
7078         * expression.cs (Indirection.EmitAssign): We were using the
7079         temporary, but returning immediately instead of continuing the
7080         EmitAssing flow.
7081
7082 2003-04-06  Martin Baulig  <martin@ximian.com>
7083
7084         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7085         if it's a nested child, but also deriving from the outer class.
7086         See test 190.cs.
7087
7088         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7089         nested child, but also deriving from the outer class.  See
7090         test-190.cs.
7091         (FilterWithClosure): We may access private members of the outer
7092         class if we're a nested child and deriving from the outer class.
7093         (RealMemberLookup): Only set `closure_private_ok' if the
7094         `original_bf' contained BindingFlags.NonPublic.
7095
7096 2003-04-05  Martin Baulig  <martin@ximian.com>
7097
7098         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7099
7100 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7101
7102         * class.cs (Event.Define): Do not allow abstract events to have
7103         initializers. 
7104
7105 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7106
7107         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7108         block in event declarations.
7109
7110         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7111         value type, get its address.
7112
7113         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7114         leaving a class on the stack instead of a boolean value (int
7115         0/1).  Change the code so we compare against null, and then the
7116         result against zero.
7117
7118         * class.cs (TypeContainer.GetClassBases): We were checking for the
7119         parent class being sealed too late.
7120
7121         * expression.cs (Binary.Emit): For <= and >= when dealing with
7122         floating point values, use cgt.un and clt.un instead of cgt and
7123         clt alone.
7124
7125 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7126
7127         * statement.cs: Apply the same optimization as MS: skip the 
7128         GetEnumerator returning an IEnumerator, and use the one returning a 
7129         CharEnumerator instead. This allows us to avoid the try-finally block 
7130         and the boxing.
7131
7132 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7133
7134         * cs-parser.jay: Attributes cannot be applied to
7135                          namespaces. Fixes #40473
7136
7137 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7138
7139         * class.cs:
7140         (Add*): check if the name is valid using the full name for constants,
7141         fields, properties and events.
7142
7143 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7144
7145         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7146         char constants to be part of the enumeration.
7147
7148         * expression.cs (Conditional.DoResolve): Add support for operator
7149         true. Implements the missing functionality from 14.12
7150
7151         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7152         operator true/false as required by the spec.
7153
7154         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7155         implicit conversion to boolean.
7156
7157         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7158         also one where the type implements `operator true'. 
7159
7160         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7161         get an expression that will invoke operator true based on an
7162         expression.  
7163
7164         (GetConversionOperators): Removed the hack that called op_True
7165         here.  
7166
7167         (Expression.ResolveBoolean): Move this from Statement.
7168
7169 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7170
7171         * ecore.cs (FieldExpr): do not allow initialization of initonly
7172         fields on derived classes
7173
7174 2003-03-13  Martin Baulig  <martin@ximian.com>
7175
7176         * statement.cs (Block.Emit): Call ig.BeginScope() and
7177         ig.EndScope() when compiling with debugging info; call
7178         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7179
7180 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7181
7182         * expression.cs (Indexers): Do not construct immediately, allow
7183         for new members to be appended as we go.  Fixes 38143
7184
7185 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7186
7187         * expression.cs: save/restore context when resolving an unchecked
7188         expression.
7189
7190 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7191
7192         * cfold.cs: Catch division by zero in modulus operator during
7193         constant folding.
7194
7195 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7196
7197         * interface.cs (Interface.DefineMembers): Avoid defining members
7198         twice. 
7199
7200 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7201
7202         * driver.cs: handle the +/- options for -noconfig
7203
7204         * statement.cs (Unckeched.Resolve): Also track the state of
7205         unchecked in the Resolve phase.
7206
7207 2003-02-27  Martin Baulig  <martin@ximian.com>
7208
7209         * ecore.cs (Expression.MemberLookup): Don't create a
7210         MethodGroupExpr for something which is not a method.  Fixes #38291.
7211
7212 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7213
7214         * class.cs (MemberBase.CheckParameters): Also check that the type
7215         is unmanaged if it is a pointer.
7216
7217         * expression.cs (SizeOf.Resolve): Add location information.
7218
7219         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7220         a managed type is declared.
7221
7222         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7223         parameter modifiers as well.  Fixes bug 38606
7224
7225         * class.cs: Very sad.  Am backing out the speed up changes
7226         introduced by the ArrayList -> Array in the TypeContainer, as they
7227         were not actually that much faster, and introduced a bug (no error
7228         reports on duplicated methods).
7229
7230         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7231         source first, this will guarantee that we have a valid expression
7232         before calling in lower levels functions that will require a
7233         resolved object.  Then use this original_source in the
7234         target.ResolveLValue instead of the original source that was
7235         passed to us.
7236
7237         Another change.  Use target.Resolve instead of LValueResolve.
7238         Although we are resolving for LValues, we will let the Assign code
7239         take care of that (it will be called again from Resolve).  This
7240         basically allows code like this:
7241
7242         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7243         class Y { void A (X x) { x [0] += o; }
7244
7245         The problem was that the indexer was trying to resolve for
7246         set_Item (idx, object o) and never finding one.  The real set_Item
7247         was set_Item (idx, X).  By delaying the process we get the right
7248         semantics. 
7249
7250         Fixes bug 36505
7251
7252 2003-02-23  Martin Baulig  <martin@ximian.com>
7253
7254         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7255         while calling DoEmit ().
7256
7257         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7258         source files; if you use the #line directive inside a method, the
7259         compiler stops emitting line numbers for the debugger until it
7260         reaches the end of the method or another #line directive which
7261         restores the original file.
7262
7263 2003-02-23  Martin Baulig  <martin@ximian.com>
7264
7265         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7266
7267 2003-02-23  Martin Baulig  <martin@ximian.com>
7268
7269         * statement.cs (Block.AddChildVariableNames): We need to call this
7270         recursively, not just for our immediate children.
7271
7272 2003-02-23  Martin Baulig  <martin@ximian.com>
7273
7274         * class.cs (Event.Define): Always make the field private, like csc does.
7275
7276         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7277         actually work, fixes bug #37521.
7278
7279 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7280
7281         * delegate.cs: When creating the various temporary "Parameters"
7282         classes, make sure that we call the ComputeAndDefineParameterTypes
7283         on those new parameters (just like we do with the formal ones), to
7284         allow them to be resolved in the context of the DeclSpace.
7285
7286         This fixes the bug that Dick observed in Bugzilla #38530.
7287
7288 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7289
7290         * expression.cs (ResolveMemberAccess): When resolving a constant,
7291         do not attempt to pull a constant if the value was not able to
7292         generate a valid constant.
7293
7294         * const.cs (LookupConstantValue): Do not report more errors than required.
7295
7296 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7297
7298         * expression.cs: fixes bug #38328.
7299
7300 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7301
7302         * class.cs: Changed all the various members that can be part of a
7303         class from being an ArrayList to be an Array of the right type.
7304         During the DefineType type_list, interface_list, delegate_list and
7305         enum_list are turned into types, interfaces, delegates and enums
7306         arrays.  
7307
7308         And during the member population, indexer_list, event_list,
7309         constant_list, field_list, instance_constructor_list, method_list,
7310         operator_list and property_list are turned into their real arrays.
7311
7312         Although we could probably perform this operation earlier, for
7313         good error reporting we need to keep the lists and remove the
7314         lists for longer than required.
7315
7316         This optimization was triggered by Paolo profiling the compiler
7317         speed on the output of `gen-sample-program.pl' perl script. 
7318
7319         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7320         not crash in methods like MemberLookupFailed that use this field.  
7321
7322         This problem arises when the compiler fails to resolve a type
7323         during interface type definition for example.
7324
7325 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7326
7327         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7328         inherit from System.Object, so we have to stop at null, not only
7329         when reaching System.Object.
7330
7331 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7332
7333         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7334         DeclaredOnly because the parent indexer might have had a different
7335         name, but did not loop until the top of the hierarchy was reached.
7336
7337         The problem this one fixes is 35492: when a class implemented an
7338         indexer from an interface, we were getting the interface method
7339         (which was abstract) and we were flagging an error (can not invoke
7340         abstract method).
7341
7342         This also keeps bug 33089 functioning, and test-148 functioning.
7343
7344         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7345         out if a method is special is to see if it is declared in a
7346         property or event, or whether it is one of the predefined operator
7347         names.   This should fix correctly #36804.
7348
7349 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7350
7351         The goal here is to remove the dependency on EmptyCast.Peel ().
7352         Killing it completely.
7353
7354         The problem is that currently in a number of places where
7355         constants are expected, we have to "probe" for an EmptyCast, and
7356         Peel, which is not the correct thing to do, as this will be
7357         repetitive and will likely lead to errors. 
7358
7359         The idea is to remove any EmptyCasts that are used in casts that
7360         can be reduced to constants, so we only have to cope with
7361         constants. 
7362
7363         This bug hunt was triggered by Bug 37363 and the desire to remove
7364         the duplicate pattern where we were "peeling" emptycasts to check
7365         whether they were constants.  Now constants will always be
7366         constants.
7367
7368         * ecore.cs: Use an enumconstant here instead of wrapping with
7369         EmptyCast.  
7370
7371         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7372         throwing me off.  By handling this we can get rid of a few hacks.
7373
7374         * statement.cs (Switch): Removed Peel() code.
7375
7376 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7377
7378         * class.cs: Location information for error 508
7379
7380         * expression.cs (New.DoResolve): Add a guard against double
7381         resolution of an expression.  
7382
7383         The New DoResolve might be called twice when initializing field
7384         expressions (see EmitFieldInitializers, the call to
7385         GetInitializerExpression will perform a resolve on the expression,
7386         and later the assign will trigger another resolution
7387
7388         This leads to bugs (#37014)
7389
7390         * delegate.cs: The signature for EndInvoke should contain any ref
7391         or out parameters as well.  We were not doing this in the past. 
7392
7393         * class.cs (Field.Define): Do not overwrite the type definition
7394         inside the `volatile' group.  Turns out that volatile enumerations
7395         were changing the type here to perform a validity test, which
7396         broke conversions. 
7397
7398 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7399
7400         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7401         and structs, we do not want to load the instance variable
7402
7403         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7404         enum_type has to be handled like an object reference (implicit
7405         conversions exists from this to object), but the regular IsClass
7406         and IsValueType tests will never return true for this one.
7407
7408         Also we use TypeManager.IsValueType instead of type.IsValueType,
7409         just for consistency with the rest of the code (this is only
7410         needed if we ever use the construct exposed by test-180.cs inside
7411         corlib, which we dont today).
7412
7413 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7414
7415         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7416         just InternalCall.
7417
7418 2003-02-09  Martin Baulig  <martin@ximian.com>
7419
7420         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7421         (Namespace.DefineNamespaces): New static public method; this is
7422         called when we're compiling with debugging to add all namespaces
7423         to the symbol file.
7424
7425         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7426         pass it to the Namespace's .ctor.
7427
7428         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7429         and MethodBase arguments; pass the namespace ID to the symwriter;
7430         pass the MethodBase instead of the token to the symwriter.
7431         (SymbolWriter.DefineNamespace): New method to add a namespace to
7432         the symbol file.
7433
7434 2003-02-09  Martin Baulig  <martin@ximian.com>
7435
7436         * symbolwriter.cs: New file.  This is a wrapper around
7437         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7438         methods here in near future.
7439
7440 2003-02-09  Martin Baulig  <martin@ximian.com>
7441
7442         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7443         ILGenerator.MarkSequencePoint() which are actually used by the
7444         symbol writer.
7445
7446 2003-02-09  Martin Baulig  <martin@ximian.com>
7447
7448         * location.cs (SourceFile): New public sealed class.  This
7449         contains the name and an index which is used in the location's token.
7450         (Location): Reserve an appropriate number of bits in the token for
7451         the source file instead of walking over that list, this gives us a
7452         really huge performance improvement when compiling with debugging.
7453
7454         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7455         `SourceFile' argument instead of a string.
7456         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7457         but don't parse/tokenize here, we need to generate the list of all
7458         source files before we do that.
7459         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7460         the files.
7461
7462         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7463         instead of a string.
7464
7465         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7466         of a string.
7467
7468 2003-02-09  Martin Baulig  <martin@ximian.com>
7469
7470         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7471         filename on `#line default'.
7472
7473 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7474
7475         * statement.cs: don't clear the pinned var when the fixed statement
7476         returns from the method (fixes bug#37752).
7477
7478 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7479
7480         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7481         to IsValueType.
7482
7483 2003-02-07  Martin Baulig  <martin@ximian.com>
7484
7485         * driver.cs: Removed the `--debug-args' command line argument.
7486
7487         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7488         automatically by the AsssemblyBuilder.
7489         (CodeGen.InitializeSymbolWriter): We don't need to call any
7490         initialization function on the symbol writer anymore.  This method
7491         doesn't take any arguments.
7492
7493 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7494
7495         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7496         from referenced assemblies as well.
7497
7498 2003-02-02  Martin Baulig  <martin@ximian.com>
7499
7500         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7501
7502 2003-02-02  Martin Baulig  <martin@ximian.com>
7503
7504         * class.cs (Constructor.Emit): Open the symbol writer before
7505         emitting the constructor initializer.
7506         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7507         single-stepping through constructor initializers.
7508
7509 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7510
7511         * class.cs: Handle error 549: do not allow virtual methods in
7512         sealed classes. 
7513
7514 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7515
7516         * decl.cs: Check access levels when resolving types
7517
7518 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7519
7520         * statement.cs: Add parameters and locals set in catch blocks that might 
7521         return to set vector
7522
7523 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7524
7525         * class.cs (Operator): Set the SpecialName flags for operators.
7526
7527         * expression.cs (Invocation.DoResolve): Only block calls to
7528         accessors and operators on SpecialName methods.
7529
7530         (Cast.TryReduce): Handle conversions from char constants.
7531
7532
7533 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7534
7535         * statement.cs: small memory and time optimization in FlowBranching.
7536
7537 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7538
7539         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7540         problem that the last fix but in the other sid (Set).
7541
7542         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7543         access when there is no indexer in the hierarchy.
7544
7545 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7546
7547         * class.cs: Combine some if statements.
7548
7549 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7550
7551         * driver.cs: fixed bug #37187.
7552
7553 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7554
7555         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7556         any indexer, it's needed to build a list with all the indexers in the
7557         hierarchy (AllGetters), else we have problems. Fixes #35653.
7558
7559 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7560
7561         * class.cs (MethodData.Define): It is wrong for an interface
7562         implementation to be static in both cases: explicit and implicit.
7563         We were only handling this in one case.
7564
7565         Improve the if situation there to not have negations.
7566
7567         * class.cs (Field.Define): Turns out that we do not need to check
7568         the unsafe bit on field definition, only on usage.  Remove the test.
7569
7570 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7571
7572         * driver.cs: use assembly.Location instead of Codebase (the latest
7573         patch made mcs fail when using MS assemblies).
7574
7575 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7576
7577         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7578         get the path to *corlib.dll.
7579
7580 2003-01-21  Nick Drochak <ndrochak@gol.com>
7581
7582         * cs-tokenizer.cs:
7583         * pending.cs:
7584         * typemanager.cs: Remove compiler warnings
7585
7586 2003-01-20  Duncan Mak  <duncan@ximian.com>
7587
7588         * AssemblyInfo.cs: Bump the version number to 0.19.
7589
7590 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7591
7592         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7593
7594 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7595
7596         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7597
7598 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7599
7600         * cs-parser.jay: Small fix: we were not comparing the constructor
7601         name correctly.   Thanks to Zoltan for the initial pointer.
7602
7603 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7604
7605         * cs-tokenizer.cs: Set file name when specified with #line
7606
7607 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7608
7609         * cs-parser.jay: Only perform the constructor checks here if we
7610         are named like the class;  This will help provider a better
7611         error.  The constructor path is taken when a type definition is
7612         not found, but most likely the user forgot to add the type, so
7613         report that rather than the constructor error.
7614
7615 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7616
7617         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7618         allocations.
7619
7620 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7621
7622         * cs-parser.jay: Add cleanup call.
7623
7624 2003-01-13  Duncan Mak  <duncan@ximian.com>
7625
7626         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7627         consistent with other methods.
7628
7629 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7630
7631         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7632
7633 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7634
7635         * attribute.cs: only set GuidAttr to true when we have a
7636         GuidAttribute.
7637
7638 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7639
7640         * ecore.cs:
7641         * expression.cs:
7642         * typemanager.cs: fixes to allow mcs compile corlib with the new
7643         Type.IsSubclassOf fix.
7644
7645 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7646
7647         * expression.cs (LocalVariableReference.DoResolve): Classify a
7648         constant as a value, not as a variable.   Also, set the type for
7649         the variable.
7650
7651         * cs-parser.jay (fixed_statement): take a type instead of a
7652         pointer_type, so we can produce a better error message later.
7653
7654         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7655         as an error.  
7656
7657         (For.DoEmit): Make inifinite loops have a
7658         non-conditional branch back.
7659
7660         (Fixed.DoEmit): First populate the pinned variables, then emit the
7661         statement, then clear the variables.  Before I was emitting the
7662         code once for each fixed piece.
7663
7664
7665 2003-01-08  Martin Baulig  <martin@ximian.com>
7666
7667         * statement.cs (FlowBranching.MergeChild): A break in a
7668         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7669
7670 2003-01-08  Martin Baulig  <martin@ximian.com>
7671
7672         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7673         lives in the same number space than `param_map'.  Fixes #36154.
7674
7675 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7676
7677         * cs-parser.jay (constructor_declaration): Set the
7678         Constructor.ModFlags before probing for it.  This makes the
7679         compiler report 514, 515 and 132 (the code was there, but got
7680         broken). 
7681
7682         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7683         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7684         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7685
7686 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7687
7688         * enum.cs: create the enum static fields using the enum type.
7689
7690 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7691
7692         * class.cs: don't try to create the ParamBuilder for the return
7693         type if it's not needed (and handle it breaking for the ms runtime
7694         anyway).
7695
7696 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7697
7698         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7699
7700 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7701
7702         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7703         the command.   This showed up while compiling the JANET source
7704         code, which used \r as its only newline separator.
7705
7706 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7707
7708         * class.cs (Method.Define): If we are an operator (because it
7709         reuses our code), then set the SpecialName and HideBySig.  #36128
7710
7711 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7712
7713         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7714         exception, report error 120 `object reference required'.
7715
7716         * driver.cs: Add --pause option, used during to measure the size
7717         of the process as it goes with --timestamp.
7718
7719         * expression.cs (Invocation.DoResolve): Do not allow methods with
7720         SpecialName to be invoked.
7721
7722 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7723
7724         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7725         number before adding it.
7726
7727 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7728
7729         * ecore.cs (StandardImplicitConversion): When in an unsafe
7730         context, we allow conversion between void * to any other pointer
7731         type. This fixes bug #35973.
7732
7733 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7734
7735         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7736         is not thrown when extensionless outputs are used 
7737
7738 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7739
7740         * rootcontext.cs: fixed compilation of corlib.
7741
7742 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7743
7744         * attribute.cs (Attributes.Contains): Add new method.
7745
7746         * class.cs (MethodCore.LabelParameters): if the parameter is an
7747         `out' parameter, check that no attribute `[In]' has been passed.
7748
7749         * enum.cs: Handle the `value__' name in an enumeration.
7750
7751 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7752
7753         * decl.cs: Added special case to allow overrides on "protected
7754         internal" methods
7755
7756 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7757
7758         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7759         since it makes much more sense.
7760
7761         (Attributes.ctor): Don't require a Location parameter.
7762
7763         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7764
7765         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7766         since we already have that information per attribute.
7767
7768         * everywhere : make appropriate changes.
7769
7770         * class.cs (LabelParameters): Write the code which actually
7771         applies attributes to the return type. We can't do this on the MS
7772         .NET runtime so we flag a warning in the case an exception is
7773         thrown.
7774
7775 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7776
7777         * const.cs: Handle implicit null conversions here too.
7778
7779 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7780
7781         * class.cs (MethodCore.LabelParameters): Remove the extra
7782         Type [] parameter since it is completely unnecessary. Instead
7783         pass in the method's attributes so that we can extract
7784         the "return" attribute.
7785
7786 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7787
7788         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7789         of ignoring it and letting the compile continue.
7790
7791         * typemanager.cs (ChangeType): use an extra argument to return an
7792         error condition instead of throwing an exception.
7793
7794 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7795
7796         * expression.cs (Unary.TryReduce): mimic the code for the regular
7797         code path.  Perform an implicit cast in the cases where we can
7798         implicitly convert to one of the integral types, and then reduce
7799         based on that constant.   This fixes bug #35483.
7800
7801 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7802
7803         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7804
7805 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7806
7807         * namespace.cs: fixed bug #35489.
7808
7809 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7810
7811         * class.cs: Remove some dead code.
7812
7813         * cs-parser.jay: Estimate the number of methods needed
7814         (RootContext.MethodCount);
7815
7816         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7817         numbers instead of StringBuilders.
7818
7819         * support.cs (PtrHashtable): Add constructor with initial size;
7820         We can now reduce reallocations of the method table.
7821
7822 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7823
7824         * attribute.cs (ApplyAttributes): Keep track of the emitted
7825         attributes on a per-target basis. This fixes bug #35413.
7826
7827 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7828
7829         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7830         default to the Windows 1252 encoding.
7831
7832         (UnixParseOption): Support version, thanks to Alp for the missing
7833         pointer. 
7834
7835         * AssemblyInfo.cs: Add nice assembly information.
7836
7837         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7838         (bug 35169).
7839
7840         * cs-parser.jay: Allow a trailing comma before the close bracked
7841         in the attribute_section production.
7842
7843         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7844         address of the instance was being taken, I will take this out,
7845         because we take the address of the object immediately here.
7846
7847 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7848
7849         * typemanager.cs (AreMultipleAllowed): Take care of the most
7850         obvious case where attribute type is not in the current assembly -
7851         stupid me ;-)
7852
7853 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7854
7855         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7856         definitions, instead of doing that afterwards.  
7857
7858         Also we use a nice little hack, depending on the constructor, we
7859         know if we are a "composed" name or a simple name.  Hence, we
7860         avoid the IndexOf test, and we avoid 
7861
7862         * codegen.cs: Add code to assist in a bug reporter to track down
7863         the source of a compiler crash. 
7864
7865 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7866
7867         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7868         types have been emitted for a given element and flag an error
7869         if something which does not have AllowMultiple set is used more
7870         than once.
7871
7872         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7873         attribute types and their corresponding AllowMultiple properties
7874
7875         (AreMultipleAllowed): Check the property for a given type.
7876
7877         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7878         property in the case we have a TypeContainer.
7879
7880         (Attributes.AddAttribute): Detect duplicates and just skip on
7881         adding them. This trivial fix catches a pretty gross error in our
7882         attribute emission - global attributes were being emitted twice!
7883
7884         Bugzilla bug #33187 is now fixed.
7885
7886 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7887
7888         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7889         instead of pp_and).
7890
7891         * expression.cs (Binary.ResolveOperator): I can only use the
7892         Concat (string, string, string) and Concat (string, string,
7893         string, string) if the child is actually a concatenation of
7894         strings. 
7895
7896 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7897
7898         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7899         context where we need a 2-character lookahead.
7900
7901         * pending.cs (PendingImplementation): Rework so we can keep track
7902         of interface types all the time, and flag those which were
7903         implemented by parents as optional.
7904
7905 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7906
7907         * expression.cs (Binary.ResolveOperator): Use
7908         String.Concat(string,string,string) or
7909         String.Concat(string,string,string,string) when possible. 
7910
7911         * typemanager: More helper methods.
7912
7913
7914 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7915
7916         * pending.cs: remove the bogus return from GetMissingInterfaces()
7917         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7918
7919 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7920
7921         * namespace.cs: avoid duplicated 'using xxx' being added to
7922         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7923         when we get more than one 'using' statement for the same namespace.
7924         Report a CS0105 warning for it.
7925
7926 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7927
7928         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7929         of calling getChar/putback, uses internal knowledge of it.    
7930
7931         (xtoken): Reorder tokenizer so most common patterns are checked
7932         first.  This reduces the compilation time in another 5% (from 8.11s
7933         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7934
7935         The parsing time is 22% of the compilation in mcs, and from that
7936         64% is spent on the tokenization process.  
7937
7938         I tried using a binary search for keywords, but this is slower
7939         than the hashtable.  Another option would be to do a couple of
7940         things:
7941
7942                 * Not use a StringBuilder, instead use an array of chars,
7943                   with a set value.  Notice that this way we could catch
7944                   the 645 error without having to do it *afterwards*.
7945
7946                 * We could write a hand-parser to avoid the hashtable
7947                   compares altogether.
7948
7949         The identifier consumption process takes 37% of the tokenization
7950         time.  Another 15% is spent on is_number.  56% of the time spent
7951         on is_number is spent on Int64.Parse:
7952
7953                 * We could probably choose based on the string length to
7954                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7955                   computations. 
7956
7957         Another 3% is spend on wrapping `xtoken' in the `token' function.
7958
7959         Handle 0xa0 as whitespace (#34752)
7960
7961 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7962
7963         * typemanager.cs (IsCLRType): New routine to tell whether a type
7964         is one of the builtin types.  
7965
7966         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7967         typecode in more places instead of doing pointer comparissions.
7968         We could leverage some knowledge about the way the typecodes are
7969         laid out.
7970
7971         New code to cache namespaces in assemblies, it is currently not
7972         invoked, to be used soon.
7973
7974         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7975
7976         * expression.cs (Binary.ResolveOperator): specially handle
7977         strings, and do not perform user-defined operator overloading for
7978         built-in types.
7979
7980 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7981
7982         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7983         internalcall as it is a pretty simple operation;  Avoid whenever
7984         possible to call Char.IsLetter.
7985
7986         (consume_identifier): Cut by half the number of
7987         hashtable calls by merging the is_keyword and GetKeyword behavior.
7988
7989         Do not short-circuit, because if we do, we
7990         report errors (ie, #if false && true would produce an invalid
7991         directive error);
7992
7993
7994 2002-11-24  Martin Baulig  <martin@ximian.com>
7995
7996         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7997         check constant ranges and report a CS0221.  Fixes #33186.
7998
7999 2002-11-24  Martin Baulig  <martin@ximian.com>
8000
8001         * cs-parser.jay: Make this work for uninitialized variable
8002         declarations in the `for' initializer.  Fixes #32416.
8003
8004 2002-11-24  Martin Baulig  <martin@ximian.com>
8005
8006         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8007         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8008
8009 2002-11-24  Martin Baulig  <martin@ximian.com>
8010
8011         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8012         argument; if true, we also check for user-defined conversions.
8013         This is only needed if both arguments are of a user-defined type.
8014         Fixes #30443, added test-175.cs.
8015         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8016
8017         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8018
8019 2002-11-24  Martin Baulig  <martin@ximian.com>
8020
8021         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8022         function to get the store opcode.
8023         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8024         only emit the Ldelema if the store opcode is Stobj.  You must run
8025         both test-34 and test-167 to test this.  Fixes #34529.
8026
8027 2002-11-23  Martin Baulig  <martin@ximian.com>
8028
8029         * ecore.cs (Expression.MemberLookup): Added additional
8030         `qualifier_type' argument which is used when we're being called
8031         from MemberAccess.DoResolve() and null if we're called from a
8032         SimpleName lookup.
8033         (Expression.MemberLookupFailed): New method to report errors; this
8034         does the CS1540 check and reports the correct error message.
8035
8036         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8037         argument for the CS1540 check and redone the way how we're dealing
8038         with private members.  See the comment in the source code for details.
8039         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8040         `closure_start_type' to `closure_qualifier_type' and check whether
8041         it's not null.  It was not this filter being broken, it was just
8042         being called with the wrong arguments.
8043
8044         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8045         and pass it the correct `qualifier_type'; this also does the error
8046         handling for us.
8047
8048 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8049
8050         * expression.cs (Invocation.EmitParams): If the we are dealing
8051         with a non-built-in value type, load its address as well.
8052
8053         (ArrayCreation): Use a a pretty constant instead
8054         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8055         static initializers.  
8056
8057         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8058         because they are not really value types, just glorified integers. 
8059
8060         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8061
8062         * ecore.cs: Remove redundant code for enumerations, make them use
8063         the same code path as everything else, fixes the casting issue
8064         with enumerations in Windows.Forms.
8065
8066         * attribute.cs: Do only cast to string if it is a string, the
8067         validation happens later.
8068
8069         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8070         people upgrade their corlibs.
8071
8072         * ecore.cs: Oops, enumerations were not following the entire code path
8073
8074 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8075
8076         * typemanager.cs (FilterWithClosure): Commented out the test for
8077         1540 in typemanager.cs, as it has problems when accessing
8078         protected methods from a parent class (see test-174.cs). 
8079
8080         * attribute.cs (Attribute.ValidateGuid): new method.
8081         (Attribute.Resolve): Use above.
8082
8083 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8084
8085         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8086
8087         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8088         handling for enumerations, as we only needed the TypeContainer
8089         functionality to begin with (this is required for the fix below to
8090         work for enums that reference constants in a container class for
8091         example). 
8092
8093         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8094
8095         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8096         a valid TypeBuilder to perform lookups on.o
8097
8098         * class.cs (InheritableMemberSignatureCompare): Use true in the
8099         call to GetGetMethod and GetSetMethod, because we are comparing
8100         the signature, and we need to get the methods *even* if they are
8101         private. 
8102
8103         (PropertyBase.CheckBase): ditto.
8104
8105         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8106         GotoCase.Resolve): Use Peel on EmpytCasts.
8107
8108         * ecore.cs (EmptyCast): drop child, add Peel method.
8109
8110 2002-11-17  Martin Baulig  <martin@ximian.com>
8111
8112         * ecore.cs (EmptyCast.Child): New public property.
8113
8114         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8115         label resolved to an EmptyCast.  Fixes #34162.
8116         (GotoCase.Resolve): Likewise.
8117         (Block.EmitMeta): Likewise.
8118
8119 2002-11-17  Martin Baulig  <martin@ximian.com>
8120
8121         * expression.cs (Invocation.BetterConversion): Prefer int over
8122         uint; short over ushort; long over ulong for integer literals.
8123         Use ImplicitConversionExists instead of StandardConversionExists
8124         since we also need to check for user-defined implicit conversions.
8125         Fixes #34165.  Added test-173.cs.
8126
8127 2002-11-16  Martin Baulig  <martin@ximian.com>
8128
8129         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8130         with the `true' and `false' literals.  Fixes #33151.
8131
8132 2002-11-16  Martin Baulig  <martin@ximian.com>
8133
8134         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8135         October 22nd; don't do the cs1540 check for static members.
8136
8137         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8138         now using our own filter here and doing the cs1540 check again.
8139
8140 2002-11-16  Martin Baulig  <martin@ximian.com>
8141
8142         * support.cs (InternalParameters): Don't crash if we don't have
8143         any fixed parameters.  Fixes #33532.
8144
8145 2002-11-16  Martin Baulig  <martin@ximian.com>
8146
8147         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8148         when looking up static methods to make this work on Windows.
8149         Fixes #33773.
8150
8151 2002-11-16  Martin Baulig  <martin@ximian.com>
8152
8153         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8154         a setter rather than using PropertyInfo.CanWrite.
8155
8156 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8157
8158         * class.cs: Allow acces to block member by subclasses. Fixes build
8159         breaker.
8160
8161 2002-11-14  Martin Baulig  <martin@ximian.com>
8162
8163         * class.cs (Constructor.Emit): Added the extern/block check.
8164         Fixes bug #33678.
8165
8166 2002-11-14  Martin Baulig  <martin@ximian.com>
8167
8168         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8169         iteration while looking for indexers, this is needed because the
8170         indexer may have a different name in our base classes.  Fixed the
8171         error reporting (no indexers at all, not get accessor, no
8172         overloaded match).  Fixes bug #33089.
8173         (IndexerAccess.DoResolveLValue): Likewise.
8174
8175 2002-11-14  Martin Baulig  <martin@ximian.com>
8176
8177         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8178         indexers.  Fixes the first part of bug #33089.
8179         (MethodSignature.InheritableMemberSignatureCompare): Added support
8180         for properties.
8181
8182 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8183
8184         * attribute.cs (Attribute.Resolve): Catch the
8185         NullReferenceException and report it since it isn't supposed to
8186         happen. 
8187
8188 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8189
8190         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8191         LogicalOr and LogicalAnd that can benefit from recursively
8192         handling EmitBranchable.  The code now should be nice for Paolo.
8193
8194 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8195
8196         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8197         the Type lookups, as we perform quite a number of lookups on
8198         non-Types.  This can be removed once we can deterministically tell
8199         whether we have a type or a namespace in advance.
8200
8201         But this might require special hacks from our corlib.
8202
8203         * TODO: updated.
8204
8205         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8206         and double which avoids a conversion from an integer to a double.
8207
8208         * expression.cs: tiny optimization, avoid calling IsConstant,
8209         because it effectively performs the lookup twice.
8210
8211 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8212
8213         But a bogus return here to keep the semantics of the old code
8214         until the Mono runtime is fixed.
8215
8216         * pending.cs (GetMissingInterfaces): New method used to remove all
8217         the interfaces that are already implemented by our parent
8218         classes from the list of pending methods. 
8219
8220         * interface.cs: Add checks for calls after ResolveTypeExpr.
8221
8222 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8223
8224         * class.cs (Class.Emit): Report warning 67: event not used if the
8225         warning level is beyond 3.
8226
8227         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8228         being a NullLiteral.
8229
8230         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8231         specifiers. 
8232
8233         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8234         path that might fail if a type can not be resolved.
8235
8236         * expression.cs (Binary.Emit): Emit unsigned versions of the
8237         operators. 
8238
8239         * driver.cs: use error 5.
8240
8241 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8242
8243         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8244
8245 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8246
8247         * cs-parser.jay (switch_section): A beautiful patch from Martin
8248         Baulig that fixed 33094.
8249
8250 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8251
8252         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8253         Check whether the base is abstract and report an error if so.
8254
8255         * expression.cs (IndexerAccess.DoResolveLValue,
8256         IndexerAccess.DoResolve): ditto. 
8257
8258         (Invocation.DoResolve): ditto.
8259
8260         (Invocation.FullMethodDesc): Improve the report string.
8261
8262         * statement.cs (Block): Eliminate IsVariableDefined as it is
8263         basically just a wrapper for GetVariableInfo.
8264
8265         * ecore.cs (SimpleName): Use new 
8266
8267         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8268         type, as we return the actual parameter ref/unref state on a
8269         different call.
8270
8271 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8272
8273         * support.cs: Return proper flags REF/OUT fixing the previous
8274         commit.  
8275
8276         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8277         not used to mean `ref' but `ref or out' in ParameterReference
8278
8279         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8280         full type signature instead of calling TypeManger.CSharpName
8281         ourselves. 
8282
8283         * support.cs (InternalParameters.ParameterDesc): Do not compare
8284         directly to the modflags, because REF/OUT will actually be bitsets
8285         if set. 
8286
8287         * delegate.cs (VerifyMethod): Check also the modifiers.
8288
8289         * cs-tokenizer.cs: Fix bug where floating point values with an
8290         exponent where a sign was missing was ignored.
8291
8292         * driver.cs: Allow multiple assemblies to be specified in a single
8293         /r: argument
8294
8295 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8296
8297         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8298         because identifiers after a parenthesis would end up in this kind
8299         of production, and we needed to desamiguate it for having casts
8300         like:
8301
8302                 (UserDefinedType *) xxx
8303
8304 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8305
8306         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8307         we should set on the Bindingflags.NonPublic, but not turn on
8308         private_ok.  private_ok controls whether a Private member is
8309         returned (this is chekced on the filter routine), while the
8310         BindingFlags.NonPublic just controls whether private/protected
8311         will be allowed.   This fixes the problem part of the problem of
8312         private properties being allowed to be used in derived classes.
8313
8314         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8315         so we can call the children DoResolveLValue method (this will
8316         properly signal errors on lvalue assignments to base properties)
8317
8318         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8319         getter are null, and we have a property info, we know that this
8320         happened because the lookup failed, so we report an error 122 for
8321         protection level violation.
8322
8323         We also silently return if setter and getter are null in the
8324         resolve functions, this condition only happens if we have flagged
8325         the error before.  This is the other half of the problem. 
8326
8327         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8328         not have accessibility information, that is why we were returning
8329         true in the filter function in typemanager.cs.
8330
8331         To properly report 122 (property is inaccessible because of its
8332         protection level) correctly, we report this error in ResolveAccess
8333         by failing if both the setter and the getter are lacking (ie, the
8334         lookup failed). 
8335
8336         DoResolve and DoLResolve have been modified to check for both
8337         setter/getter being null and returning silently, the reason being
8338         that I did not want to put the knowledge about this error in upper
8339         layers, like:
8340
8341         int old = Report.Errors;
8342         x = new PropertyExpr (...);
8343         if (old != Report.Errors)
8344                 return null;
8345         else
8346                 return x;
8347
8348         So the property expr is returned, but it is invalid, so the error
8349         will be flagged during the resolve process. 
8350
8351         * class.cs: Remove InheritablePropertySignatureCompare from the
8352         class, as we no longer depend on the property signature to compute
8353         whether it is possible to implement a method or not.
8354
8355         The reason is that calling PropertyInfo.GetGetMethod will return
8356         null (in .NET, in Mono it works, and we should change this), in
8357         cases where the Get Method does not exist in that particular
8358         class.
8359
8360         So this code:
8361
8362         class X { public virtual int A { get { return 1; } } }
8363         class Y : X { }
8364         class Z : Y { public override int A { get { return 2; } } }
8365
8366         Would fail in Z because the parent (Y) would not have the property
8367         defined.  So we avoid this completely now (because the alternative
8368         fix was ugly and slow), and we now depend exclusively on the
8369         method names.
8370
8371         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8372         reference method, instead of using the property.
8373
8374         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8375         routines are gone now.
8376
8377         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8378         names, they were incorrectly named.
8379
8380         * cs-tokenizer.cs: Return are more gentle token on failure. 
8381
8382         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8383         had an out-of-sync index variable, which caused it to remove from
8384         the list of pending methods the wrong method sometimes.
8385
8386 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8387
8388         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8389         CanWrite, because those refer to this particular instance of the
8390         property, and do not take into account the fact that we can
8391         override single members of a property.
8392
8393         Constructor requires an EmitContext.  The resolution process does
8394         not happen here, but we need to compute the accessors before,
8395         because the resolution does not always happen for properties.
8396
8397         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8398         subclass, before we did not update this flag, but we did update
8399         bindingflags. 
8400
8401         (GetAccessors): Drop this routine, as it did not work in the
8402         presence of partially overwritten set/get methods. 
8403
8404         Notice that this broke the cs1540 detection, but that will require
8405         more thinking. 
8406
8407 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8408
8409         * class.cs:
8410         * codegen.cs:
8411         * driver.cs: issue a warning instead of an error if we don't support
8412         debugging for the platform. Also ignore a couple of errors that may
8413         arise when trying to write the symbols. Undo my previous patch.
8414
8415 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8416
8417         * driver.cs: ignore /debug switch except for Unix platforms.
8418
8419 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8420
8421         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8422
8423 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8424
8425         * driver.cs: Do not make mcs-debug conditional, so we do not break
8426         builds that use it.
8427
8428         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8429         review this patch.  But basically after all the children variables
8430         have been merged, the value of "Breaks" was not being set to
8431         new_breaks for Switch blocks.  I think that it should be set after
8432         it has executed.  Currently I set this to the value of new_breaks,
8433         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8434         conservative, but I do not understand this code very well.
8435
8436         I did not break anything in the build, so that is good ;-)
8437
8438         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8439
8440 2002-10-20  Mark Crichton  <crichton@gimp.org>
8441
8442         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8443
8444 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8445
8446         * cfold.cs: Fixed compile blocker.
8447
8448 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8449
8450         * driver.cs: I was chekcing the key, not the file.
8451
8452 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8453
8454         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8455         message that we were generating - we just need to silently return
8456         a null.
8457
8458 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8459
8460         * class.cs (Event.Define): Change my previous commit, as this
8461         breaks the debugger.  This is a temporary hack, as it seems like
8462         the compiler is generating events incorrectly to begin with.
8463
8464         * expression.cs (Binary.ResolveOperator): Added support for 
8465         "U operator - (E x, E y)"
8466
8467         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8468         y)".
8469
8470         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8471         init-only variables, but this path did not take into account that
8472         there might be also instance readonly variables.  Correct this
8473         problem. 
8474
8475         This fixes bug 32253
8476
8477         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8478         delegates as well.
8479
8480         * driver.cs: Change the extension for modules to `netmodule'
8481
8482         * cs-parser.jay: Improved slightly the location tracking for
8483         the debugger symbols.
8484
8485         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8486         modifiers that were specified instead of the hardcoded value
8487         (FamAndAssem).  This was basically ignoring the static modifier,
8488         and others.  Fixes 32429.
8489
8490         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8491         fixed a bug in the process (32476)
8492
8493         * expression.cs (ArrayAccess.EmitAssign): Patch from
8494         hwang_rob@yahoo.ca that fixes bug 31834.3
8495
8496 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8497
8498         * driver.cs: Make the module extension .netmodule.
8499
8500 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8501
8502         * driver.cs: Report an error if the resource file is not found
8503         instead of crashing.
8504
8505         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8506         false, like Emit does.
8507
8508 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8509
8510         * typemanager.cs: Remove unused private member.  Also reported mcs
8511         bug to report this as a warning like csc.
8512
8513 2002-10-15  Martin Baulig  <martin@gnome.org>
8514
8515         * statement.cs (Statement.Emit): Made this a virtual method; emits
8516         the line number info and calls DoEmit().
8517         (Statement.DoEmit): New protected abstract method, formerly knows
8518         as Statement.Emit().
8519
8520         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8521
8522 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8523
8524         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8525         have fixed a remaining problem: not every AddXXXX was adding a
8526         fully qualified name.  
8527
8528         Now everyone registers a fully qualified name in the DeclSpace as
8529         being defined instead of the partial name.  
8530
8531         Downsides: we are slower than we need to be due to the excess
8532         copies and the names being registered this way.  
8533
8534         The reason for this is that we currently depend (on the corlib
8535         bootstrap for instance) that types are fully qualified, because
8536         we dump all the types in the namespace, and we should really have
8537         types inserted into the proper namespace, so we can only store the
8538         basenames in the defined_names array.
8539
8540 2002-10-10  Martin Baulig  <martin@gnome.org>
8541
8542         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8543         from bug #31834, see the bug report for a testcase which is
8544         miscompiled.
8545
8546 2002-10-10  Martin Baulig  <martin@gnome.org>
8547
8548         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8549         flow analysis code for this.
8550
8551         * statement.cs (Do, While, For): Tell the flow analysis code about
8552         infinite loops.
8553         (FlowBranching.UsageVector): Added support for infinite loops.
8554         (Block.Resolve): Moved the dead code elimination here and use flow
8555         analysis to do it.
8556
8557 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8558
8559         * class.cs (Field.Define): Catch cycles on struct type
8560         definitions. 
8561
8562         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8563         fields if the fields are static.  We only need to check instance
8564         fields. 
8565
8566         * expression.cs (As.DoResolve): Test for reference type.
8567
8568         * statement.cs (Using.ResolveExpression): Use
8569         ConvertImplicitRequired, not ConvertImplicit which reports an
8570         error on failture
8571         (Using.ResolveLocalVariableDecls): ditto.
8572
8573         * expression.cs (Binary.ResolveOperator): Report errors in a few
8574         places where we had to.
8575
8576         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8577
8578 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8579
8580         * expression.cs: Use StoreFromPtr instead of extracting the type
8581         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8582
8583         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8584         an enumeration value to a System.Enum, but System.Enum is not a
8585         value type, but an class type, so we need to box.
8586
8587         (Expression.ConvertExplicit): One codepath could return
8588         errors but not flag them.  Fix this.  Fixes #31853
8589
8590         * parameter.cs (Resolve): Do not allow void as a parameter type.
8591
8592 2002-10-06  Martin Baulig  <martin@gnome.org>
8593
8594         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8595         if it's a class type and not a struct.  Fixes #31815.
8596
8597 2002-10-06  Martin Baulig  <martin@gnome.org>
8598
8599         * statement.cs: Reworked the flow analysis code a bit to make it
8600         usable for dead code elimination.
8601
8602 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8603
8604         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8605
8606 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8607
8608         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8609         to fix the test 165, will investigate deeper.
8610
8611 2002-10-04  Martin Baulig  <martin@gnome.org>
8612
8613         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8614         finally blocks actually work.
8615         (Try.Resolve): We don't need to create a sibling for `finally' if
8616         there is no finally block.
8617
8618 2002-10-04  Martin Baulig  <martin@gnome.org>
8619
8620         * class.cs (Constructor.Define): The default accessibility for a
8621         non-default constructor is private, not public.
8622
8623 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8624
8625         * class.cs (Constructor): Make AllowedModifiers public, add
8626         EXTERN.
8627
8628         * cs-parser.jay: Perform the modifiers test here, as the
8629         constructor for the Constructor class usually receives a zero
8630         because of the way we create it (first we create, later we
8631         customize, and we were never checking the modifiers).
8632
8633         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8634         is a version of LookupTypeReflection that includes the type-name
8635         cache.  This can be used as a fast path for functions that know
8636         the fully qualified name and are only calling into *.GetType() to
8637         obtain a composed type.
8638
8639         This is also used by TypeManager.LookupType during its type
8640         composition.
8641
8642         (LookupType): We now also track the real type name, as sometimes
8643         we can get a quey for the real type name from things like
8644         ComposedCast.  This fixes bug 31422.
8645
8646         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8647         complete type fullname, it does not have to go through the type
8648         resolution system to obtain the composed version of the type (for
8649         obtaining arrays or pointers).
8650
8651         (Conditional.Emit): Use the EmitBoolExpression to
8652         generate nicer code, as requested by Paolo.
8653
8654         (ArrayCreation.CheckIndices): Use the patch from
8655         hwang_rob@yahoo.ca to validate the array initializers. 
8656
8657 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8658
8659         * class.cs (ConstructorInitializer.Emit): simplify code by using
8660         Invocation.EmitCall, and at the same time, fix the bugs in calling
8661         parent constructors that took variable arguments. 
8662
8663         * ecore.cs (Expression.ConvertNumericExplicit,
8664         Expression.ImplicitNumericConversion): Remove the code that
8665         manually wrapped decimal (InternalTypeConstructor call is now gone
8666         as well).
8667
8668         * expression.cs (Cast.TryReduce): Also handle decimal types when
8669         trying to perform a constant fold on the type.
8670
8671         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8672
8673         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8674         that only turned off an error report, and did nothing else. 
8675
8676 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8677
8678         * driver.cs: Handle and ignore /fullpaths
8679
8680 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8681
8682         * expression.cs (Binary.ResolveOperator): Catch the case where
8683         DoNumericPromotions returns true, 
8684
8685         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8686
8687 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8688
8689         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8690         report error 70.
8691
8692 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8693
8694         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8695         conversion exists, but it is also required that the conversion be
8696         performed.  This manifested in "(Type64Enum) 2".  
8697
8698         * class.cs (TypeManager.AddMethod): The fix is not to change
8699         AddEnum, because that one was using a fully qualified name (every
8700         DeclSpace derivative does), but to change the AddMethod routine
8701         that was using an un-namespaced name.  This now correctly reports
8702         the duplicated name.
8703
8704         Revert patch until I can properly fix it.  The issue
8705         is that we have a shared Type space across all namespaces
8706         currently, which is wrong.
8707
8708         Options include making the Namespace a DeclSpace, and merge
8709         current_namespace/current_container in the parser.
8710
8711 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8712
8713         * cs-parser.jay: Improve error reporting when we get a different
8714         kind of expression in local_variable_type and
8715         local_variable_pointer_type. 
8716
8717         Propagate this to avoid missleading errors being reported.
8718
8719         * ecore.cs (ImplicitReferenceConversion): treat
8720         TypeManager.value_type as a target just like object_type.   As
8721         code like this:
8722
8723         ValueType v = 1;
8724
8725         Is valid, and needs to result in the int 1 being boxed before it
8726         is assigned to the value type v.
8727
8728         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8729         to validate the enumeration name.
8730
8731         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8732         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8733         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8734
8735         * ecore.cs (TryImplicitIntConversion): When doing an
8736         implicit-enumeration-conversion, check if the type is 64-bits and
8737         perform a conversion before passing to EnumConstant.
8738
8739 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8740
8741         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8742         report ambiguous type references.  Unlike the MS version, we
8743         report what the ambiguity is.   Innovation at work ;-)
8744
8745         (DeclSpace.FindType): Require a location argument to
8746         display when we display an ambiguous error.
8747
8748         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8749
8750         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8751
8752         * expression.cs (EmitDynamicInitializers): Apply patch from
8753         hwang_rob@yahoo.ca that fixes the order in which we emit our
8754         initializers. 
8755
8756 2002-09-21  Martin Baulig  <martin@gnome.org>
8757
8758         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8759         delegate takes no arguments.
8760
8761 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8762
8763         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8764         from integers.
8765
8766         * expression.cs: Extract the underlying type.
8767
8768         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8769
8770         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8771
8772 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8773
8774         * class.cs (TypeContainer.DefineType): We can not use the nice
8775         PackingSize with the size set to 1 DefineType method, because it
8776         will not allow us to define the interfaces that the struct
8777         implements.
8778
8779         This completes the fixing of bug 27287
8780
8781         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8782         means also structs.  This fixes part of the problem. 
8783         (Expresion.ImplicitReferenceConversionExists): ditto.
8784
8785         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8786         error if there were no errors reported during the type lookup
8787         process, to avoid duplicates or redundant errors.  Without this
8788         you would get an ambiguous errors plus a type not found.  We have
8789         beaten the user enough with the first error.  
8790
8791         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8792         reference. 
8793
8794         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8795         during the resolution process, stop the lookup, this avoids
8796         repeated error reports (same error twice).
8797
8798         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8799
8800         * typemanager.cs (LookupType): Redo the type lookup code to match
8801         the needs of System.Reflection.  
8802
8803         The issue is that System.Reflection requires references to nested
8804         types to begin with a "+" sign instead of a dot.  So toplevel
8805         types look like: "NameSpace.TopLevelClass", and nested ones look
8806         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8807         levels. 
8808
8809 2002-09-19  Martin Baulig  <martin@gnome.org>
8810
8811         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8812         says that a method always returns or always throws an exception,
8813         don't report the CS0161.
8814
8815         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8816         set `Returns = new_returns'.
8817
8818 2002-09-19  Martin Baulig  <martin@gnome.org>
8819
8820         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8821         to an enum constant, check for a CS0176.
8822
8823 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8824
8825         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8826         for operators that must be in pairs and report errors.
8827
8828         * ecore.cs (SimpleName.DoResolveType): During the initial type
8829         resolution process, when we define types recursively, we must
8830         check first for types in our current scope before we perform
8831         lookups in the enclosing scopes.
8832
8833         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8834
8835         (Invocation.VerifyArgumentsCompat): Call
8836         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8837         I thought we were supposed to always call this, but there are a
8838         few places in the code where we dont do it.
8839
8840 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8841
8842         * driver.cs: Add support in -linkres and -resource to specify the
8843         name of the identifier.
8844
8845 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8846
8847         * ecore.cs (StandardConversionExists): Sync with the conversion
8848         code: allow anything-* to void* conversions.
8849
8850         (FindMostSpecificSource): Use an Expression argument
8851         instead of a Type, because we might be handed over a Literal which
8852         gets a few more implicit conversions that plain types do not.  So
8853         this information was being lost.
8854
8855         Also, we drop the temporary type-holder expression when not
8856         required.
8857
8858 2002-09-17  Martin Baulig  <martin@gnome.org>
8859
8860         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8861         this is an explicit interface implementation.
8862
8863 2002-09-17  Martin Baulig  <martin@gnome.org>
8864
8865         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8866         different `IndexerName' attributes.
8867
8868         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8869         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8870         virtual CommonResolve().
8871
8872 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8873
8874         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8875         and convert that to the UnderlyingType.
8876
8877         * statement.cs (Foreach.Resolve): Indexers are just like variables
8878         or PropertyAccesses.
8879
8880         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8881         inside quoted strings, we were not doing this before.
8882
8883 2002-09-16  Martin Baulig  <martin@gnome.org>
8884
8885         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8886         resolve it.  This is needed for the definite assignment check of the
8887         instance expression, fixes bug #29846.
8888         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8889
8890 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8891
8892         * parameter.cs: Fix compile error.  Cannot reference static member
8893         from an instance object.  Is this an mcs bug?
8894
8895 2002-09-14  Martin Baulig  <martin@gnome.org>
8896
8897         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8898         multiple times.  Fixes bug #30295, added test-166.cs.
8899
8900 2002-09-14  Martin Baulig  <martin@gnome.org>
8901
8902         * statement.cs (Block.Emit): Don't emit unreachable code.
8903         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8904         `break' statements.
8905         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8906
8907 2002-09-14  Martin Baulig  <martin@gnome.org>
8908
8909         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8910         is set.
8911
8912 2002-09-14  Martin Baulig  <martin@gnome.org>
8913
8914         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8915         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8916         be false on the ms runtime.
8917
8918 2002-09-13  Martin Baulig  <martin@gnome.org>
8919
8920         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8921         the CS0038 error message.
8922
8923 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8924
8925         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8926         constant inside, return it.
8927
8928 2002-09-12  Martin Baulig  <martin@gnome.org>
8929
8930         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8931         implicit conversion can be done between enum types.
8932
8933         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8934         check whether an implicit conversion to the current enum's UnderlyingType
8935         exists and report an error if not.
8936
8937         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8938         without debugging support.
8939
8940         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8941         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8942
8943 2002-09-12  Martin Baulig  <martin@gnome.org>
8944
8945         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8946
8947         * ecore.cs (IMemberExpr.DeclaringType): New property.
8948         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8949         nonstatic member of an outer type (CS0038).
8950
8951 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8952
8953         * driver.cs: Activate the using-error detector at warning level
8954         4 (at least for MS-compatible APIs).
8955
8956         * namespace.cs (VerifyUsing): Small buglett fix.
8957
8958         * pending.cs (PendingImplementation): pass the container pointer. 
8959
8960         * interface.cs (GetMethods): Allow for recursive definition.  Long
8961         term, I would like to move every type to support recursive
8962         definitions, not the current ordering mechanism that we have right
8963         now.
8964
8965         The situation is this: Attributes are handled before interfaces,
8966         so we can apply attributes to interfaces.  But some attributes
8967         implement interfaces, we will now handle the simple cases
8968         (recursive definitions will just get an error).  
8969
8970         * parameter.cs: Only invalidate types at the end if we fail to
8971         lookup all types.  
8972
8973 2002-09-09  Martin Baulig  <martin@gnome.org>
8974
8975         * ecore.cs (PropertyExpr.Emit): Also check for
8976         TypeManager.system_int_array_get_length so this'll also work when
8977         compiling corlib.  Fixes #30003.
8978
8979 2002-09-09  Martin Baulig  <martin@gnome.org>
8980
8981         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8982         and throw an exception if we can't get the type's size.  Fixed #30040,
8983         added test-165.cs.
8984
8985 2002-09-09  Martin Baulig  <martin@gnome.org>
8986
8987         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8988
8989         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8990         context.  Fixes bug #30027.
8991
8992         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8993         virtual functions.  Fixes bug #30043, added test-164.cs.
8994
8995 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8996
8997         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8998
8999 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9000
9001         * driver.cs: Use an object to get the windows codepage since it's not a
9002         static property.
9003
9004 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9005
9006         * statement.cs (For.Emit): for infinite loops (test == null)
9007         return whether there is a break inside, not always "true".
9008
9009         * namespace.cs (UsingEntry): New struct to hold the name of the
9010         using definition, the location where it is defined, and whether it
9011         has been used in a successful type lookup.
9012
9013         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9014         strings.
9015
9016         * decl.cs: ditto.
9017
9018 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9019
9020         * attribute.cs : Fix incorrect code which relied on catching
9021         a NullReferenceException to detect a null being passed in
9022         where an object was expected.
9023
9024 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9025
9026         * statement.cs (Try): flag the catch variable as assigned
9027
9028         * expression.cs (Cast): Simplified by using ResolveType instead of
9029         manually resolving.
9030
9031         * statement.cs (Catch): Fix bug by using ResolveType.
9032
9033 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9034
9035         * expression.cs (BetterConversion): Special case for when we have
9036         a NullLiteral as the argument and we have to choose between string
9037         and object types - we choose string the way csc does.
9038
9039         * attribute.cs (Attribute.Resolve): Catch the
9040         NullReferenceException and report error #182 since the Mono
9041         runtime no more has the bug and having this exception raised means
9042         we tried to select a constructor which takes an object and is
9043         passed a null.
9044
9045 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9046
9047         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9048         message (1502, 1503) when we can't locate a method after overload
9049         resolution. This is much more informative and closes the bug
9050         Miguel reported.
9051
9052         * interface.cs (PopulateMethod): Return if there are no argument
9053         types. Fixes a NullReferenceException bug.
9054
9055         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9056         expressions too. Previously we were checking only in one place for
9057         positional arguments leaving out named arguments.
9058
9059         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9060         type to the enum type is not allowed. Remove code corresponding to
9061         that.
9062
9063         (ConvertNumericExplicit): Allow explicit conversions from
9064         the underlying type to enum type. This precisely follows the spec
9065         and closes a bug filed by Gonzalo.
9066
9067 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9068
9069         * compiler.csproj:
9070         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9071
9072 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9073
9074         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9075         it was important that we stored the right value after the
9076         reduction in `converted'.
9077
9078 2002-09-04  Martin Baulig  <martin@gnome.org>
9079
9080         * location.cs (Location.SymbolDocument): Use full pathnames for the
9081         source files.
9082
9083 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9084
9085         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9086         of the expression resolve mechanism, because that will catch the
9087         SimpleName error failures.
9088
9089         (Conditional): If we can not resolve the
9090         expression, return, do not crash.
9091
9092 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9093
9094         * cs-tokenizer.cs:
9095         (location): display token name instead of its number.
9096
9097 2002-08-28  Martin Baulig  <martin@gnome.org>
9098
9099         * expression.cs (Binary.ResolveOperator): Don't silently return
9100         but return an error if an operator cannot be applied between two
9101         enum types.
9102
9103 2002-08-28  Martin Baulig  <martin@gnome.org>
9104
9105         * class.cs (Constructor.Define): Set the permission attributes
9106         correctly instead of making all constructors public.
9107
9108 2002-08-28  Martin Baulig  <martin@gnome.org>
9109
9110         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9111         for private members before reporting a CS0103; if we find anything,
9112         it's a CS0122.
9113
9114 2002-08-28  Martin Baulig  <martin@gnome.org>
9115
9116         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9117         to check whether `closure_start_type == closure_invocation_type',
9118         we also need to check whether `m.DeclaringType == closure_invocation_type'
9119         before bypassing the permission checks.  We might be accessing
9120         protected/private members from the base class.
9121         (TypeManager.RealMemberLookup): Only set private_ok if private
9122         members were requested via BindingFlags.NonPublic.
9123
9124         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9125
9126         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9127         MethodGroupExpr.IsExplicitImpl if appropriate.
9128         (Invocation.DoResolve): Don't report the CS0120 for explicit
9129         interface implementations.
9130
9131 2002-08-27  Martin Baulig  <martin@gnome.org>
9132
9133         * expression.cs (Invocation.DoResolve): If this is a static
9134         method and we don't have an InstanceExpression, we must report
9135         a CS0120.
9136
9137 2002-08-25  Martin Baulig  <martin@gnome.org>
9138
9139         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9140         `==' between a valuetype and an object.
9141
9142 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9143
9144         * ecore.cs (TypeExpr): Provide a ToString method.
9145
9146 2002-08-24  Martin Baulig  <martin@gnome.org>
9147
9148         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9149         now called proggie.dbg and it's a binary file.
9150
9151 2002-08-23  Martin Baulig  <martin@gnome.org>
9152
9153         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9154
9155 2002-08-23  Martin Baulig  <martin@gnome.org>
9156
9157         * struct.cs (MyStructInfo.ctor): Make this work with empty
9158         structs; it's not allowed to use foreach() on null.
9159
9160 2002-08-23  Martin Baulig  <martin@gnome.org>
9161
9162         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9163         writer the full pathname of the generated assembly.
9164
9165 2002-08-23  Martin Baulig  <martin@gnome.org>
9166
9167         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9168         A `finally' block never returns or breaks; improved handling of
9169         unreachable code.
9170
9171 2002-08-23  Martin Baulig  <martin@gnome.org>
9172
9173         * statement.cs (Throw.Resolve): Allow `throw null'.
9174
9175 2002-08-23  Martin Baulig  <martin@gnome.org>
9176
9177         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9178         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9179         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9180         MemberLookup would return a wrong event if this is an explicit
9181         interface implementation and the class has an event with the same
9182         name.
9183
9184 2002-08-23  Martin Baulig  <martin@gnome.org>
9185
9186         * statement.cs (Block.AddChildVariableNames): New public method.
9187         (Block.AddChildVariableName): Likewise.
9188         (Block.IsVariableNameUsedInChildBlock): Likewise.
9189         (Block.AddVariable): Check whether a variable name has already
9190         been used in a child block.
9191
9192         * cs-parser.jay (declare_local_variables): Mark all variable names
9193         from the current block as being used in a child block in the
9194         implicit block.
9195
9196 2002-08-23  Martin Baulig  <martin@gnome.org>
9197
9198         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9199         find the symbol writer.
9200
9201         * driver.cs: csc also allows the arguments to /define being
9202         separated by commas, not only by semicolons.
9203
9204 2002-08-23  Martin Baulig  <martin@gnome.org>
9205
9206         * interface.cs (Interface.GetMembers): Added static check for events.
9207
9208 2002-08-15  Martin Baulig  <martin@gnome.org>
9209
9210         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9211         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9212
9213         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9214         why the MethodData.EmitDestructor() change was necessary.
9215
9216 2002-08-20  Martin Baulig  <martin@gnome.org>
9217
9218         * class.cs (TypeContainer.FindMembers): Added static check for events.
9219
9220         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9221
9222         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9223         use Type.GetEvents(), not Type.FindMembers().
9224
9225 2002-08-20  Martin Baulig  <martin@gnome.org>
9226
9227         * decl.cs (MemberCache): Added a special method cache which will
9228         be used for method-only searched.  This ensures that a method
9229         search will return a MethodInfo with the correct ReflectedType for
9230         inherited methods.      
9231
9232 2002-08-20  Martin Baulig  <martin@gnome.org>
9233
9234         * decl.cs (DeclSpace.FindMembers): Made this public.
9235
9236 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9237
9238         * delegate.cs: fixed build on windows.
9239         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9240
9241 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9242
9243         * ecore.cs (StandardConversionExists): Return a false
9244         if we are trying to convert the void type to anything else
9245         since that is not allowed.
9246
9247         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9248         we flag error 70 in the event an event is trying to be accessed
9249         directly from outside the declaring type.
9250
9251 2002-08-20  Martin Baulig  <martin@gnome.org>
9252
9253         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9254         MemberCache from typemanager.cs to decl.cs.
9255
9256 2002-08-19  Martin Baulig  <martin@gnome.org>
9257
9258         * class.cs (TypeContainer): Implement IMemberContainer.
9259         (TypeContainer.DefineMembers): Create the MemberCache.
9260         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9261         return public members if BindingFlags.Public was given, check
9262         whether members are static.
9263
9264 2002-08-16  Martin Baulig  <martin@gnome.org>
9265
9266         * decl.cs (DeclSpace.Define): Splitted this in Define and
9267         DefineMembers.  DefineMembers is called first and initializes the
9268         MemberCache.
9269
9270         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9271         DefineMembers() on all our DeclSpaces.
9272
9273         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9274         but call DefineMembers() on all nested interfaces.  We call their
9275         Define() in our new Define() function.
9276
9277         * interface.cs (Interface): Implement IMemberContainer.
9278         (Interface.Define): Moved all code except the attribute stuf to
9279         DefineMembers().
9280         (Interface.DefineMembers): Initialize the member cache.
9281
9282         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9283         need this anymore since we can use MemberCache.FindMembers directly.
9284
9285 2002-08-19  Martin Baulig  <martin@gnome.org>
9286
9287         * typemanager.cs (MemberCache): When creating the cache for an
9288         interface type, add all inherited members.
9289         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9290         to `out bool used_cache' and documented it.
9291         (TypeManager.MemberLookup): If we already used the cache in the first
9292         iteration, we don't need to do the interfaces check.
9293
9294 2002-08-19  Martin Baulig  <martin@gnome.org>
9295
9296         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9297         here from IMemberFinder and don't implement this interface anymore.
9298         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9299
9300         * typemanager.cs (IMemberFinder): This interface is now only used by
9301         classes which actually support the member cache.
9302         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9303         since we only put DeclSpaces into this Hashtable.
9304         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9305         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9306
9307 2002-08-16  Martin Baulig  <martin@gnome.org>
9308
9309         * typemanager.cs (ICachingMemberFinder): Removed.
9310         (IMemberFinder.MemberCache): New property.
9311         (TypeManager.FindMembers): Merged this with RealFindMembers().
9312         This function will never be called from TypeManager.MemberLookup()
9313         so we can't use the cache here, just the IMemberFinder.
9314         (TypeManager.MemberLookup_FindMembers): Check whether the
9315         IMemberFinder has a MemberCache and call the cache's FindMembers
9316         function.
9317         (MemberCache): Rewrote larger parts of this yet another time and
9318         cleaned it up a bit.
9319
9320 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9321
9322         * driver.cs (LoadArgs): Support quoting.
9323
9324         (Usage): Show the CSC-like command line arguments.
9325
9326         Improved a few error messages.
9327
9328 2002-08-15  Martin Baulig  <martin@gnome.org>
9329
9330         * typemanager.cs (IMemberContainer.Type): New property.
9331         (IMemberContainer.IsInterface): New property.
9332
9333         The following changes are conditional to BROKEN_RUNTIME, which is
9334         defined at the top of the file.
9335
9336         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9337         class'es members, but add all members from TypeHandle.ObjectType
9338         if we're an interface.
9339         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9340         is the current type.
9341         (MemberCache.CacheEntry.Container): Removed this field.
9342         (TypeHandle.GetMembers): Include inherited members.
9343
9344 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9345
9346         * typemanager.cs: fixed compilation and added a comment on a field that
9347         is never used.
9348
9349 2002-08-15  Martin Baulig  <martin@gnome.org>
9350
9351         * class.cs (ConstructorInitializer.Resolve): In the
9352         Expression.MemberLookup call, use the queried_type as
9353         invocation_type.
9354
9355         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9356         declared' attribute, it's always true.
9357         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9358         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9359         temporary wrapper for FindMembers which tells MemberLookup whether
9360         members from the base classes are included in the return value.
9361         This will go away soon.
9362         (TypeManager.MemberLookup): Use this temporary hack here; once the
9363         new MemberCache is completed, we don't need to do the DeclaredOnly
9364         looping here anymore since the MemberCache will take care of this.
9365         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9366         (MemberCache): When creating the MemberCache for a class, get
9367         members from the current class and all its base classes.
9368         (MemberCache.CacheEntry.Container): New field.  This is a
9369         temporary hack until the Mono runtime is fixed to distinguish
9370         between ReflectedType and DeclaringType.  It allows us to use MCS
9371         with both the MS runtime and the unfixed Mono runtime without
9372         problems and without accecting performance.
9373         (MemberCache.SearchMembers): The DeclaredOnly looping from
9374         TypeManager.MemberLookup is now done here.      
9375
9376 2002-08-14  Martin Baulig  <martin@gnome.org>
9377
9378         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9379         Type.GetFields on dynamic types but get the fields from the
9380         corresponding TypeContainer.
9381         (MyStructInfo.GetStructInfo): Added check for enum types.
9382
9383         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9384         (MemberList.SyncRoot): Implemented.
9385         (TypeManager.FilterWithClosure): No need to check permissions if
9386         closure_start_type == closure_invocation_type, don't crash if
9387         closure_invocation_type is null.
9388
9389 2002-08-13  Martin Baulig  <martin@gnome.org>
9390
9391         Rewrote TypeContainer.FindMembers to use a member cache.  This
9392         gives us a speed increase of about 35% for the self-hosting MCS
9393         build and of about 15-20% for the class libs (both on GNU/Linux).
9394
9395         * report.cs (Timer): New class to get enhanced profiling.  This
9396         whole class is "TIMER" conditional since it remarkably slows down
9397         compilation speed.
9398
9399         * class.cs (MemberList): New class.  This is an IList wrapper
9400         which we're now using instead of passing MemberInfo[]'s around to
9401         avoid copying this array unnecessarily.
9402         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9403         (ICachingMemberFinder, IMemberContainer): New interface.
9404         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9405         has already been checked, otherwise use it for the name comparision.
9406         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9407         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9408         if possible.  Returns a MemberList, not a MemberInfo [].
9409         (TypeHandle): New class, implements IMemberContainer.  We create
9410         one instance of this class per type, it contains a MemberCache
9411         which is used to do the member lookups.
9412         (MemberCache): New class.  Each instance of this class contains
9413         all members of a type and a name-based hash table.
9414         (MemberCache.FindMembers): This is our new member lookup
9415         function.  First, it looks up all members of the requested name in
9416         the hash table.  Then, it walks this list and sorts out all
9417         applicable members and returns them.
9418
9419 2002-08-13  Martin Baulig  <martin@gnome.org>
9420
9421         In addition to a nice code cleanup, this gives us a performance
9422         increase of about 1.4% on GNU/Linux - not much, but it's already
9423         half a second for the self-hosting MCS compilation.
9424
9425         * typemanager.cs (IMemberFinder): New interface.  It is used by
9426         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9427         Enum, Delegate or Interface.
9428         (TypeManager.finder_to_member_finder): New PtrHashtable.
9429         (TypeManager.finder_to_container): Removed.
9430         (TypeManager.finder_to_delegate): Removed.
9431         (TypeManager.finder_to_interface): Removed.
9432         (TypeManager.finder_to_enum): Removed.
9433
9434         * interface.cs (Interface): Implement IMemberFinder.
9435
9436         * delegate.cs (Delegate): Implement IMemberFinder.
9437
9438         * enum.cs (Enum): Implement IMemberFinder.
9439
9440         * class.cs (TypeContainer): Implement IMemberFinder.
9441
9442 2002-08-12  Martin Baulig  <martin@gnome.org>
9443
9444         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9445
9446 2002-08-12  Martin Baulig  <martin@gnome.org>
9447
9448         * ecore.cs (ITypeExpression): New interface for expressions which
9449         resolve to a type.
9450         (TypeExpression): Renamed to TypeLookupExpression.
9451         (Expression.DoResolve): If we're doing a types-only lookup, the
9452         expression must implement the ITypeExpression interface and we
9453         call DoResolveType() on it.
9454         (SimpleName): Implement the new ITypeExpression interface.
9455         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9456         hack, the situation that we're only looking up types can't happen
9457         anymore when this method is called.  Moved the type lookup code to
9458         DoResolveType() and call it.
9459         (SimpleName.DoResolveType): This ITypeExpression interface method
9460         is now doing the types-only lookup.
9461         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9462         (ResolveFlags): Added MaskExprClass.
9463
9464         * expression.cs (MemberAccess): Implement the ITypeExpression
9465         interface.
9466         (MemberAccess.DoResolve): Added support for a types-only lookup
9467         when we're called via ITypeExpression.DoResolveType().
9468         (ComposedCast): Implement the ITypeExpression interface.
9469
9470         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9471         Expression.Resolve() with ResolveFlags.Type instead.
9472
9473 2002-08-12  Martin Baulig  <martin@gnome.org>
9474
9475         * interface.cs (Interface.Define): Apply attributes.
9476
9477         * attribute.cs (Attribute.ApplyAttributes): Added support for
9478         interface attributes.
9479
9480 2002-08-11  Martin Baulig  <martin@gnome.org>
9481
9482         * statement.cs (Block.Emit): Only check the "this" variable if we
9483         do not always throw an exception.
9484
9485         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9486         whether the property has a set accessor.
9487
9488 2002-08-11  Martin Baulig  <martin@gnome.org>
9489
9490         Added control flow analysis support for structs.
9491
9492         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9493         with control flow analysis turned off.
9494         (IVariable): New interface.
9495         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9496         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9497         (FieldExpr.DoResolve): Resolve the instance expression with flow
9498         analysis turned off and do the definite assignment check after the
9499         resolving when we know what the expression will resolve to.
9500
9501         * expression.cs (LocalVariableReference, ParameterReference):
9502         Implement the new IVariable interface, only call the flow analysis
9503         code if ec.DoFlowAnalysis is true.
9504         (This): Added constructor which takes a Block argument.  Implement
9505         the new IVariable interface.
9506         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9507         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9508         This does the definite assignment checks for struct members.
9509
9510         * class.cs (Constructor.Emit): If this is a non-static `struct'
9511         constructor which doesn't have any initializer, call
9512         Block.AddThisVariable() to tell the flow analysis code that all
9513         struct elements must be initialized before control returns from
9514         the constructor.
9515
9516         * statement.cs (MyStructInfo): New public class.
9517         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9518         argument to this indexer.  If non-zero, check an individual struct
9519         member, not the whole struct.
9520         (FlowBranching.CheckOutParameters): Check struct members.
9521         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9522         overloaded versions of these methods which take an additional
9523         `int field_idx' argument to check struct members.
9524         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9525         overloaded versions of these methods which take an additional
9526         `string field_name' argument to check struct member.s
9527         (VariableInfo): Implement the IVariable interface.
9528         (VariableInfo.StructInfo): New public property.  Returns the
9529         MyStructInfo instance of the variable if it's a struct or null.
9530         (Block.AddThisVariable): New public method.  This is called from
9531         Constructor.Emit() for non-static `struct' constructor which do
9532         not have any initializer.  It creates a special variable for the
9533         "this" instance variable which will be checked by the flow
9534         analysis code to ensure that all of the struct's fields are
9535         initialized before control returns from the constructor.
9536         (UsageVector): Added support for struct members.  If a
9537         variable/parameter is a struct with N members, we reserve a slot
9538         in the usage vector for each member.  A struct is considered fully
9539         initialized if either the struct itself (slot 0) or all its
9540         members are initialized.
9541
9542 2002-08-08  Martin Baulig  <martin@gnome.org>
9543
9544         * driver.cs (Driver.MainDriver): Only report an error CS5001
9545         if there were no compilation errors.
9546
9547         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9548         `UnsafeContext' property to determine whether the parent is in
9549         unsafe context rather than checking the parent's ModFlags:
9550         classes nested in an unsafe class are unsafe as well.
9551
9552 2002-08-08  Martin Baulig  <martin@gnome.org>
9553
9554         * statement.cs (UsageVector.MergeChildren): Distinguish between
9555         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9556         we return.  Added test17() and test18() to test-154.cs.
9557
9558 2002-08-08  Martin Baulig  <martin@gnome.org>
9559
9560         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9561         Family access, make sure the invoking type isn't a subclass of the
9562         queried type (that'd be a CS1540).
9563
9564         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9565         this method which takes an additional `Type invocation_type'.
9566
9567         * expression.cs (BaseAccess.DoResolve): Use the base type as
9568         invocation and query type.
9569         (MemberAccess.DoResolve): If the lookup failed and we're about to
9570         report a CS0122, try a lookup with the ec.ContainerType - if this
9571         succeeds, we must report a CS1540.
9572
9573 2002-08-08  Martin Baulig  <martin@gnome.org>
9574
9575         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9576         (MethodGroupExpr): Implement the IMemberExpr interface.
9577
9578         * expression (MemberAccess.ResolveMemberAccess): No need to have
9579         any special code for MethodGroupExprs anymore, they're now
9580         IMemberExprs.   
9581
9582 2002-08-08  Martin Baulig  <martin@gnome.org>
9583
9584         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9585         Family, FamANDAssem and FamORAssem permissions.
9586         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9587
9588 2002-08-08  Martin Baulig  <martin@gnome.org>
9589
9590         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9591         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9592         or loop block.
9593
9594 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9595
9596         * driver.cs: implemented /resource option to embed managed resources.
9597
9598 2002-08-07  Martin Baulig  <martin@gnome.org>
9599
9600         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9601         (FieldBase.HasFieldInitializer): New public property.
9602         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9603         returns the field initializer and makes sure it is only resolved once.
9604         (TypeContainer.EmitFieldInitializers): Call
9605         FieldBase.GetInitializerExpression to get the initializer, this ensures
9606         that it isn't resolved multiple times.
9607
9608         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9609         the resolving process (SimpleName/MemberLookup) that we're currently
9610         emitting a field initializer (which must not access any instance members,
9611         this is an error CS0236).
9612
9613         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9614         argument, if the `IsFieldInitializer' flag is set, we must report and
9615         error CS0236 and not an error CS0120.   
9616
9617 2002-08-07  Martin Baulig  <martin@gnome.org>
9618
9619         * ecore.cs (IMemberExpr): New public interface.
9620         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9621         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9622         if the expression is an IMemberExpr.
9623
9624         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9625         to be null, implicitly default to `this' if we're non-static in
9626         this case.  Simplified the code a lot by using the new IMemberExpr
9627         interface.  Also fixed bug #28176 here.
9628
9629 2002-08-06  Martin Baulig  <martin@gnome.org>
9630
9631         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9632         ParameterReferences during semantic analysis so that we can do a
9633         type-only search when resolving Cast, TypeOf and SizeOf.
9634         (block): Pass the `current_local_parameters' to the Block's
9635         constructor.
9636
9637         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9638         argument to the constructor.
9639         (ConstructorInitializer.Resolve): Create a temporary implicit
9640         block with the parameters.
9641
9642         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9643         references here if we aren't doing a type-only search.
9644
9645         * statement.cs (Block): Added constructor which takes a
9646         `Parameters parameters' argument.
9647         (Block.Parameters): New public property.
9648
9649         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9650         to `Parameters' and made it public readonly.
9651
9652 2002-08-06  Martin Baulig  <martin@gnome.org>
9653
9654         * ecore.cs (Expression.Warning): Made this public as well.
9655
9656         * report.cs (Report.Debug): Print the contents of collections.
9657
9658 2002-08-06  Martin Baulig  <martin@gnome.org>
9659
9660         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9661         used to tell Resolve() which kinds of expressions it may return.
9662         (Expression.Resolve): Added overloaded version of this method which
9663         takes a `ResolveFlags flags' argument.  This can be used to tell
9664         Resolve() which kinds of expressions it may return.  Reports a
9665         CS0118 on error.
9666         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9667         ResolveFlags.SimpleName.
9668         (Expression.Error118): Added overloaded version of this method which
9669         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9670         which kinds of expressions are allowed.
9671
9672         * expression.cs (Argument.ResolveMethodGroup): New public method.
9673         Resolves an argument, but allows a MethodGroup to be returned.
9674         This is used when invoking a delegate.
9675
9676         * TODO: Updated a bit.
9677
9678 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9679
9680         Fixed compilation with csc.
9681
9682         * ecore.cs: Expression.Error made public. Is this correct? Should
9683         Warning be made public too?
9684
9685         * expression.cs: use ea.Location instead of ea.loc.
9686         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9687
9688 2002-08-06  Martin Baulig  <martin@gnome.org>
9689
9690         * ecore.cs (Expression.loc): Moved the location here instead of
9691         duplicating it in all derived classes.
9692         (Expression.Location): New public property.
9693         (Expression.Error, Expression.Warning): Made them non-static and
9694         removed the location argument.
9695         (Expression.Warning): Added overloaded version which takes an
9696         `int level' argument.
9697         (Expression.Error118): Make this non-static and removed the
9698         expression and location arguments.
9699         (TypeExpr): Added location argument to the constructor.
9700
9701         * expression.cs (StaticCallExpr): Added location argument to
9702         the constructor.
9703         (Indirection, PointerArithmetic): Likewise.
9704         (CheckedExpr, UnCheckedExpr): Likewise.
9705         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9706         (StringPtr): Likewise.
9707
9708
9709 2002-08-05  Martin Baulig  <martin@gnome.org>
9710
9711         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9712
9713         * assign.cs (Assign.DoResolve): Check whether the source
9714         expression is a value or variable.
9715
9716         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9717         while resolving the corresponding blocks.
9718
9719         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9720         an error, don't silently return null.
9721
9722         * statement.cs (Block.AddVariable): Do the error reporting here
9723         and distinguish between CS0128 and CS0136.
9724         (Block.DoResolve): Report all unused labels (warning CS0164).
9725         (LabeledStatement): Pass the location to the constructor.
9726         (LabeledStatement.HasBeenReferenced): New property.
9727         (LabeledStatement.Resolve): Set it to true here.
9728
9729         * statement.cs (Return.Emit): Return success even after reporting
9730         a type mismatch error (CS0126 or CS0127), this is what csc does and
9731         it avoids confusing the users with any consecutive errors.
9732
9733 2002-08-05  Martin Baulig  <martin@gnome.org>
9734
9735         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9736
9737         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9738
9739         * expression.cs (MemberAccess.DoResolve): Silently return if an
9740         error has already been reported.
9741
9742         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9743         error has already been reported.
9744
9745 2002-08-05  Martin Baulig  <martin@gnome.org>
9746
9747         * statement.cs (UsageVector): Only initialize the `parameters'
9748         vector if we actually have any "out" parameters.
9749
9750 2002-08-05  Martin Baulig  <martin@gnome.org>
9751
9752         * expression.cs (Binary.ResolveOperator): When combining delegates,
9753         they must have the same type.
9754
9755 2002-08-05  Martin Baulig  <martin@gnome.org>
9756
9757         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9758         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9759         work with the ms runtime and we also don't need it: if we're a
9760         PropertyBuilder and not in the `indexer_arguments' hash, then we
9761         are a property and not an indexer.
9762
9763         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9764         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9765         since the latter one doesn't work with the ms runtime.
9766
9767 2002-08-03  Martin Baulig  <martin@gnome.org>
9768
9769         Fixed bugs #27998 and #22735.
9770
9771         * class.cs (Method.IsOperator): New public field.
9772         (Method.CheckBase): Report CS0111 if there's already a method
9773         with the same parameters in the current class.  Report CS0508 when
9774         attempting to change the return type of an inherited method.
9775         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9776         and it's not marked abstract or extern.
9777         (PropertyBase): New abstract base class for Property and Indexer.
9778         (PropertyBase.CheckBase): Moved here from Property and made it work
9779         for indexers.
9780         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9781         the same so we can reuse it there.
9782         (Property, Indexer): Derive from PropertyBase.
9783         (MethodSignature.inheritable_property_signature_filter): New delegate
9784         to find properties and indexers.
9785
9786         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9787         argument and improved error reporting.
9788
9789         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9790         EmptyReadOnlyParameters and made it a property.
9791
9792         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9793         version of this method which takes a `PropertyInfo indexer'.
9794         (TypeManager.RegisterIndexer): New method.
9795
9796         * class.cs: Added myself as author of this file :-)
9797
9798 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9799
9800         * class.cs: fixed compilation on windoze.
9801
9802 2002-08-03  Martin Baulig  <martin@gnome.org>
9803
9804         * interface.cs (Interface.GetInterfaceBases): Check whether all
9805         base interfaces are at least as accessible than the current one.
9806
9807         * class.cs (TypeContainer.GetClassBases): Check whether base types
9808         are at least as accessible than the current type.
9809         (TypeContainer.AsAccessible): Implemented and made non-static.
9810         (MemberBase.CheckParameters): Report errors if the accessibility
9811         checks fail.
9812
9813         * delegate.cs (Delegate.Delegate): The default visibility is
9814         internal for top-level types and private for nested types.
9815         (Delegate.Define): Report errors if the accessibility checks fail.
9816
9817         * enum.cs (Enum.Enum): The default visibility is internal for
9818         top-level types and private for nested types.
9819         (Enum.DefineType): Compute the correct visibility.
9820
9821         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9822         function which takes a `bool is_toplevel' instead of a TypeContainer.
9823
9824         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9825         builtin type.
9826
9827 2002-08-02  Martin Baulig  <martin@gnome.org>
9828
9829         * expression.cs (LocalVariableReferenc): Added constructor which
9830         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9831         (LocalVariableReference.IsReadOnly): New property.
9832         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9833         variable is readonly, use our own readonly flag to do this; you can
9834         use the new constructor to get a writable reference to a read-only
9835         variable.
9836
9837         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9838         reference to the local variable.
9839
9840 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9841
9842         * rootcontext.cs (ResolveCore): Also include System.Exception
9843
9844         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9845         we reach an EmptyStatement.
9846
9847         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9848         is also fine.
9849
9850         * expression.cs (Binary.ResolveOperator): Check error result in
9851         two places.
9852
9853         use brtrue/brfalse directly and avoid compares to null.
9854
9855 2002-08-02  Martin Baulig  <martin@gnome.org>
9856
9857         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9858         Fixes bug #28407, added test-155.cs.
9859
9860 2002-08-01  Martin Baulig  <martin@gnome.org>
9861
9862         * class.cs (Event.EmitDefaultMethod): Make this work with static
9863         events.  Fixes #28311, added verify-3.cs.
9864
9865 2002-08-01  Martin Baulig  <martin@gnome.org>
9866
9867         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9868         `is_disposable' fields.
9869         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9870         `hm.is_disposable' if we're using the collection pattern.
9871         (Foreach.EmitCollectionForeach): Use the correct type for the
9872         enumerator's local variable, only emit the try/finally block if
9873         necessary (fixes #27713).
9874
9875 2002-08-01  Martin Baulig  <martin@gnome.org>
9876
9877         * ecore.cs (Expression.report118): Renamed to Error118 and made
9878         it public static.
9879
9880         * statement.cs (Throw.Resolve): Check whether the expression is of
9881         the correct type (CS0118) and whether the type derives from
9882         System.Exception (CS0155).
9883         (Catch.Resolve): New method.  Do the type lookup here and check
9884         whether it derives from System.Exception (CS0155).
9885         (Catch.CatchType, Catch.IsGeneral): New public properties.
9886
9887         * typemanager.cs (TypeManager.exception_type): Added.
9888
9889 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9890
9891         * driver.cs: Updated About function.
9892
9893 2002-07-31  Martin Baulig  <martin@gnome.org>
9894
9895         Implemented Control Flow Analysis.
9896
9897         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9898         (EmitContext.CurrentBranching): Added.
9899         (EmitContext.StartFlowBranching): Added.
9900         (EmitContext.EndFlowBranching): Added.
9901         (EmitContext.KillFlowBranching): Added.
9902         (EmitContext.IsVariableAssigned): Added.
9903         (EmitContext.SetVariableAssigned): Added.
9904         (EmitContext.IsParameterAssigned): Added.
9905         (EmitContext.SetParameterAssigned): Added.
9906         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9907         Added control flow analysis stuff here.
9908
9909         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9910         resolve the expression as lvalue.
9911         (LocalVariableReference.DoResolve): Check whether the variable has
9912         already been assigned.
9913         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9914         the parameter as assigned here.
9915         (ParameterReference.DoResolve): Check whether the parameter has already
9916         been assigned.
9917         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9918         expression as lvalue.
9919
9920         * statement.cs (FlowBranching): New class for the flow analysis code.
9921         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9922         (LabeledStatement.IsDefined): New public property.
9923         (LabeledStatement.AddUsageVector): New public method to tell flow
9924         analyis that the label may be reached via a forward jump.
9925         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9926         flow analysis.
9927         (VariableInfo.Number): New public field.  This is used by flow analysis
9928         to number all locals of a block.
9929         (Block.CountVariables): New public property.  This is the number of
9930         local variables in this block (including the locals from all parent
9931         blocks).
9932         (Block.EmitMeta): Number all the variables.
9933
9934         * statement.cs: Added flow analysis support to all classes.
9935
9936 2002-07-31  Martin Baulig  <martin@gnome.org>
9937
9938         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9939         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9940         then use this argument.
9941
9942         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9943
9944         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9945         use this to specify /define options.
9946
9947 2002-07-29  Martin Baulig  <martin@gnome.org>
9948
9949         * statement.cs (Fixed): Moved all code that does variable lookups
9950         and resolvings from Emit to Resolve.
9951
9952         * statement.cs (For): Moved all code that does variable lookups
9953         and resolvings from Emit to Resolve.
9954
9955         * statement.cs (Using): Moved all code that does variable lookups
9956         and resolvings from Emit to Resolve.
9957
9958 2002-07-29  Martin Baulig  <martin@gnome.org>
9959
9960         * attribute.cs (Attribute.Resolve): Explicitly catch a
9961         System.NullReferenceException when creating the
9962         CustromAttributeBuilder and report a different warning message.
9963
9964 2002-07-29  Martin Baulig  <martin@gnome.org>
9965
9966         * support.cs (ParameterData.ParameterName): Added method to
9967         get the name of a parameter.
9968
9969         * typemanager.cs (TypeManager.IsValueType): New public method.
9970
9971 2002-07-29  Martin Baulig  <martin@gnome.org>
9972
9973         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9974         is a flag which specifies that it's either ref or out.
9975         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9976         the out parameter to `out Parameter.Modifier mod', also set the
9977         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9978
9979         * support.cs (InternalParameters.ParameterModifier): Distinguish
9980         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9981         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9982
9983         * expression.cs (Argument.GetParameterModifier): Distinguish
9984         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9985         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9986
9987 2002-07-29  Martin Baulig  <martin@gnome.org>
9988
9989         * expression.cs (ParameterReference.ParameterReference): Added
9990         `Location loc' argument to the constructor.
9991
9992         * cs-parser.jay: Pass location to ParameterReference.
9993
9994 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9995
9996         * statement.cs (Try): Initialize the location.
9997
9998         * cs-parser.jay: pass location to Try.
9999
10000         * expression.cs (Unary.Reduce): Change the prototype to return
10001         whether a constant fold could be performed or not.  The result is
10002         returned in an out parameters.  In the case of Indirection and
10003         AddressOf, we want to perform the full tests.
10004
10005 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10006
10007         * statement.cs (Statement.Emit): Flag dead code.
10008
10009 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10010
10011         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10012
10013 2002-07-27  Martin Baulig  <martin@gnome.org>
10014
10015         * class.cs (MethodData.Define): Put back call to
10016         TypeManager.AddMethod(), accidentally commented this out.
10017
10018         * report.cs (Debug): New public method to print debugging information,
10019         this is `[Conditional ("DEBUG")]'.
10020
10021 2002-07-26  Martin Baulig  <martin@gnome.org>
10022
10023         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10024         (switch_statement): Push the current_block to the switch_stack and
10025         pop it again when we're done with the switch.
10026         (switch_section): The new block is a child of the current_block.
10027         Fixes bug #24007, added test-152.cs.
10028
10029 2002-07-27  Martin Baulig  <martin@gnome.org>
10030
10031         * expression.cs (Invocation.EmitArguments): When calling a varargs
10032         function with only its fixed arguments, we need to pass an empty
10033         array.
10034
10035 2002-07-27  Martin Baulig  <martin@gnome.org>
10036
10037         Mono 0.13 has been released.
10038
10039 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10040
10041         * driver.cs: Rename --resource to --linkres, because that is what
10042         we do currently, we dont support --resource yet.
10043
10044         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10045
10046 2002-07-25  Martin Baulig  <martin@gnome.org>
10047
10048         * class.cs (MethodData): New public class.  This is a `method builder'
10049         class for a method or one accessor of a Property/Indexer/Event.
10050         (MethodData.GetMethodFlags): Moved here from MemberBase.
10051         (MethodData.ApplyAttributes): Likewise.
10052         (MethodData.ApplyObsoleteAttribute): Likewise.
10053         (MethodData.ApplyConditionalAttribute): Likewise.
10054         (MethodData.ApplyDllImportAttribute): Likewise.
10055         (MethodData.CheckAbstractAndExternal): Likewise.
10056         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10057         (MethodData.Emit): Formerly known as Method.Emit().
10058         (MemberBase): Moved everything which was specific to a single
10059         accessor/method to MethodData.
10060         (Method): Create a new MethodData and call Define() and Emit() on it.
10061         (Property, Indexer, Event): Create a new MethodData objects for each
10062         accessor and call Define() and Emit() on them.
10063
10064 2002-07-25  Martin Baulig  <martin@gnome.org>
10065
10066         Made MethodCore derive from MemberBase to reuse the code from there.
10067         MemberBase now also checks for attributes.
10068
10069         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10070         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10071         as virtual.
10072         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10073         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10074         (MemberBase.ApplyAttributes): New virtual method; applies the
10075         attributes to a method or accessor.
10076         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10077         (MemberBase.ApplyConditionalAttribute): Likewise.
10078         (MemberBase.ApplyDllImportAttribute): Likewise.
10079         (MemberBase.CheckAbstractAndExternal): Likewise.
10080         (MethodCore.ParameterTypes): This is now a property instead of a
10081         method, it's initialized from DoDefineParameters().
10082         (MethodCore.ParameterInfo): Removed the set accessor.
10083         (MethodCore.DoDefineParameters): New protected virtual method to
10084         initialize ParameterTypes and ParameterInfo.
10085         (Method.GetReturnType): We can now simply return the MemberType.
10086         (Method.GetMethodFlags): Override the MemberBase version and add
10087         the conditional flags.
10088         (Method.CheckBase): Moved some code from Define() here, call
10089         DoDefineParameters() here.
10090         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10091         here to avoid some larger code duplication.
10092         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10093         ensure that abstract and external accessors don't declare a body.
10094
10095         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10096         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10097         lookup in the attribute's parent classes, so we need to abort as soon
10098         as we found the first match.
10099         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10100         the attribute has no arguments.
10101
10102         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10103         of a Method.
10104
10105 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10106
10107         * cs-parser.jay: reverted previous patch.
10108
10109 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10110
10111         * cs-parser.jay: fixed bug #22119.
10112
10113 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10114
10115         * attribute.cs: fixed compilation. The error was:
10116         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10117         be assigned to before control leaves the current method."
10118         [FIXME:  Filed as bug #28186: MCS must report this error.]
10119
10120 2002-07-25  Martin Baulig  <martin@gnome.org>
10121
10122         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10123         method to pull the condition name ouf of a Conditional attribute.
10124         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10125         the obsolete message and error flag out of an Obsolete attribute.
10126
10127         * class.cs (Method.GetMethodFlags): New public method to get the
10128         TypeManager.MethodFlags for this method.
10129         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10130         private methods.
10131         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10132         if we're overriding a virtual function, set the new private variable
10133         `parent_method'; call the new TypeManager.AddMethod().
10134
10135         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10136         the MethodBuilder and the Method in a PtrHashtable.
10137         (TypeManager.builder_to_method): Added for this purpose.
10138         (TypeManager.MethodFlags): Added IsObsoleteError.
10139         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10140         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10141         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10142         the message from the attribute.
10143
10144 2002-07-24  Martin Baulig  <martin@gnome.org>
10145
10146         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10147         preprocessor directives, ensure that the argument to #define/#undef is
10148         exactly one identifier and that it's actually an identifier.
10149
10150         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10151         did not work ....
10152
10153 2002-07-24  Martin Baulig  <martin@gnome.org>
10154
10155         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10156         initialize it to TypeManager.object_type in the constructor.
10157         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10158         of the `hm.get_current' method if we're using the collection pattern.
10159         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10160         for the explicit conversion to make it work when we're using the collection
10161         pattern and the `Current' property has a different return type than `object'.
10162         Fixes #27713.
10163
10164 2002-07-24  Martin Baulig  <martin@gnome.org>
10165
10166         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10167         does not match, but don't report any errors.  This method is called in
10168         order for all methods in a MethodGroupExpr until a matching method is
10169         found, so we don't want to bail out if the first method doesn't match.
10170         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10171         matches, report the 123.  Fixes #28070.
10172
10173 2002-07-24  Martin Baulig  <martin@gnome.org>
10174
10175         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10176         TypeManager.TypeToCoreType() to the top of the method so the
10177         following equality checks will work.  Fixes #28107.
10178
10179 2002-07-24  Martin Baulig  <martin@gnome.org>
10180
10181         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10182         operand is of type uint, and the other operand is of type sbyte,
10183         short or int, the operands are converted to type long." -
10184         Actually do what this comment already told us.  Fixes bug #28106,
10185         added test-150.cs.
10186
10187 2002-07-24  Martin Baulig  <martin@gnome.org>
10188
10189         * class.cs (MethodBase): New abstract class.  This is now a base
10190         class for Property, Indexer and Event to avoid some code duplication
10191         in their Define() and DefineMethods() methods.
10192         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10193         generic methods for Define() and DefineMethods().
10194         (FieldBase): Derive from MemberBase, not MemberCore.
10195         (Property): Derive from MemberBase, not MemberCore.
10196         (Property.DefineMethod): Moved all the code from this method to the
10197         new MethodBase.DefineAccessor(), just call it with appropriate
10198         argumetnts.
10199         (Property.Define): Call the new Property.DoDefine(), this does some
10200         sanity checks and we don't need to duplicate the code everywhere.
10201         (Event): Derive from MemberBase, not MemberCore.
10202         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10203         accessors, this will also make them work with interface events.
10204         (Indexer): Derive from MemberBase, not MemberCore.
10205         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10206         (Indexer.Define): Use the new MethodBase functions.
10207
10208         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10209         argument to the constructor.
10210         (Interface.FindMembers): Added support for interface events.
10211         (Interface.PopluateEvent): Implemented.
10212
10213         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10214
10215 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10216
10217         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10218         but this is required to check for a method name being the same as
10219         the containing class.  
10220
10221         Handle this now.
10222
10223 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10224
10225         * interface.cs: initialize variable.
10226
10227 2002-07-23  Martin Baulig  <martin@gnome.org>
10228
10229         Implemented the IndexerName attribute in interfaces.
10230
10231         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10232         name if this is an explicit interface implementation.
10233         (Indexer.InterfaceIndexerName): New public variable.  If we're
10234         implementing an interface indexer, this is the IndexerName in that
10235         interface.  Otherwise, it's the IndexerName.
10236         (Indexer.DefineMethod): If we're implementing interface indexer,
10237         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10238         and Pending.ImplementIndexer methods.
10239         (Indexer.Define): Also define the PropertyBuilder if we're
10240         implementing an interface indexer and this is neither an explicit
10241         interface implementation nor do the IndexerName match the one in
10242         the interface.
10243
10244         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10245         If a method is defined here, then we always need to create a proxy
10246         for it.  This is used when implementing interface indexers.
10247         (Pending.IsInterfaceIndexer): New public method.
10248         (Pending.ImplementIndexer): New public method.
10249         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10250         This is used when implementing interface indexers to define a proxy
10251         if necessary.
10252         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10253         define a proxy if necessary.
10254
10255         * interface.cs (Interface.IndexerName): New public variable.
10256         (Interface.PopulateIndexer): Set the IndexerName.
10257         (Interface.DefineIndexers): New private method.  Populate all the
10258         indexers and make sure their IndexerNames match.
10259
10260         * typemanager.cs (IndexerPropertyName): Added support for interface
10261         indexers.
10262
10263 2002-07-22  Martin Baulig  <martin@gnome.org>
10264
10265         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10266         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10267         ret if HasReturnLabel.
10268         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10269         variables.
10270
10271         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10272         and set the ec.LoopBeginTryCatchLevel.
10273         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10274         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10275         the current ec.TryCatchLevel, the branch goes out of an exception
10276         block.  In this case, we need to use Leave and not Br.
10277
10278 2002-07-22  Martin Baulig  <martin@gnome.org>
10279
10280         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10281         block unless the block does not always return or it is contained in
10282         another try { ... } catch { ... } block.  Fixes bug #26506.
10283         Added verify-1.cs to the test suite.
10284
10285 2002-07-22  Martin Baulig  <martin@gnome.org>
10286
10287         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10288         then we do not always return.  Fixes bug #24985.
10289
10290 2002-07-22  Martin Baulig  <martin@gnome.org>
10291
10292         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10293         lookup on a per-class level; ie. walk up the class hierarchy until we
10294         found at least one applicable method, then choose the best among them.
10295         Fixes bug #24463 and test-29.cs.
10296
10297 2002-07-22  Martin Baulig  <martin@gnome.org>
10298
10299         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10300         return types of the methods.  The return type is not part of the
10301         signature and we must not check it to make the `new' modifier work.
10302         Fixes bug #27999, also added test-147.cs.
10303         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10304
10305         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10306         on the method's return type.
10307
10308 2002-07-21  Martin Baulig  <martin@gnome.org>
10309
10310         * assign.cs: Make this work if the rightmost source is a constant and
10311         we need to do an implicit type conversion.  Also adding a few more tests
10312         to test-38.cs which should have caught this.
10313
10314         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10315         target in the makefile for this.  The makefile.gnu is primarily intended
10316         for end-users who don't want to debug the compiler.
10317
10318 2002-07-21  Martin Baulig  <martin@gnome.org>
10319
10320         * assign.cs: Improved the Assign class so it can now handle embedded
10321         assignments (X = Y = Z = something).  As a side-effect this'll now also
10322         consume less local variables.  test-38.cs now passes with MCS, added
10323         a few new test cases to that test.
10324
10325 2002-07-20  Martin Baulig  <martin@gnome.org>
10326
10327         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10328         instructions.  Fixes bug #27977, also added test-146.cs.
10329
10330 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10331
10332         * cs-tokenizer.cs: fixed getHex ().
10333
10334 2002-07-19  Martin Baulig  <martin@gnome.org>
10335
10336         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10337         not Type.GetType() to lookup the array type.  This is needed when
10338         we're constructing an array of a user-defined type.
10339         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10340         single-dimensional arrays, but also for single-dimensial arrays of
10341         type decimal.
10342
10343 2002-07-19  Martin Baulig  <martin@gnome.org>
10344
10345         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10346         this function is called, it's not allowed to share LocalBuilders
10347         among ILGenerators.
10348
10349 2002-07-19  Martin Baulig  <martin@gnome.org>
10350
10351         * expression.cs (Argument.Resolve): Report an error 118 when trying
10352         to pass a type as argument.
10353
10354 2002-07-18  Martin Baulig  <martin@gnome.org>
10355
10356         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10357         Conv_R_Un for the signed `long' type.
10358
10359 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10360
10361         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10362         `expr' for the temporary result, as that will fail if we do
10363         multiple resolves on the same expression.
10364
10365 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10366
10367         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10368         ec.TypeContainer for looking up aliases. 
10369
10370         * class.cs (TypeContainer): Remove LookupAlias from here.
10371
10372         * decl.cs (DeclSpace); Move here.
10373
10374 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10375
10376         * class.cs (FindMembers): Only call filter if the constructor
10377         bulider is not null.
10378
10379         Also handle delegates in `NestedTypes' now.  Now we will perform
10380         type lookups using the standard resolution process.  This also
10381         fixes a bug.
10382
10383         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10384         This uses Expressions (the limited kind that can be parsed by the
10385         tree) instead of strings.
10386
10387         * expression.cs (ComposedCast.ToString): Implement, used to flag
10388         errors since now we have to render expressions.
10389
10390         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10391         FormArrayType. 
10392
10393         * ecore.cs (SimpleName.ToString): ditto.
10394
10395         * cs-parser.jay: Instead of using strings to assemble types, use
10396         Expressions to assemble the type (using SimpleName, ComposedCast,
10397         MemberAccess).  This should fix the type lookups in declarations,
10398         because we were using a different code path for this.
10399
10400         * statement.cs (Block.Resolve): Continue processing statements
10401         even when there is an error.
10402
10403 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10404
10405         * class.cs (Event.Define): Also remove the `remove' method from
10406         the list of pending items.
10407
10408         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10409         generate more compact code. 
10410
10411 2002-07-17  Martin Baulig  <martin@gnome.org>
10412
10413         * const.cs (Const.LookupConstantValue): Add support for constant
10414         `unchecked' and `checked' expressions.
10415         Also adding test case test-140.cs for this.
10416
10417 2002-07-17  Martin Baulig  <martin@gnome.org>
10418
10419         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10420         check whether mi.ReturnType implements the IEnumerator interface; the
10421         `==' and the IsAssignableFrom() will fail in this situation.
10422
10423 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10424
10425         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10426         here too.
10427
10428 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10429
10430         * expression.cs: fixed bug #27811.
10431
10432 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10433
10434         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10435         Molaro: when we are a ref, the value already contains a pointer
10436         value, do not take the address of it.
10437
10438 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10439         * removed mb-parser.jay and mb-tokenizer.cs
10440
10441 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10442
10443         * expression.cs: check against the building corlib void type.
10444
10445 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10446
10447         * ecore.cs: fix for valuetype static readonly fields: when 
10448         initializing them, we need their address, not the address of a copy.
10449
10450 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10451
10452         * typemanager.cs: register also enum_type in corlib.
10453
10454 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10455
10456         * class.cs: allow calling this (but not base) initializers in structs.
10457
10458 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10459
10460         * ecore.cs: make sure we compare against the building base types
10461         in GetTypeSize ().
10462
10463 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10464
10465         * typemanager.cs: fix TypeToCoreType() to handle void and object
10466         (corlib gets no more typerefs after this change).
10467
10468 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10469
10470         * expression.cs (ArrayCreation.EmitArrayArguments): use
10471         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10472
10473         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10474         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10475         array indexes, the runtime actually forbids them.
10476
10477         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10478         for array arguments here.
10479
10480         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10481         instead of the default for ValueTypes.
10482
10483         (New.DoEmit): Use IsValueType instead of
10484         IsSubclassOf (value_type)
10485         (New.DoResolve): ditto.
10486         (Invocation.EmitCall): ditto.
10487
10488         * assign.cs (Assign): ditto.
10489
10490         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10491         Statements *are* currently doing part of their resolution during
10492         Emit.  
10493
10494         Expressions do always resolve during resolve, but statements are
10495         only required to propagate resolution to their children.
10496
10497 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10498
10499         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10500
10501         (LoadAssembly): Do not add the dll if it is already specified
10502
10503         (MainDriver): Add the System directory to the link path at the end,
10504         after all the other -L arguments. 
10505
10506         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10507         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10508         ldelem.u1) and using the opposite for sbytes.
10509
10510         This fixes Digger, and we can finally run it.
10511
10512         * driver.cs (UnixParseOption): Move the option parsing here.  
10513         (CSCParseOption): Implement CSC-like parsing of options.
10514
10515         We now support both modes of operation, the old Unix way, and the
10516         new CSC-like way.  This should help those who wanted to make cross
10517         platform makefiles.
10518
10519         The only thing broken is that /r:, /reference: and /lib: are not
10520         implemented, because I want to make those have the same semantics
10521         as the CSC compiler has, and kill once and for all the confussion
10522         around this.   Will be doing this tomorrow.
10523
10524         * statement.cs (Unsafe.Resolve): The state is checked during
10525         resolve, not emit, so we have to set the flags for IsUnsfe here.
10526
10527 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10528
10529         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10530         not catch the Error_ObjectRefRequired in SimpleName (as it is
10531         possible to have a class/instance variable name that later gets
10532         deambiguated), we have to check this here.      
10533
10534 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10535
10536         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10537         make static and put into Expression.
10538
10539         (Event.Define): Register the private field of the event with the 
10540         TypeManager so that GetFieldFromEvent can get at it.
10541
10542         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10543         keep track of the private field associated with an event which
10544         has no accessors.
10545
10546         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10547         private field.
10548
10549         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10550
10551 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10552
10553         * expression.cs (Binary.EmitBranchable): this routine emits the
10554         Binary expression in a branchable context.  This basically means:
10555         we need to branch somewhere, not just get the value on the stack.
10556
10557         This works together with Statement.EmitBoolExpression.
10558
10559         * statement.cs (Statement.EmitBoolExpression): Use
10560         EmitBranchable. 
10561
10562 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10563
10564         * statement.cs (For): Reduce the number of jumps in loops.
10565
10566         (For): Implement loop inversion for the For statement.
10567
10568         (Break): We can be breaking out of a Try/Catch controlled section
10569         (foreach might have an implicit try/catch clause), so we need to
10570         use Leave instead of Br.
10571
10572         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10573         now).  If the instace expression supports IMemoryLocation, we use
10574         the AddressOf method from the IMemoryLocation to extract the
10575         address instead of emitting the instance.
10576
10577         This showed up with `This', as we were emitting the instance
10578         always (Emit) instead of the Address of This.  Particularly
10579         interesting when This is a value type, as we dont want the Emit
10580         effect (which was to load the object).
10581
10582 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10583
10584         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10585
10586         * statement.cs (Checked): Set the CheckedState during the resolve
10587         process too, as the ConvCast operations track the checked state on
10588         the resolve process, and not emit.
10589
10590         * cs-parser.jay (namespace_member_declaration): Flag that we have
10591         found a declaration when we do.  This is used to flag error 1529
10592
10593         * driver.cs: Report ok when we display the help only.
10594
10595 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10596
10597         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10598
10599 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10600
10601         * cs-tokenizer.cs (define): We also have to track locally the
10602         defines.  AllDefines is just used for the Conditional Attribute,
10603         but we also need the local defines for the current source code. 
10604
10605 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10606
10607         * statement.cs (While, For, Do): These loops can exit through a
10608         Break statement, use this information to tell whether the
10609         statement is the last piece of code.
10610
10611         (Break): Flag that we break.
10612
10613         * codegen.cs (EmitContexts): New `Breaks' state variable.
10614
10615 2002-07-03  Martin Baulig  <martin@gnome.org>
10616
10617         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10618         modifiers in method declarations in structs.  Otherwise, you won't
10619         be able to override things like Object.Equals().
10620
10621 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10622
10623         * class.cs (Method, Property, Indexer): Do not allow the public
10624         modifier to be used in explicit interface implementations.
10625
10626         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10627         override modifiers in method declarations in structs
10628
10629 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10630
10631         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10632         integer or real overflow, report an error
10633
10634 2002-07-02  Martin Baulig  <martin@gnome.org>
10635
10636         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10637         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10638         to tell the runtime about our newly created System.Object and
10639         System.ValueType types.
10640
10641 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10642
10643         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10644         struct instead of Ldarg/Starg.
10645
10646 2002-07-02  Martin Baulig  <martin@gnome.org>
10647
10648         * expression.cs (Indirection.Indirection): Call
10649         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10650
10651 2002-07-02  Martin Baulig  <martin@gnome.org>
10652
10653         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10654         ValueType, call TypeManager.TypeToCoreType() on it.
10655         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10656         the OpCodes.Newarr argument.
10657
10658 2002-07-02  Martin Baulig  <martin@gnome.org>
10659
10660         * expression.cs (Invocation.EmitCall): When compiling corlib,
10661         replace all calls to the system's System.Array type to calls to
10662         the newly created one.
10663
10664         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10665         System.Array methods.
10666         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10667         from the system's System.Array type which must be replaced.
10668
10669 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10670
10671         * typemanager.cs: load unverifiable_code_ctor so we can build
10672         corlib using the correct type. Avoid using GetTypeCode() with
10673         TypeBuilders.
10674         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10675         TypeManager.object_type to allow building corlib.
10676
10677 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10678
10679         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10680
10681 2002-07-01  Martin Baulig  <martin@gnome.org>
10682
10683         * class.cs: Make the last change actually work, we need to check
10684         whether `ifaces != null' to avoid a crash.
10685
10686 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10687
10688         * class.cs: when we build structs without fields that implement
10689         interfaces, we need to add the interfaces separately, since there is
10690         no API to both set the size and add the interfaces at type creation
10691         time.
10692
10693 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10694
10695         * expression.cs: the dimension arguments to the array constructors
10696         need to be converted if they are a long.
10697
10698 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10699
10700         * class.cs: don't emit ldarg.0 if there is no parent constructor
10701         (fixes showstopper for corlib).
10702
10703 2002-06-29  Martin Baulig  <martin@gnome.org>
10704
10705         MCS now compiles corlib on GNU/Linux :-)
10706
10707         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10708         ie. check for MethodImplOptions.InternalCall.
10709
10710         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10711         and TypeManager.attribute_type are null, so we must explicitly check
10712         whether parent is not null to find out whether it's an attribute type.
10713         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10714         and SetBuilder, not only if the property is neither abstract nor external.
10715         This is necessary to set the MethodImplOptions on the accessor methods.
10716         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10717         SetBuilder, see Property.Emit().
10718
10719         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10720         populate "System.Object", "System.ValueType" and "System.Attribute" since
10721         they've already been populated from BootCorlib_PopulateCoreTypes().
10722
10723 2002-06-29  Martin Baulig  <martin@gnome.org>
10724
10725         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10726         is the NullLiteral, we also need to make sure that target_type is not
10727         an enum type.   
10728
10729 2002-06-29  Martin Baulig  <martin@gnome.org>
10730
10731         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10732         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10733         before calling BootstrapCorlib_ResolveDelegate ().
10734
10735 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10736
10737         * statement.cs: fixed build-breaker. All tests passed ok.
10738
10739 2002-06-27  Martin Baulig  <martin@gnome.org>
10740
10741         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10742         for System.Decimal when compiling corlib.
10743
10744 2002-06-27  Martin Baulig  <martin@gnome.org>
10745
10746         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10747         switch blocks which contain nothing but a default clause.
10748
10749 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10750
10751        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10752
10753 2002-06-27  Martin Baulig  <martin@gnome.org>
10754
10755         * ecore.cs (PropertyExpr.PropertyExpr): Call
10756         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10757
10758         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10759         is already a TypeBuilder.
10760
10761 2002-06-27  Martin Baulig  <martin@gnome.org>
10762
10763         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10764         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10765         the "from an array-type to System.Array" case.  This makes it work
10766         when compiling corlib.
10767
10768 2002-06-27  Martin Baulig  <martin@gnome.org>
10769
10770         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10771         non-static PropertyExpr, set its InstanceExpression.  This makes
10772         the `ICollection.Count' property work in System/Array.cs.
10773
10774 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10775
10776         * driver.cs: Made error handling more consistent.  Errors now
10777         tracked by Report class, so many methods which used to return int
10778         now return void.  Main() now prints success/failure and 
10779         errors/warnings message.
10780
10781         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10782         the magic number return values (123 and 124).  Now, if the
10783         expected error occurs, the compiler exits with success (exit value
10784         0).  If the compilation completes without seeing that particular
10785         error, the compiler exits with failure (exit value 1).  The
10786         makefile in mcs/errors has been changed to handle the new behaviour.
10787
10788         * report.cs: Made 'expected error' number a property and renamed
10789         it from 'Probe' to 'ExpectedError'.
10790
10791         * genericparser.cs: Removed error handling support, since it is
10792         now all done by Report class.
10793
10794         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10795         class, so parse() no longer returns an int.
10796
10797         * namespace.cs: Use Report.Error instead of GenericParser.error
10798
10799 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10800
10801         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10802         TypeContainer.AddOperator): At the front of the list put the
10803         explicit implementations, so they get resolved/defined first. 
10804
10805 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10806
10807         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10808         interface type is implemented by this TypeContainer.  Used during
10809         explicit interface implementation.
10810
10811         (Property.Define, Indexer.Define, Method.Define): Validate that
10812         the given interface in the explicit implementation is one of the
10813         base classes for the containing type.
10814
10815         Also if we are explicitly implementing an interface, but there is
10816         no match in the pending implementation table, report an error.
10817
10818         (Property.Define): Only define the property if we are
10819         not explicitly implementing a property from an interface.  Use the
10820         correct name also for those properties (the same CSC uses,
10821         although that is really not needed).
10822
10823         (Property.Emit): Do not emit attributes for explicitly implemented
10824         properties, as there is no TypeBuilder.
10825
10826         (Indexer.Emit): ditto.
10827
10828         Hiding then means that we do not really *implement* a pending
10829         implementation, which makes code fail.
10830
10831 2002-06-22  Martin Baulig  <martin@gnome.org>
10832
10833         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10834         the return value of Object.GetType().  [FIXME: we need to do this whenever
10835         we get a type back from the reflection library].
10836
10837 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10838
10839         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10840
10841 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10842
10843         * attribute.cs: Return null if we can not look up the type.
10844
10845         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10846         the interface types found.
10847
10848         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10849         interface types found.
10850
10851         * typemanager.cs (GetInterfaces): Make this routine returns alll
10852         the interfaces and work around the lame differences between
10853         System.Type and System.Reflection.Emit.TypeBuilder in the results
10854         result for GetInterfaces.
10855
10856         (ExpandInterfaces): Given an array of interface types, expand and
10857         eliminate repeated ocurrences of an interface.  This expands in
10858         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10859         be IA, IB, IC.
10860
10861 2002-06-21  Martin Baulig  <martin@gnome.org>
10862
10863         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10864         on System.Enum.
10865
10866 2002-06-21  Martin Baulig  <martin@gnome.org>
10867
10868         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10869         and called with one of the core types, return the corresponding typebuilder for
10870         that type.
10871
10872         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10873         element type.
10874
10875 2002-06-21  Martin Baulig  <martin@gnome.org>
10876
10877         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10878         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10879         (Expression.ConvertReferenceExplicit): Likewise.
10880
10881         * expression.cs (ElementAccess.DoResolve): Likewise.
10882         (ElementAccess.DoResolveLValue): Likewise.
10883
10884 2002-06-10  Martin Baulig  <martin@gnome.org>
10885
10886         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10887         add the "value" parameter to the parameter list.
10888
10889         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10890         to our caller.
10891
10892 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10893
10894         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10895         the argument to an int, uint, long or ulong, per the spec.  Also
10896         catch negative constants in array creation.
10897
10898 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10899
10900         * class.cs: do not allow the same interface to appear twice in
10901         the definition list.
10902
10903 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10904
10905         * ecore.cs: don't use ldlen with System.Array.
10906
10907 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10908
10909         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10910
10911 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10912
10913         * modifiers.cs: produce correct field attributes for protected
10914         internal. Easy fix so miguel can work on ther harder stuff:-)
10915
10916 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10917
10918         * pending.cs: New file.  Move the code from class.cs here.
10919         Support clearning the pending flag for all methods (when not doing
10920         explicit interface implementation).
10921
10922 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10923
10924         * rootcontext.cs: added a couple more types needed to bootstrap.
10925
10926 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10927
10928         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10929         constructor in the type, instead of any constructor in the type
10930         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10931         a bug in the Mono runtime when applying the params attribute). 
10932
10933 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10934         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10935
10936 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10937
10938         * expression.cs (Unary.ResolveOperator): Use TypeManager
10939         to resolve the type.
10940
10941 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10942
10943         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10944         attached.
10945
10946         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10947         with each member too.
10948
10949         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10950         field builders too - this takes care of the enum member case.
10951
10952 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10953
10954         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10955         address-of operator on both value types and pointers.
10956
10957 2002-06-10  Martin Baulig  <martin@gnome.org>
10958
10959         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10960         PropertyBuilder to the `property_builders' list.
10961
10962         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10963         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10964         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10965         find any indexers which are inherited from an interface.
10966
10967 2002-06-09  Martin Baulig  <martin@gnome.org>
10968
10969         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10970         the same type as the constant if necessary.  There's also a test-130.cs
10971         for this.
10972
10973         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10974
10975         * typemanager.cs (TypeManager.ChangeType): Previously known as
10976         Enum.ChangeEnumType().
10977
10978 2002-06-09  Martin Baulig  <martin@gnome.org>
10979
10980         * expression.cs (Cast.TryReduce): Added support for consts.
10981
10982 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10983
10984         * class.cs (Accessor): Hold attributes information so we can pass
10985         it along.
10986
10987         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10988         Modify to pass in attributes attached to the methods.
10989
10990         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10991
10992         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10993         to handle the Accessor kind :-)
10994
10995         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10996
10997 2002-06-08  Martin Baulig  <martin@gnome.org>
10998
10999         * expression.cs (Unary.TryReduceNegative): Added support for
11000         ULongConstants.
11001
11002 2002-06-08  Martin Baulig  <martin@gnome.org>
11003
11004         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11005         name can't be found in the `defined_names' - the caller will do a
11006         MemberLookup in this case and thus find methods in System.Enum
11007         such as Enum.IsDefined().
11008
11009 2002-06-08  Martin Baulig  <martin@gnome.org>
11010
11011         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11012         Convert.ChangeType() which works with TypeBuilder created types.
11013         (Enum.LookupEnumValue, Enum.Define): Use it here.
11014
11015         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11016         `TypeBuilder.BaseType != null' check.
11017         (TypeContainer.FindMembers): Only lookup parent members if we
11018         actually have a parent.
11019         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11020         (ConstructorInitializer.Resolve): Likewise.
11021
11022         * interface.cs (Interface.FindMembers): Added
11023         `TypeBuilder.BaseType != null' check.
11024
11025         * rootcontext.cs (RootContext.ResolveCore): Added
11026         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11027         classes_second_stage.
11028
11029         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11030         debug_type and trace_type when compiling with --nostdlib.       
11031
11032 2002-06-07  Martin Baulig  <martin@gnome.org>
11033
11034         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11035         (AddField): Set it to true when adding a non-static field.
11036         (DefineType): Use `have_nonstatic_fields' to find out whether we
11037         have non-static fields, not `Fields != null'.
11038
11039 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11040
11041         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11042         dereferencing a null on the static-field code path)
11043
11044 2002-05-30  Martin Baulig  <martin@gnome.org>
11045
11046         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11047         to take command line arguments.  Use reflection to call the new
11048         custom `Initialize' function on the symbol writer and pass it the
11049         command line arguments.
11050
11051         * driver.cs (--debug-args): New command line argument to pass command
11052         line arguments to the symbol writer.
11053
11054 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11055
11056         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11057         the target type for indexers and properties.  Thanks to Joe for
11058         catching this.
11059
11060 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11061
11062         * typemanager.cs (MethodFlags): returns the method flags
11063         (Obsolete/ShouldIgnore) that control warning emission and whether
11064         the invocation should be made, or ignored. 
11065
11066         * expression.cs (Invocation.Emit): Remove previous hack, we should
11067         not do this on matching a base type, we should do this based on an attribute
11068
11069         Only emit calls to System.Diagnostics.Debug and
11070         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11071         on the command line.
11072
11073         * rootcontext.cs: Global settings for tracing and debugging.
11074
11075         * cs-tokenizer.cs (define): New utility function to track
11076         defines.   Set the global settings for TRACE and DEBUG if found.
11077
11078 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11079
11080         * interface.cs (Populate*): Pass in the TypeContainer as well as
11081         the DeclSpace as parameters so that we can create EmitContexts and
11082         then use that to apply attributes etc.
11083
11084         (PopulateMethod, PopulateEvent, PopulateProperty)
11085         (PopulateIndexer): Apply attributes everywhere.
11086
11087         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11088         etc.
11089
11090         (ApplyAttributes): Update accordingly.
11091
11092         We now apply interface attributes for all members too.
11093
11094 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11095
11096         * class.cs (Indexer.Define); Correctly check if we are explicit
11097         implementation (instead of checking the Name for a ".", we
11098         directly look up if the InterfaceType was specified).
11099
11100         Delay the creation of the PropertyBuilder.
11101
11102         Only create the PropertyBuilder if we are not an explicit
11103         interface implementation.   This means that explicit interface
11104         implementation members do not participate in regular function
11105         lookups, and hence fixes another major ambiguity problem in
11106         overload resolution (that was the visible effect).
11107
11108         (DefineMethod): Return whether we are doing an interface
11109         implementation. 
11110
11111         * typemanager.cs: Temporary hack until we get attributes in
11112         interfaces (Ravi is working on that) and we get IndexerName
11113         support in interfaces.
11114
11115         * interface.cs: Register the indexers as properties.
11116
11117         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11118         warning, I have verified that this is a bug in the .NET runtime
11119         (JavaScript suffers of the same problem).
11120
11121         * typemanager.cs (MemberLookup): When looking up members for
11122         interfaces, the parent of an interface is the implicit
11123         System.Object (so we succeed in searches of Object methods in an
11124         interface method invocation.  Example:  IEnumerable x;  x.ToString
11125         ()) 
11126
11127 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11128
11129         * class.cs (Event): Events should also register if they do
11130         implement the methods that an interface requires.
11131
11132         * typemanager.cs (MemberLookup); use the new GetInterfaces
11133         method. 
11134
11135         (GetInterfaces): The code used to lookup interfaces for a type is
11136         used in more than one place, factor it here. 
11137
11138         * driver.cs: Track the errors at the bottom of the file, we kept
11139         on going.
11140
11141         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11142         instance if the method we are calling is static!
11143
11144 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11145
11146         * attribute.cs (ApplyAttributes): Make this function filter out
11147         the IndexerName attribute (as that attribute in reality is never
11148         applied) and return the string constant for the IndexerName
11149         attribute. 
11150
11151         * class.cs (TypeContainer.Emit): Validate that all the indexers
11152         have the same IndexerName attribute, and if so, set the
11153         DefaultName attribute on the class. 
11154
11155         * typemanager.cs: The return value might contain other stuff (not
11156         only methods).  For instance, consider a method with an "Item"
11157         property and an Item method.
11158
11159         * class.cs: If there is a problem with the parameter types,
11160         return. 
11161
11162 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11163
11164         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11165         looks at user defined conversion after making a call to 
11166         StandardConversionExists - we need this for overload resolution.
11167
11168         * expression.cs : Update accordingly the various method calls.
11169
11170         This fixes 2 bugs filed against implicit user defined conversions 
11171
11172 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11173
11174         * statement.cs: Track the result of the assignment.
11175
11176 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11177
11178         * expression.cs (MemberAccess): Improved error reporting for
11179         inaccessible members.
11180
11181 2002-05-22  Martin Baulig  <martin@gnome.org>
11182
11183         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11184         itself with debugging support.
11185
11186 2002-05-22  Martin Baulig  <martin@gnome.org>
11187
11188         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11189         Removed, this isn't needed anymore.
11190
11191 2002-05-20  Martin Baulig  <martin@gnome.org>
11192
11193         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11194         be underlying type for an enum.
11195
11196 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11197
11198         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11199         that splits out the loading of just the core types.
11200
11201         * rootcontext.cs (ResolveCore): Split the struct resolution in
11202         two, so we can load the enumeration underlying types before any
11203         enums are used.
11204
11205         * expression.cs (Is): Bandaid until we fix properly Switch (see
11206         bug #24985 for details).
11207
11208         * typemanager.cs (ImplementsInterface): The hashtable will contain
11209         a null if there are no interfaces implemented.
11210
11211 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11212
11213         * cs-parser.jay (indexer_declarator): It is fine to have array
11214         parameters
11215
11216 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11217
11218         * typemanager.cs: (RegisterBuilder): New function used to register
11219         TypeBuilders that implement interfaces.  Since
11220         TypeBuilder.GetInterfaces (as usual) does not work with lame
11221         Reflection.Emit. 
11222         (AddUserType): register interfaces.
11223
11224         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11225         dealing with TypeBuilder.  Also, arrays are showing up as
11226         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11227         methods can not be invoked on them!
11228
11229         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11230         (ImplicitReferenceConversionExists): Split out from
11231         StandardConversionExists. 
11232
11233         * expression.cs (As): We were only implementing one of the three
11234         cases for the as operator.  We now implement them all.
11235         (Is): Implement the various other cases for Is as well.
11236
11237         * typemanager.cs (CACHE): New define used to control if we want or
11238         not the FindMembers cache.  Seems to have a negative impact on
11239         performance currently
11240
11241         (MemberLookup): Nested types have full acess to
11242         enclosing type members
11243
11244         Remove code that coped with instance/static returns for events, we
11245         now catch this in RealFindMembers.
11246
11247         (RealFindMembers): only perform static lookup if the instance
11248         lookup did not return a type or an event.  
11249
11250 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11251
11252         * assign.cs (CompoundAssign): We pass more semantic information
11253         now to Compound Assignments than we did before: now we have all
11254         the information at hand, and now we resolve the target *before* we
11255         do the expression expansion, which allows the "CacheValue" method
11256         to have the effect we intended (before, a [x] += 1 would generate
11257         two differen ArrayAccess expressions from the ElementAccess,
11258         during the resolution process).
11259
11260         (CompoundAssign.DoResolve): Resolve target and original_source here.
11261
11262 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11263
11264         * expression.cs (ArrayAccess): dropped debugging information. 
11265
11266         * typemanager.cs: Small bug fix: I was always returning i_members,
11267         instead of one of i_members or s_members (depending on which had
11268         the content).
11269
11270         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11271         method is invoked before any code generation takes place, and it
11272         is a mechanism to inform that the expression will be invoked more
11273         than once, and that the method should use temporary values to
11274         avoid having side effects
11275
11276         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11277
11278         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11279         implementation.
11280
11281         * expression.cs (Indirection, ArrayAccess): Add support for
11282         CacheTemporaries in these two bad boys. 
11283
11284         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11285         ldobj or ldind_ref.  
11286         (StoreFromPtr): Handle stobj as well.
11287
11288         * expression.cs (UnaryMutator): Share more code.
11289
11290         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11291         down: I was not tracking the Filter function as well, which
11292         was affecting the results of the cache.
11293
11294 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11295
11296         * attribute.cs: Remove the hack to handle the CharSet property on
11297         StructLayouts. 
11298
11299 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11300
11301         * attribute.cs (DoResolve): More uglyness, we now only try to
11302         resolve the attribute partially, to extract the CharSet
11303         information (only if we are a StructLayout attribute).  Otherwise 
11304
11305         (GetExtraTypeInfo): Add some code to conditionally kill in the
11306         future this.   I am more and more convinced that the .NET
11307         framework has special code to handle the attribute setting on
11308         certain elements.
11309
11310         * expression.cs (IsParamsMethodApplicable): Revert my previous
11311         foreach change here, it was wrong.
11312
11313 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11314
11315         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11316         (pp_expr): do not abort on unknown input, just return.
11317         (eval): abort if there are pending chars.
11318
11319         * attribute.cs (Attribute.Resolve): Positional parameters are
11320         optional.  Deal with that case.
11321
11322         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11323         the Ansi/Unicode/Auto information for the type.
11324
11325         (TypeContainer.DefineType): instantiate the EmitContext here, as
11326         we will be using it during the type definition (to resolve
11327         attributes) and during the emit phase.
11328
11329         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11330         to pull type information out of the attributes
11331
11332         (Attribute.Resolve): track the constructor builder, and allow for
11333         multiple invocations (structs and classes will use this).
11334
11335         * ecore.cs (MemberLookupFinal): new version with all the
11336         parameters customizable.
11337
11338         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11339         constructors.  Return if the result value is null (as the error
11340         would have been flagged already by MemberLookupFinal)
11341
11342         Do not allow instances of abstract classes or interfaces to be
11343         created.
11344
11345         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11346         We have to compare the assembly property here when dealing with
11347         FamANDAssem and Assembly access modifiers, because we might be
11348         creating an assembly from *modules* (that means that we are not
11349         getting TypeBuilders for types defined in other modules that are
11350         part of this assembly).
11351
11352         (Method.Emit): If the method is marked abstract and has a body,
11353         emit an error. 
11354
11355         (TypeContainer.DefineMembers): If both the defined member and the
11356         parent name match are methods, then do not emit any warnings: let
11357         the Method.Define routine take care of flagging warnings.  But if
11358         there is a mismatch (method overrides something else, or method is
11359         overriwritten by something, then emit warning).
11360
11361         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11362         set to null, this means `do not check for the return type on the
11363         signature'. 
11364
11365         (Method.Define): set the return type for the method signature to
11366         null, so that we get methods with the same name and parameters and
11367         different return types.  This is used to flag warning 114 (you are
11368         hiding a method, and you probably want to use the new/override
11369         keywords instead).
11370
11371         * typemanager.cs (MemberLookup): Implemented proper access
11372         control, closing a long standing set of bug reports.  The problem
11373         was that the Framework only has two bits: Public and NonPublic,
11374         and NonPublic includes private and protected methods, but we need
11375         to enforce the FamANDAssem, FamOrAssem and Family. 
11376
11377 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11378
11379         * statement.cs (GotoCase): Return true: Ammounts to giving up
11380         knowledge on whether we return or not, and letting the other case
11381         be responsible for it.
11382
11383 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11384
11385         * driver.cs: Do not load directories for each file processed, only
11386         do it if there is a pattern.
11387
11388         * ecore.cs: Report readonly assigns here as well, as we might have
11389         been resolved only by MemberAccess.
11390
11391         (SimpleName.SimpleNameResolve): Also be useful for LValue
11392         resolution.   We need this to propagate assign to local readonly variables
11393
11394         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11395         do not want to reuse potential criteria memory.
11396
11397         * class.cs (MyEventBuilder): Set reflected_type;
11398
11399         * ecore.cs (Constantify): Added support for constifying bools.
11400
11401         (RootContext.LookupType): Added a cache for values looked up in
11402         the declaration space.
11403
11404         * typemanager.cs (FindMembers): Now is a front-end to
11405         RealFindMembers, and provides a two-level hashtable-based cache to
11406         the request.  
11407
11408         15% performance improvement: from 22.5 to 19.2 seconds.
11409
11410         * expression.cs (IsParamsMethodApplicable): use foreach.
11411         (Invocation.DoResolve): ditto.
11412         (New.DoResolve): ditto.
11413         (ArrayCreation.DoResolve): ditto.
11414
11415         * ecore.cs (FindMostEncompassingType): use foreach.
11416
11417         * delegate.cs (NewDelegate.DoResolve): Use foreach
11418
11419         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11420         (RemoveMethods): use foreach.
11421
11422         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11423         nested foreach statements instead of for, and also break out of
11424         the inner loop once a match is found.
11425
11426         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11427
11428 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11429
11430         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11431         we actually unwrap the expression to allow for extra information
11432         to be extracted. 
11433
11434         * expression.cs: Use Shr_Un on unsigned operations. 
11435
11436 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11437
11438         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11439         applicable operators was not being considered correctly. This closes
11440         the bug Miguel reported.
11441
11442 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11443
11444         * attribute.cs: check that the type derives from System.Attribute
11445         and report the correct error in that case (moved the duplicate code to
11446         its own method, too).
11447
11448 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11449
11450         * attribute.cs: lookup attribute type name as the spec says: first the
11451         bare attribute name and then name + "Attribute" (nant compiles with
11452         mcs after this fix).
11453
11454 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11455
11456         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11457         Because of the way we parse things, we should try to see if a
11458         UIntConstant can fit in an integer.
11459
11460 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11461
11462         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11463         when we are in an explicit context.
11464
11465         (ConvertReferenceExplicit): When converting from Iface type S to Class
11466         T make sure the rules are implemented as an OR.
11467
11468         * parameter.cs (ParameterType): Make it a property for now although the
11469         purpose really isn't anything immediate.
11470
11471         * expression.cs (Is*Applicable): Do better checking on the parameter type
11472         of a ref/out parameter. The ones from the system assemblies are already 
11473         marked with the correct type so we don't need to do any correction.
11474
11475         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11476         the object type is standard too so include that.
11477
11478 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11479
11480         * ecore.cs (StandardConversionExists): Augment with missing code:
11481         deal with IntConstant, LongConstants and Enumerations.
11482
11483         * assign.cs: Report the error, instead of failing silently
11484
11485         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11486         typecontainer that they are declared, because the
11487         typecontainer/namespace will have the list of using clauses that
11488         need to be applied.
11489
11490         Assembly Attributes were escaping the normal registration
11491         mechanism. 
11492
11493         (EmitCode): Apply attributes within an EmitContext that represents
11494         the container they were declared on.
11495
11496         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11497
11498 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11499
11500         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11501         Revamp completely - make much cleaner as we now operate only
11502         on a set of Types.
11503
11504         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11505         to implement the logic detailed in the spec more correctly.
11506
11507         (UserDefinedConversion): Update accordingly.
11508
11509 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11510
11511         * statement.cs: Return flow analysis information up.
11512
11513         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11514         and the default.
11515
11516         (token): Do not consume an extra character before calling
11517         decimal_digits.
11518
11519 2002-05-06  Piers Haken <piersh@friskit.com>
11520
11521         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11522
11523 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11524
11525         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11526         EmitContext during the instance constructor initializer
11527         resolution, to stop access to instance variables.
11528
11529         This is mandated by the spec, last paragraph of the `constructor
11530         initializers' section. 
11531
11532 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11533
11534         * cs-parser.jay, class.cs (Accessor): new class used to represent
11535         an accessor (get or set).  In the past we used `null' to represent
11536         a missing accessor.  But this is ambiguous because there was no
11537         way to tell in abstract indexers/properties if one of them was
11538         specified.
11539
11540         Now there is a way of addressing that.
11541
11542         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11543         instead of FindMembers.
11544
11545         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11546         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11547
11548         * attribute.cs: Treat indexers and properties as the same in terms
11549         of applying attributes
11550
11551         * ecore.cs (FindMostEncompassedType): Use statically initialized
11552         EmptyExpressions()s like we do elsewhere to avoid creating useless
11553         objects (and we take this out of the tight loop).
11554
11555         (GetConversionOperators): Move the code to extract the actual
11556         operators to a separate routine to clean things up.
11557
11558 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11559
11560         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11561         events are always registered FieldBuilders.
11562
11563         * class.cs (FieldBase): New class shared by Fields 
11564
11565         * delegate.cs: If we are a toplevel delegate, use our full name.
11566         If we are a nested delegate, then only use our tail name.
11567
11568 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11569
11570         * expression.cs (IsApplicable): Ensure that we add the "&" to
11571         ref/out types before comparing it with the type of the argument.
11572
11573         (IsParamsMethodApplicable): Ditto.
11574
11575         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11576         silly me ;-)
11577
11578         * delegate.cs : Handle the case when we have more than one applicable
11579         method. Flag an error only when we finish checking all.
11580
11581 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11582
11583         * expression.cs: Add support for boolean static initializers.
11584
11585 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11586
11587         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11588
11589         * parameter.cs (ComputeParameterTypes,
11590         ComputeAndDefineParameterTypes): Better error handling: now we
11591         clear the `types' cache if we fail during any of the type lookups.
11592         We also return the status code correctly to our caller
11593
11594         * delegate.cs: If we fail to define a delegate, abort the extra
11595         steps. 
11596
11597         * expression.cs (Binary.ResolveOperator): for
11598         operator==(object,object) and operator !=(object, object) we also
11599         have to verify that there is an implicit conversion from one to
11600         the other.
11601
11602         (ArrayAccess.DoResolve): Array Access can operate on
11603         non-variables. 
11604
11605 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11606
11607         * assign.cs (CompoundAssign): A new class used as a "flag" that
11608         the assignment actually is happening as part of a compound
11609         assignment operator.
11610
11611         During compound assignment, a few new rules exist to enable things
11612         like:
11613
11614         byte b |= 1 + 2
11615
11616         From the spec:
11617
11618         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11619         to the type of x) if y is implicitly convertible to the type of x,
11620         and the operator is a builtin operator and the return type of the
11621         operator is explicitly convertible to the type of x. 
11622
11623         * rootcontext.cs: Reset warning level to 2.  4 catches various
11624         "interesting" features in mcs, we must clean this up at some
11625         point, but currently am trying to kill other bugs ;-)
11626
11627         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11628         in container classes as well.  
11629
11630         * expression.cs (Binary.ResolveOperator): Handle string case
11631         before anything else (as operator overloading does emit an error
11632         before doing anything else).
11633
11634         This code could go away when we move to a table driven model, but
11635         i could not come up with a good plan last night.
11636
11637 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11638
11639         * typemanager.cs (CSharpName): reimplementation using regex.
11640         * class.cs: added null check for fields in Emit
11641         * rootcontext.cs: set warninglevel to 4
11642
11643 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11644
11645         * typemanager.cs (CSharpName): reimplemented with Lupus
11646         suggestion.
11647
11648 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11649
11650         * statement.cs (If): correclty implement Resolve, because we were
11651         not catching sem errors in there.  The same process is needed
11652         everywhere else. 
11653         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11654
11655
11656         (Statement.Warning_DeadCodeFound): Factorize code.
11657         (While): Report dead code here too.
11658
11659         (Statement): Added Resolve virtual method to allow
11660         for resolution split from the emit code.
11661
11662 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11663
11664         * statement.cs (EmitBoolExpression): No longer try to resolve the
11665         expression here.    
11666         (MakeBoolean): New utility function that resolve, implicitly
11667         converts to boolean and tags the expression. 
11668
11669
11670         (If, Do): Implement dead code elimination.
11671         (While): Implement loop inversion
11672
11673         (Do, While, For, If): Resolve the expression prior to calling our
11674         code generation.
11675
11676 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11677
11678         * class.cs:
11679           - added method Report28 (warning: program has more than one entry point)
11680           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11681           - modified method Method.Define, the part at the end of the method
11682
11683         * rootcontext.cs: added static public Location EntryPointLocation;
11684           
11685         * ../errors/cs0028.cs : Add test case for the above warning.              
11686
11687         * typemanager.cs:
11688           - modified method CSharpName to allow arrays of primitive type to
11689             be printed nicely (e.g. instead of System.Int32[][] it now prints
11690             int[][])
11691           - added method CSharpSignature: returns the signature of a method
11692             in string format to be used in reporting errors, warnings, etc.
11693
11694         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11695         with String.Empty.
11696
11697 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11698
11699         * delegate.cs (Define): Fix extremely silly bug where I was
11700         setting the type of the 'object' parameter of the BeginInvoke
11701         method to System.IAsyncResult instead of System.Object ;-)
11702
11703 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11704
11705         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11706         here. 
11707
11708         (Constructor.Emit): return if we fail to initialize the
11709         constructor.  Another door closed!  
11710
11711         * expression.cs (New.DoResolve): Improve error message (from -6 to
11712         1501).  Use DeclaredOnly lookup to find the exact constructor.
11713
11714         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11715         loop.  This is useful.
11716
11717         * cs-parser.jay: Adjust the default parameters so that destructors
11718         have the proper signature.
11719
11720 2002-04-26  Martin Baulig  <martin@gnome.org>
11721
11722         * driver.cs (LoadAssembly): If `assembly' contains any characters
11723         which are only valid in path names and not in assembly names
11724         (currently slash, backslash and point), use Assembly.LoadFrom ()
11725         instead of Assembly.Load () on the `assembly' (before iteration
11726         over the link_paths).
11727
11728 2002-04-26  Martin Baulig  <martin@gnome.org>
11729
11730         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11731
11732 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11733
11734         * class.cs (Property): use the new typemanager.MemberLookup
11735
11736         (TypeContainer.MemberLookup): Implement using the
11737         TypeManager.MemberLookup now. 
11738
11739         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11740         and return MemberInfos, so that these can be used without an
11741         EmitContext (what we had before).
11742
11743 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11744
11745         * expression.cs: Fix the case where the argument to params if the
11746         type of the params.  I omitted handling this before.   Fixed
11747
11748 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11749
11750         * driver.cs: Call BootCorlib_PopulateCoreType
11751
11752         * class.cs (Property.CheckBase): Check for properties only, not
11753         for all members. 
11754
11755         * interface.cs: Temporary hack: try/catch around the
11756         CustomAttributeBuilder, because I am getting an exception that I
11757         do not understand.
11758
11759         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11760         types whose definitions are required to be there (attributes are
11761         defined before standard types).
11762
11763         Compute definitions as we boot the various types, as they are used
11764         immediately (value_type class will need object_type, but if we do
11765         not initialize object_type, we will pass a null, which will let
11766         the runtime pick the System.Object from the existing corlib, which
11767         is not what we want).
11768
11769 2002-04-22  Patrik Torstensson <totte@labs2.com>
11770
11771         * cs-tokenizer.cs: fixed a number of trim() issues.
11772
11773 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11774
11775         * expression.cs (Argument.Type): Ensure that we return the correct
11776         type when we have out or ref parameters [in which case we 
11777         append a "&"].
11778
11779 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11780
11781         * class.cs (Property, Indexer): Allow extern modifier in there. 
11782
11783         * typemanager.cs (InitBaseTypes): Initializes object_type and
11784         value_type, since those will be used early on during the bootstrap
11785         process to compile corlib.
11786
11787         (InitCoreTypes): Move code from here to InitBaseTypes.
11788
11789 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11790
11791         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11792         single-dimension arrays as using the ldlen opcode.  
11793
11794         Daniel Lewis discovered this optimization.  
11795
11796         * typemanager.cs: Add signature for System.Array::get_Length
11797
11798 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11799
11800         * statement.cs: report the error when the foreach does not apply to an
11801         array nor a collection.
11802
11803 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11804
11805         * expression.cs: Add implicit conversions to the operator ~.
11806
11807         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11808
11809         * typemanager.cs: Locate the decimal constructor.
11810
11811 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11812
11813         * attribute.cs: use the new property of TypeOf.
11814         * expression.cs: added 'get' property around typearg.
11815
11816         These changes fix a build breaker reported by NickD. Is this the
11817         correct way to fix?  If not, please, revert my changes and make it
11818         work :-).
11819
11820 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11821
11822         * attribute.cs: Add support for typeof in attribute invocations.
11823         I am not sure that this is right though.
11824
11825 2002-04-14  Duncan Mak  <duncan@ximian.com>
11826
11827         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11828         Binary.Operator.Division case.
11829
11830 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11831
11832         * class.cs (DefineType): Ensure that we do a proper check on
11833         attribute types and also register it with the TypeManager.
11834
11835         (TypeContainer.Targets): The default for attribute types is
11836         AttributeTargets.All.
11837
11838         * attribute.cs (ApplyAttributes): Registering the attribute type
11839         is done elsewhere, not when we discover we have a Usage attribute.
11840
11841 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11842
11843         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11844         and get rid of is_delegate parameter.
11845
11846         * everywhere : update.
11847
11848 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11849
11850         * cs-parser.jay (compilation_unit): Revamp completely to use
11851         some new ideas that I got from Rhys' grammar to solve the problems
11852         with assembly level attributes.
11853
11854         (outer_declaration): New grammar production.
11855
11856         (attribute_sections): Add.
11857
11858         (opt_attributes): Base on attribute_sections
11859
11860         (namespace_declaration): Allow opt_attributes to tackle the case
11861         when we have assembly level attributes - we are clever in this
11862         regard now ;-)
11863
11864         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11865         attributes in the non-global context.
11866
11867         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11868         instead of SetGlobalAttributes.
11869
11870         * class.cs, rootcontext.cs : Ensure we define and generate 
11871         attribute types before anything else.
11872
11873         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11874         and flag the new error -20 for the case when the attribute type
11875         does not have valid targets specified. csc does not catch this.
11876
11877         * ../errors/errors.txt : update for error # -20
11878
11879 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11880
11881         * support.cs (InternalParameters.ParameterModifier): Do some null
11882         checking and return sane values.
11883
11884         * class.cs (Method.Define): If we are a PInvoke method, ensure
11885         that we are static and extern. Report error # 601
11886
11887         * ../errors/cs0601.cs : Add test case for the above error.
11888
11889 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11890
11891         * rootcontext.cs (attribute_types): We need to keep type of
11892         all attribute types separately and emit code for them first.
11893
11894         (RegisterAttribute) : Implement.
11895
11896         * class.cs (DefineType): Check if the current Type is a custom
11897         attribute type and register it accordingly.
11898
11899         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11900         adding the first attribute twice and rename to
11901
11902         (SetGlobalAttributes): this.
11903
11904         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11905         lookups.
11906
11907         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11908         if we are processing global arguments. Hmm, I am unsure of this.
11909
11910 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11911
11912         * expression.cs: added static array of strings to avoid calling
11913         Enum.ToString () for Operator in Binary. Significant recover of
11914         performance.
11915
11916 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11917
11918         * class.cs (FindMembers): Allow the Builders of the various
11919         members to be null.  If they are skip them.  This only happens
11920         during the PInvoke declaration.
11921
11922 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11923
11924         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11925         failure, so we do not keep going afterwards.
11926
11927         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11928         wanted to pass `false' as the `is_delegate' argument.  If this is
11929         the case, why not use delegate_type == null to mean `is_delegate =
11930         false' and anything else as is_delegate = true.
11931
11932 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11933
11934         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11935         code for the section, not the beginning of the tests.
11936
11937 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11938
11939         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11940
11941         * expression.cs (Binary): same.  Warn about errors where we have
11942         Enum/Enum in operator + as well.
11943
11944 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11945
11946         * statement.cs:
11947                 - added support for switch(bool)
11948                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11949                 - add TableSwitchEmit() to handle table-based switch statements
11950
11951 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11952
11953         * expression.cs (Invocation.OverloadResolve): Factor out code which
11954         does parameter compatibility checking with arguments so that we can 
11955         re-use the code even from Delegate.VerifyApplicability
11956
11957         (VerifyArgumentsCompat): Move above code here.
11958
11959         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11960         and instead make a call to the above method.
11961
11962 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11963
11964         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11965         We use it to keep track of classes which are attribute types.
11966
11967 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11968
11969         * delegate.cs (Delegate.Define): Correctly define the types in the
11970         presence of fixed and array parameters.
11971
11972         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11973         doing FindMembers.
11974
11975         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11976         include NonPublic after the first iteration.
11977
11978         * class.cs (Indexer.CheckBase): Only check if both parents are
11979         non-null. 
11980
11981         * cs-parser.jay (accessor_body): If empty, set to null.
11982
11983         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11984         same code path here to resolve constants names that we did have in
11985         MemberAccess.DoResolve.  There is too much code duplicated here.
11986
11987 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11988
11989         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11990
11991         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11992         to MakeUnionSet.
11993
11994         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11995         tokens, numbers and strings.
11996
11997         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11998         parenthesis.
11999
12000         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12001         asyncronous parameters and the regular parameters.  
12002
12003         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12004         specify the target directory.
12005
12006         * expression.cs: (This.DoResolve): Simplify
12007         (As.Emit): Optimize, do not generate IsInst if the expression is
12008         always of the given type.
12009
12010         (Is.DoResolve): Bug fix, we were reporting both always/never for
12011         the is expression.
12012
12013         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12014         creating too many unnecessary arrays.
12015
12016 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12017
12018         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12019         fields instead of rolling our own initializer.   Takes care of all
12020         implicit conversions, and drops unnecessary static checks/argument.
12021
12022 2002-03-31  Dick Porter  <dick@ximian.com>
12023
12024         * driver.cs: use the GetDirectories() return values properly, and
12025         use "/" as path separator.
12026
12027 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12028
12029         * expression.cs (Unary): Optimize - - expr into expr.
12030         (Binary): Optimize a + (-b) into a -b.
12031
12032         * codegen.cs (CodeGen): Made all methods static.
12033
12034 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12035
12036         * rootcontext.cs: 
12037
12038         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12039         TypeBuilder property.
12040
12041         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12042         instead. 
12043
12044         * tree.cs: Removed the various RecordXXXX, and replaced with a
12045         single RecordDecl.  Removed all the accessor methods, and just
12046         left a single access point Type 
12047
12048         * enum.cs: Rename DefineEnum to DefineType.
12049
12050         * decl.cs: New abstract method `DefineType' used to unify the
12051         Defines for Enumerations, Interfaces, TypeContainers and
12052         Delegates.
12053
12054         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12055         LookupBaseClasses method that used to live in class.cs and
12056         interface.cs here, and renamed to FindType.
12057
12058         * delegate.cs: Implement DefineType.  Take advantage of the
12059         refactored pattern for locating the parent builder without taking
12060         the parent_builder argument (which we know does not work if we are
12061         nested, and triggering a toplevel definition).
12062
12063 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12064
12065         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12066         accessibility of a member has changed during override and report
12067         an error if so.
12068
12069         * class.cs (Method.Define, Property.Define): Only complain on
12070         overrides if the method is private, any other accessibility is
12071         fine (and since we just checked the permission is the same, we are
12072         good to go).
12073
12074         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12075         and elif are processed always.  The other pre-processing
12076         directives are only processed if we are "taking" the path
12077
12078 2002-03-29  Martin Baulig  <martin@gnome.org>
12079
12080         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12081         current location is not Null.
12082
12083         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12084         a separate method so we can profile it.
12085
12086         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12087         `span.Seconds' are just seconds, but no minutes or hours.
12088         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12089
12090 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12091
12092         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12093         Remove the gratuitous set of Final:
12094
12095                                 // If an interface implementation, then we can set Final.
12096                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12097                                     implementing.DeclaringType.IsInterface)
12098                                         flags |= MethodAttributes.Final;
12099
12100         I do not know what I was smoking when I used that.
12101
12102
12103         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12104         step into fixing the name resolution issues for delegates and
12105         unifying the toplevel name resolution.
12106
12107 2002-03-28  Martin Baulig  <martin@gnome.org>
12108
12109         * class.cs (Method.Emit): If we have a symbol writer, call its
12110         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12111         tell it about the current method.
12112
12113         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12114         writer that we're going to emit the first byte of IL code for a new
12115         statement (a new source line).
12116         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12117         EmitContext.Mark() before emitting any code.
12118
12119         * location.cs (SymbolDocument): Return null when we're Null.
12120
12121         * statement.cs (Statement): Moved the `Location loc' variable here.
12122         (Statement.EmitBoolExpression): If we have a symbol writer, call
12123         ec.Mark() before emitting any code to tell it that we're at the
12124         beginning of a new statement.
12125         (StatementExpression): Added `Location' argument to the constructor.
12126         (Block): Added public readonly variable `StartLocation' and public
12127         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12128         (Block): Added constructor which takes a start and end location.
12129         (Block.SetEndLocation): New method. This sets the end location.
12130         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12131         local variables we create.
12132         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12133         each statement and do also mark the begin and end of the block.
12134
12135         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12136         tell it the current lexer.Location, use Location.Null for the end of the
12137         block.
12138         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12139         current block, set its end location using SetEndLocation().
12140         (statement_expression): StatementExpression constructor now takes the
12141         lexer.Location as additional argument.
12142         (for_statement, declare_local_variables): Likewise.
12143         (declare_local_variables): When creating a new implicit block, use the
12144         new Block constructor and pass it the lexer.Location.
12145
12146 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12147
12148         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12149         members also on the parent interfaces recursively.
12150
12151 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12152
12153         * report.cs: Use new formats, since Gonzalo finished the missing
12154         bits. 
12155
12156         * expression.cs (Binary.ResolveOperator): added missing operator|
12157         operator& and operator^ for bool/bool.
12158
12159         * cs-parser.jay: CheckDef now takes a Location argument that is
12160         used to report errors more precisly (instead of reporting the end
12161         of a definition, we try to track something which is a lot closer
12162         to the source of the problem).
12163
12164         * cs-tokenizer.cs: Track global token use, so we can properly flag
12165         the use of #define/#undef after the first token has been seen.
12166
12167         Also, rename the reportXXXX to Error_DescriptiveName
12168
12169         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12170         TypeContainer, so that Enum and Interface can use this too.
12171
12172         * class.cs (TypeContainer.LookupInterfaceOrClass,
12173         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12174         `builder' argument.  Typically this was used to pass the parent
12175         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12176         the definition).  
12177
12178         The problem is that a nested class could trigger the definition of
12179         a toplevel class, and the builder would be obviously wrong in that
12180         case. 
12181
12182         So we drop this argument, and we compute dynamically the
12183         TypeBuilder/ModuleBuilder (the correct information was available
12184         to us anyways from DeclSpace.Parent)
12185
12186         * interface.cs (Interface.DefineInterface): Drop builder
12187         parameter cleanup like class.cs
12188
12189         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12190         like class.cs
12191
12192         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12193         values. 
12194
12195         (Try.Emit): Propagate the returns value from the statement.
12196
12197         (Return.Emit): Even if we are leavning 
12198
12199         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12200
12201         * modifiers.cs: Fix the computation of MethodAttributes flags.
12202
12203 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12204
12205         * driver.cs: allow compilation of files that start with '/'.
12206         Add a default case when checking the argument of --target.
12207
12208 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12209
12210         * interface.cs: Implement the same search algorithm for types in
12211         the interface code.
12212
12213         * delegate.cs: Do not allow multiple definition.
12214
12215         * Recovered ChangeLog that got accidentally amputated
12216
12217         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12218
12219         * rootcontext.cs: Load manually enum to allow core classes to
12220         contain enumerations.
12221
12222         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12223         Update to new static methods in TypeManager.
12224
12225         * typemanager.cs (GetMethod, GetConstructor): Use our
12226         implementation of FindMembers to find the members, since during
12227         corlib compilation, the types are TypeBuilders and GetMethod and
12228         GetConstructor do not work.
12229
12230         Make all methods in TypeManager static.
12231
12232         (InitCodeHelpers): Split the functionality from
12233         the InitCodeTypes function.
12234
12235         * driver.cs: Call InitCodeHelpers after we have populated the
12236         types. 
12237
12238         * cs-parser.jay (delegate_declaration): we did not used to compute
12239         the delegate name correctly for void delegates.
12240
12241 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12242
12243         * rootcontext.cs (RootContext): Init the interface_resolve_order
12244         and type_container_resolve_order always.
12245
12246         (ResolveCore, BootstrapCorlib_ResolveClass,
12247         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12248         compiler when compiling with --nostdlib
12249
12250         * class.cs (TypeContainer.DefineType): Check that our parent is
12251         not null.  This test is most important when we are bootstraping
12252         the core types.
12253
12254         * codegen.cs: Split out the symbol writing code.
12255
12256 2002-03-25  Martin Baulig  <martin@gnome.org>
12257
12258         * driver.cs (-g): Made -g an alias for --debug.
12259
12260 2002-03-24  Martin Baulig  <martin@gnome.org>
12261
12262         * codegen.cs (SymbolWriter): New public variable. Returns the
12263         current symbol writer.
12264         (CodeGen): Added `bool want_debugging_support' argument to the
12265          constructor. If true, tell the ModuleBuild that we want debugging
12266         support and ask it for the ISymbolWriter.
12267         (Save): If we have a symbol writer, call it's Close() method after
12268         saving the assembly.
12269
12270         * driver.c (--debug): New command line argument to create a
12271         debugger information file.
12272
12273         * location.cs (SymbolDocument): New public property. Returns an
12274         ISymbolDocumentWriter object for the current source file or null
12275         if we don't have a symbol writer.
12276
12277 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12278
12279         * driver.cs (LoadAssembly): Correctly return when all the paths
12280         have been tried and not before.
12281
12282         * statement.cs (Switch.Emit): return the actual coverage for this
12283         statement (returns/not-returns)
12284
12285         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12286         switch of the statement if we are the last switch section.  That
12287         kills two problems: try/catch problems (we used to emit an empty
12288         nop at the end) and switch statements where all branches would
12289         return. 
12290
12291 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12292
12293         * driver.cs: Add default assemblies (the equivalent to the
12294         Microsoft CSC.RSP file)
12295
12296         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12297         also update tokens_seen and set it to false.
12298
12299         * driver.cs: Implement --recurse for Mike.
12300
12301         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12302         correctly splitting out the paths.
12303
12304 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12305
12306         * interface.cs (Interface.PopulateProperty): Instead of using
12307         `parent' as the declaration space for the set parameters, use
12308         `this' 
12309
12310         * support.cs (InternalParameters): InternalParameters constructor
12311         takes a DeclSpace instead of a TypeContainer.
12312
12313         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12314         types are being initialized, load the address of it before calling
12315         the function.  
12316
12317         (New): Provide a mechanism to disable the generation of local
12318         value type temporaries when the caller will be providing us with
12319         an address to store it.
12320
12321         (ArrayCreation.EmitDynamicInitializers): Use it.
12322
12323 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12324
12325         * expression.cs (Invocation.EmitArguments): Only probe for array
12326         property if there is more than one argument.  Sorry about that.
12327
12328         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12329         empty param arrays.
12330
12331         * class.cs (Method.LabelParameters): Fix incorrect code path that
12332         prevented the `ParamArrayAttribute' from being applied to the
12333         params attribute.
12334
12335 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12336
12337         * support.cs (ReflectionParameters): Correctly compute whether the
12338         last argument is a params array.  Fixes the problem with
12339         string.Split ('a')
12340
12341         * typemanager.cs: Make the assemblies array always be non-null
12342         (empty, but non-null)
12343
12344         * tree.cs (RecordDecl): New function that abstracts the recording
12345         of names.  This reports error 101, and provides a pointer to the
12346         previous declaration.  Fixes a crash in the compiler.
12347
12348         * cs-parser.jay (constructor_declaration): Update to new grammar,
12349         and provide a constructor_body that can be empty.
12350
12351 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12352
12353         * driver.cs: Add support for --resources.
12354
12355         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12356         Make all types for the various array helper methods be integer.
12357
12358         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12359         CheckState to ConvCast.
12360
12361         (ConvCast): Now it takes a `checked' state argument, to avoid
12362         depending on the emit context for the conversion, and just using
12363         the resolve time setting.
12364
12365         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12366         instead of Invocation.EmitArguments.  We do not emit the original
12367         arguments, instead we emit those which have been converted to
12368         unsigned int expressions.
12369
12370         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12371
12372         * codegen.cs: ditto.
12373
12374         * expression.cs (LocalVariableReference): Drop the use of the
12375         Store function that depended on the variable index.
12376
12377         * statement.cs (VariableInfo): Drop the `Idx' property from this
12378         class, as this is not taking into account the indexes for
12379         temporaries tat we generate during the execution, getting the
12380         indexes wrong.
12381
12382         * class.cs: First emit class initializers, then call the parent
12383         constructor. 
12384
12385         * expression.cs (Binary): Fix opcode emision.
12386         (UnaryMutator.EmitCode): Support checked code generation
12387
12388         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12389         matches for events for both the Static and Instance scans,
12390         pointing to the same element.   Fix that.
12391
12392 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12393
12394         * rootcontext.cs (ResolveTree): Always set the
12395         interface_resolve_order, because nested interfaces will be calling
12396         into us.
12397
12398         * class.cs (GetInterfaceOrClass): Track the same resolution
12399         process used by TypeManager.LookupType.  This fixes the nested
12400         type lookups in class declarations (separate path from
12401         LookupType). 
12402
12403         (TypeContainer.DefineType): Also define nested interfaces.
12404         (TypeContainer.RegisterOrder): New public function used to
12405         register the order in which child interfaces need to be closed.
12406
12407         Nested interfaces need to be closed after their parents have been
12408         created. 
12409
12410         * interface.cs (InterfaceAttr): Put all the logic for computing
12411         the interface attribute here. 
12412
12413         (DefineInterface): Register our interface order with the
12414         RootContext or with the TypeContainer depending on the case.
12415
12416 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12417
12418         * cs-parser.jay: rework foreach statement to work with the new
12419         changes to the policy on SimpleNames.
12420
12421         * report.cs: support Stacktrace on warnings as well.
12422
12423         * makefile: drop --unsafe and /unsafe from the compile.
12424
12425 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12426
12427         * ecore.cs (StandardConversionExists): Modify to take an Expression
12428         as the first parameter. Ensure we do null -> reference type conversion
12429         checking.
12430
12431         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12432         temporary Expression objects.
12433
12434 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12435
12436         * interface.cs: workaround bug in method overloading resolution
12437         (there is already a bugzilla bug for it).
12438
12439 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12440
12441         We could also solve this problem by having a separate path for
12442         performing type lookups, instead of DoResolve, we could have a
12443         ResolveType entry point, and only participating pieces of the
12444         production (simplename, deref, array) would implement this. 
12445
12446         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12447         signal SimpleName to only resolve type names and not attempt to
12448         resolve anything else.
12449
12450         * expression.cs (Cast): Set the flag.
12451
12452         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12453
12454         * class.cs: Only report 108 if there is no `new' modifier.
12455
12456         * cs-parser.jay: rework foreach statement to work with the new
12457         changes to the policy on SimpleNames.
12458
12459         * report.cs: support Stacktrace on warnings as well.
12460
12461         * makefile: drop --unsafe and /unsafe from the compile.
12462
12463 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12464
12465         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12466         lookups here, instead of doing that at parse time.  This means
12467         that our grammar will not introduce `LocalVariableReferences' as
12468         expressions at this point.  That solves the problem of code like
12469         this:
12470
12471         class X {
12472            static void Main ()
12473            { int X = 1;
12474             { X x = null }}}
12475
12476         This is only half the fix.  The full fix requires parameters to
12477         also be handled in this way.
12478
12479         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12480         makes the use more obvious of the DeclSpace.  The
12481         ec.TypeContainer.TypeBuilder is now only used to pull the
12482         TypeBuilder for it.
12483
12484         My theory is that I can get rid of the TypeBuilder completely from
12485         the EmitContext, and have typecasts where it is used (from
12486         DeclSpace to where it matters).  
12487
12488         The only pending problem is that the code that implements Aliases
12489         is on TypeContainer, and probably should go in DeclSpace.
12490
12491         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12492         lookups here, instead of doing that at parse time.  This means
12493         that our grammar will not introduce `LocalVariableReferences' as
12494         expressions at this point.  That solves the problem of code like
12495         this:
12496
12497         class X {
12498            static void Main ()
12499            { int X = 1;
12500             { X x = null }}}
12501
12502         This is only half the fix.  The full fix requires parameters to
12503         also be handled in this way.
12504
12505         * class.cs (Property.DefineMethod): When implementing an interface
12506         method, set newslot, when implementing an abstract method, do not
12507         set the flag (before we tried never setting it, or always setting
12508         it, which is the difference).
12509         (Indexer.DefineMethod): same.
12510         (Method.DefineMethod): same.
12511
12512         * ecore.cs: Only set the status used flag if we get back a Field.
12513
12514         * attribute.cs: Temporary hack, so Paolo can keep working.
12515
12516 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12517
12518         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12519         the unmanaged type in the case we have a MarshalAs attribute.
12520
12521         (Resolve): Handle the case when we are parsing the special MarshalAs
12522         attribute [we need to store the unmanaged type to use later]
12523
12524         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12525         MarshalAs Attribute.
12526
12527         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12528         on parameters and accordingly set the marshalling info.
12529
12530 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12531
12532         * class.cs: Optimizing slightly by removing redundant code after
12533         we switched to the `NoTypes' return value.
12534         (Property.DefineMethod): use NoTypes here too.
12535
12536         This fixes the bug I introduced in my last batch of changes.
12537
12538 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12539
12540         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12541
12542         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12543         Enums since those are types too. 
12544
12545         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12546
12547         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12548         thanks to a call during the lookup process.
12549
12550 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12551
12552         * statement.cs (Foreach): Lots of work to accomodate a particular
12553         kind of foreach statement that I had not kept in mind.  It is
12554         possible to have foreachs on classes that provide a GetEnumerator
12555         method that return objects that implement the "pattern" for using
12556         a foreach, there is no need to support GetEnumerator
12557         specifically. 
12558
12559         This is needed to compile nant.
12560
12561         * decl.cs: Only report 114 if the member is not `Finalize' and if
12562         the warning level is at least 2.
12563
12564         * class.cs: Moved the compare function from Method to
12565         MethodSignature. 
12566
12567         (MethodSignature.InheritableMemberSignatureCompare): Add new
12568         filter function that is used to extract inheritable methods from a
12569         class. 
12570
12571         (Method.Define): Use the new `inheritable_method_signature_filter'
12572         delegate
12573
12574         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12575         command. 
12576
12577 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12578
12579         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12580
12581         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12582
12583         * expression.cs: Pass location information to
12584         ConvertImplicitStandard. 
12585
12586         * class.cs: Added debugging code to track return values from
12587         interfaces. 
12588
12589 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12590
12591         * expression.cs (Is.DoResolve): If either side of the `is' is an
12592         interface, do not flag the warning.
12593
12594         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12595         for interfaces
12596
12597         * report.cs: Allow for --fatal to be used with --probe.
12598
12599         * typemanager.cs (NoTypes): Move the definition for the empty Type
12600         array here. 
12601
12602         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12603         properties. 
12604         (TypeContainer.DefineProxy): New function used to proxy to parent
12605         implementations when implementing interfaces.
12606         (TypeContainer.ParentImplements): used to lookup if our parent
12607         implements a public function that is required by an interface.
12608         (TypeContainer.VerifyPendingMethods): Hook this up.
12609
12610         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12611         `modules' and `assemblies' arraylists into arrays.  We only grow
12612         these are the very early start up of the program, so this improves
12613         the speedof LookupType (nicely measured).
12614
12615         * expression.cs (MakeByteBlob): Replaced unsafe code with
12616         BitConverter, as suggested by Paolo.
12617
12618         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12619         folding of string concatenation, but if either side is a string,
12620         and the other is not, then return null, and let the runtime use
12621         the concatenation on the string plus the object (using
12622         `Object.ToString'). 
12623
12624 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12625
12626         Constant Folding has been implemented now.
12627
12628         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12629         the error instead on types that are not supported in one's
12630         complement. 
12631
12632         * constant.cs (Constant and all children): New set of functions to
12633         perform implict and explicit conversions.
12634
12635         * ecore.cs (EnumConstant): Implement the new functions to perform
12636         conversion by proxying to the child expression.
12637
12638         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12639         own separate setting that can not be turned off from the command
12640         line using --unchecked or --checked and is only controlled using
12641         the checked/unchecked statements and expressions.  This setting is
12642         used by the constant folder to flag errors.
12643
12644         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12645         ConstantCheckState as well.   
12646
12647         During Resolve, they also have to flag the state, because the
12648         constant folder runs completely in the Resolve phase.
12649
12650         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12651         well.
12652
12653 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12654
12655         * cfold.cs: New file, this file contains the constant folder.
12656
12657         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12658         argument to track whether we are using the resulting address to
12659         load or store a value and provide better error messages. 
12660
12661         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12662         new AddressOf arguments.
12663
12664         * statement.cs (Foreach.EmitCollectionForeach): Update
12665
12666         * expression.cs (Argument.Emit): Call AddressOf with proper
12667         arguments to track usage.
12668
12669         (New.DoEmit): Call AddressOf with new arguments.
12670
12671         (Unary.Emit): Adjust AddressOf call.
12672
12673 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12674
12675         * cs-parser.jay (member_access): Change the case for pre-defined types
12676         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12677         this suggestion.
12678
12679         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12680         a method body.
12681
12682         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12683         essentially like methods and apply attributes like MethodImplOptions to them too.
12684
12685         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12686         not being null.
12687
12688         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12689         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12690         is the DeclSpace.
12691
12692         * Update code everywhere accordingly.
12693
12694         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12695
12696         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12697
12698 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12699
12700         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12701         try performing lookups against those instead of jumping straight into using
12702         the 'using' clauses.
12703
12704         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12705
12706         (LookupType): Perform lookups in implicit parents too.
12707
12708         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12709         sequence as RootContext.LookupType. 
12710
12711         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12712         the various cases of namespace lookups into this method.
12713
12714 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12715
12716         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12717         in positional arguments)
12718
12719         * class.cs (Operator): Update the AllowedModifiers to contain
12720         extern. 
12721
12722         * cs-parser.jay: Update operator declaration to allow for the
12723         operator body to be empty.
12724
12725         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12726         values. 
12727
12728 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12729
12730         * class.cs (Method.Emit): Label parameters.
12731
12732         * driver.cs: Return 1 or 0 as the program exit code.
12733
12734 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12735
12736         * expression.cs: Special case the `null' object when trying to
12737         auto-compute the type, as anything can be explicitly converted to
12738         that. 
12739
12740         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12741         spotting this Paolo.
12742
12743         (Expression.ImplicitNumericConversion): Perform comparissions of
12744         the type using the underlying type in the case of an enumeration
12745         rather than using the enumeration type for the compare.
12746
12747         Cope with the underlying == type case, which is not possible to
12748         catch before. 
12749
12750         (Expression.ConvertNumericExplicit): Perform comparissions of
12751         the type using the underlying type in the case of an enumeration
12752         rather than using the enumeration type for the compare.
12753
12754         * driver.cs: If the user does not supply an extension, assume .exe
12755
12756         * cs-parser.jay (if_statement): Rewrote so that we can track the
12757         location for the if statement.
12758
12759         * expression.cs (Binary.ConstantFold): Only concat strings when
12760         the operation is "+", not everything ;-)
12761
12762         * statement.cs (Statement.EmitBoolExpression): Take a location
12763         argument. 
12764         (If, While, Do): Track location.
12765
12766         * expression.cs (Binary.ResolveOperator): In the object + string
12767         case, I was missing a call to ConvertImplicit
12768
12769 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12770
12771         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12772         Location arguments. Ensure we use RootContext.LookupType to do our work
12773         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12774
12775         * interface.cs (PopulateMethod): Handle the type of the parameter being
12776         null gracefully.
12777
12778         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12779         have a params method with no fixed arguments and a call is made with no
12780         arguments.
12781
12782 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12783
12784         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12785         the verbatim-string-literal
12786
12787         * support.cs (InternalParameters.ParameterModifier): handle null
12788         fixed parameters.
12789         (InternalParameters.ParameterType): ditto.
12790
12791         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12792         duplicating the name of the variable parameter.
12793         (GetParameterByName): Fix bug where we were not looking up array
12794         paramters if they were the only present (thanks Paolo!).
12795         (GetParameterInfo): We only have an empty set of types if both
12796         fixed and array are set to null.
12797         (GetParameterInfo-idx): Handle FixedParameter == null
12798
12799         * cs-parser.jay: Handle the case where there is no catch
12800         statements (missing null test).
12801
12802 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12803
12804         * driver.cs (MainDriver): Be conservative on our command line
12805         handling.
12806
12807         Catch DirectoryNotFoundException when calling GetFiles.
12808
12809         (SplitPathAndPattern): Used to split the input specification into
12810         a path and a pattern that we can feed to Directory.GetFiles.
12811
12812 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12813
12814         * statement.cs (Fixed): Implement the last case of the Fixed
12815         statement (string handling).
12816
12817         * expression.cs (StringPtr): New class used to return a char * to
12818         a string;  Used by the Fixed statement.
12819
12820         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12821
12822         * expression.cs (Binary.ResolveOperator): Remove redundant
12823         MemberLookup pn parent type.
12824         Optimize union call, we do not need a union if the types are the same.
12825         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12826         type.
12827
12828         Specialize the use of MemberLookup everywhere, instead of using
12829         the default settings. 
12830
12831         (StackAlloc): Implement stackalloc keyword.
12832
12833         * cs-parser.jay: Add rule to parse stackalloc.
12834
12835         * driver.cs: Handle /h, /help, /?
12836
12837         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12838         before we supported unsafe code.
12839
12840         * makefile: add --unsafe to the self compilation of mcs.
12841
12842 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12843
12844         * expression.cs (PointerArithmetic): New class that is used to
12845         perform pointer arithmetic.
12846         (Binary.Resolve): Handle pointer arithmetic
12847         Handle pointer comparission.
12848         (ArrayPtr): Utility expression class that is used to take the
12849         address of an array.
12850
12851         (ElementAccess): Implement array access for pointers
12852
12853         * statement.cs (Fixed): Implement fixed statement for arrays, we
12854         are missing one more case before we are done.
12855
12856         * expression.cs (Indirection): Implement EmitAssign and set the
12857         ExprClass to Variable.  This allows pointer dereferences to be
12858         treated as variables, and to have values assigned to them.
12859
12860         * ecore.cs (Expression.StoreFromPtr): New utility function to
12861         store values dereferencing.
12862
12863 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12864
12865         * expression.cs (Binary.ResolveOperator): Ensure that we are
12866         not trying to operate on a void type - this fixes the reported
12867         bug.
12868
12869         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12870         the parent implementation is sealed.
12871
12872         * ../errors/cs0239.cs : Add.
12873
12874         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12875
12876         * typemanager.cs (unverifiable_code_type): Corresponds to 
12877         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12878         which have unsafe code in them.
12879
12880         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12881         unsafe context.
12882
12883 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12884
12885         * cs-tokenizer.cs: Add support for @"litreal strings"
12886
12887         Make tokenizer accept pre-processor directives
12888         on any column (remove the old C-like limitation). 
12889
12890         * rootcontext.cs (EmitCode): Emit any global attributes.
12891         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12892
12893         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12894
12895         * cs-parser.jay: Add support for global attributes.  
12896
12897 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12898
12899         * expression.cs (Indirection): New helper class.  Unary will
12900         create Indirection classes to be able to implement the
12901         IMemoryLocation interface on it.
12902
12903 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12904
12905         * cs-parser.jay (fixed_statement): reference the right statement.
12906
12907         * statement.cs (Fixed.Emit): Finish implementing the fixed
12908         statement for the &x case.
12909
12910 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12911
12912         * class.cs (Property.Define, Method.Define): Remove newslot when
12913         `implementing'.  
12914
12915         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12916         wrong.  NewSlot should only be used if the `new' keyword is present.
12917
12918         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12919         locating our system dir.  Sorry about this.
12920
12921 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12922
12923         * driver.cs (GetSystemDir): Compute correctly the location of our
12924         system assemblies.  I was using the compiler directory instead of
12925         the library directory.
12926
12927 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12928
12929         * expression.cs (BetterFunction): Put back in what Miguel commented out
12930         since it is the correct fix. The problem is elsewhere ;-)
12931
12932         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12933         parameters of the parms method are themselves compatible or not !
12934
12935         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12936         to check that a class implements an interface before saying that an implicit
12937         conversion was allowed. Use ImplementsInterface to do the checking.
12938
12939 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12940
12941         * class.cs (Method.Define): Track whether we are an explicit
12942         implementation or not.  And only call DefineMethodOverride if we
12943         are an explicit implementation.
12944
12945         (Property.DefineMethod): Ditto.
12946
12947 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12948
12949         * expression.cs (BetterFunction): Catch hideous bug which was
12950          preventing us from detecting ambiguous calls due to implicit casts i.e
12951         cs0121.
12952
12953 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12954
12955         * support.cs (Pair): Remove un-needed method.  I figured why I was
12956         getting the error in cs-parser.jay, the variable in a foreach loop
12957         is readonly, and the compiler does not really treat this as a variable.
12958
12959         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12960         instead of EQUALS in grammar.  
12961
12962         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12963
12964         * expression.cs (Unary.DoResolve): Check whether the argument is
12965         managed or not.
12966
12967 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12968
12969         * support.cs: Api for Pair to set a value.  Despite the fact that
12970         the variables are public the MS C# compiler refuses to compile
12971         code that accesses the field if the variable is part of a foreach
12972         statement. 
12973
12974         * statement.cs (Fixed): Begin implementation of the fixed
12975         statement.
12976
12977         (Block.AddVariable): Return the VariableInfo on success and null
12978         on failure instead of true/false. 
12979
12980         * cs-parser.jay (foreach): Catch errors on variables already
12981         defined (we were ignoring this value before) and properly unwind
12982         the block hierarchy
12983
12984         (fixed_statement): grammar for the fixed statement.
12985
12986 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12987
12988         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12989         pointer types to be incretemented.
12990
12991         (SizeOf): Implement.
12992
12993         * cs-parser.jay (pointer_member_access): Implement
12994         expr->IDENTIFIER production.
12995
12996         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12997         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12998         on safe contexts.
12999
13000         (Unary): Implement indirection.
13001
13002         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13003         use in non-unsafe context).
13004
13005         (SimpleName.DoResolve): Check for pointers in field access on safe
13006         contexts. 
13007
13008         (Expression.LoadFromPtr): Factor the load-indirect code in this
13009         function.  This was duplicated in UnboxCast and ParameterReference
13010
13011 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13012
13013         * expression.cs (ComposedCast): report an error if a pointer cast
13014         is used in a safe region.
13015
13016         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13017         pointer type casts in unsafe context.
13018
13019         * codegen.cs (EmitContext): Set up IsUnsafe.
13020
13021         * cs-parser.jay (non_expression_type): Add productions for pointer
13022         casts. 
13023
13024         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13025         code.  We should not use force into static mode if the method is
13026         not virtual.  Fixes bug in MIS
13027
13028         * statement.cs (Do.Emit, While.Emit, For.Emit,
13029         Statement.EmitBoolExpression): Add support to Do and While to
13030         propagate infinite loop as `I do return' semantics.
13031
13032         Improve the For case to also test for boolean constants.
13033
13034         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13035         to the list of attributes we can add.
13036
13037         Remove `EmitContext' argument.
13038
13039         * class.cs (Method.Define): Apply parameter attributes.
13040         (Constructor.Define): Apply parameter attributes.
13041         (MethodCore.LabelParameters): Move here the core of labeling
13042         parameters. 
13043
13044         * support.cs (ReflectionParameters.ParameterModifier,
13045         InternalParameters.ParameterModifier): Use IsByRef on the type and
13046         only return the OUT bit for these parameters instead of in/out/ref
13047         flags.
13048
13049         This is because I miss-understood things.  The ParameterInfo.IsIn
13050         and IsOut represent whether the parameter has the [In] and [Out]
13051         attributes set.  
13052
13053 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13054
13055         * ecore.cs (FieldExpr.Emit): Release temporaries.
13056
13057         * assign.cs (LocalTemporary.Release): new function.
13058
13059         * codegen.cs (EmitContext.GetTemporaryStorage,
13060         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13061         temporary storage.  Now we can "put back" localbuilders when we
13062         are done with them
13063
13064 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13065
13066         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13067         need to make a copy of the variable to generate verifiable code.
13068
13069 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13070
13071         * driver.cs: Compute dynamically the system directory.
13072
13073         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13074         Slower, but more generally useful.  Used by the abstract
13075         registering implementation. 
13076
13077         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13078         the rules for the special rule on Type/instances.  First check if
13079         we have the same name, and if so, try that special static path
13080         rather than the instance path.
13081
13082 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13083
13084         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13085         for, while and if.
13086
13087         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13088         Enum, ValueType, Delegate or Array for non-corlib compiles.
13089
13090         * cs-tokenizer.cs: Catch long identifiers (645)
13091
13092         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13093         piece of code.
13094
13095         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13096         fix, we were returning too early, so we were not registering
13097         pending methods from abstract classes.
13098
13099         Do not register pending methods if the class is abstract.
13100
13101         * expression.cs (Conditional.DoResolve): Report circular implicit
13102         conversions when we neecd to compute it for conditional
13103         expressions. 
13104
13105         (Is.DoResolve): If the expression is always of the provided type,
13106         flag warning 183.  If the expression can not ever be of the
13107         provided type flag warning 184.
13108
13109         * class.cs: Catch 169 as well.
13110
13111         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13112         read. 
13113
13114 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13115
13116         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13117
13118 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13119
13120         * interface.cs: (PopulateMethod): Check for pointers being defined
13121         only if the unsafe context is active.
13122         (PopulateProperty): ditto.
13123         (PopulateIndexer): ditto.
13124
13125         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13126         specified.  If pointers are present, make sure that they are
13127         present in an unsafe context.
13128         (Constructor, Constructor.Define): ditto.
13129         (Field, Field.Define): ditto.
13130         (Property, Property.Define): ditto.
13131         (Event, Event.Define): ditto.
13132
13133         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13134         hashtable if there are classes or structs defined.
13135
13136         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13137         code, as the constant resolution moved.
13138
13139         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13140         the metadata, so we can flag error 133. 
13141
13142         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13143         pointer is being declared in an unsafe context.
13144
13145 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13146
13147         * modifiers.cs (Modifiers.Check): Require a Location argument.
13148         Report error 227 for Unsafe use.
13149
13150         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13151
13152         * statement.cs (For.Emit): If the test is null, then report that
13153         we do `return', as we wont reach anything afterwards.
13154
13155         (Switch.SwitchGoverningType): Track the expression that matched
13156         the conversion.
13157
13158         * driver.cs: Allow negative numbers as an error code to flag.
13159
13160         * cs-parser.jay: Handle 1551.
13161
13162         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13163
13164 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13165
13166         * cs-parser.jay: Report 1518 (type declaration can only contain
13167         class, struct, interface, enum or delegate)
13168
13169         (switch_label): Report 1523 (keywords `case' or `default' must
13170         preced code)
13171
13172         (opt_switch_sections): Report 1522 (empty switch)
13173
13174         * driver.cs: Report 1515 (response file specified multiple times)
13175         Report 1516 (Source file specified multiple times).
13176
13177         * expression.cs (Argument.Resolve): Signal 1510
13178
13179         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13180         access not allowed in static code)
13181
13182 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13183
13184         * typemanager.cs (IsPointerType): Utility method which we are going
13185         to need a lot.
13186
13187         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13188         the object type, so we take care of that.
13189
13190         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13191
13192         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13193         added to non-params parameters :-)
13194
13195         * typemanager.cs (CSharpName): Include 'void' type too. 
13196
13197         (void_ptr_type): Include in the set of core types.
13198
13199         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13200         duplicating code.
13201
13202         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13203         an unsafe context.
13204
13205         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13206         completely forgotten about it.
13207
13208 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13209
13210         * cs-parser.jay (pointer_type): Add. This begins our implementation
13211         of parsing rules for unsafe code.
13212
13213         (unsafe_statement): Implement.
13214
13215         (embedded_statement): Modify to include the above.
13216
13217         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13218
13219         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13220         if the current context is an unsafe one.
13221
13222         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13223         are handled differently, we need separate rules for them.
13224
13225         (local_variable_declaration): Update to use local_variable_pointer_type
13226         to allow variable declarations of unmanaged pointer types.
13227
13228         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13229         in unsafe contexts.
13230
13231         * ../errors/cs0214.cs : Add.
13232
13233 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13234
13235         * makefile: remove 'response' file when cleaning.
13236
13237 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13238
13239         * cs-parser.jay: Report 1524.
13240
13241 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13242
13243         * typemanager.cs (RegisterMethod): drop checking if we have
13244         registered this from here
13245
13246 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13247
13248         * class.cs (Method.EmitDestructor): Implement calling our base
13249         destructor. 
13250
13251         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13252         value of InFinally.
13253
13254         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13255         this routine and will wrap the call in a try/catch block.  Deal
13256         with the case.
13257
13258 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13259
13260         * ecore.cs (Expression.MemberLookup): instead of taking a
13261         parameter `same_type' that was used to tell whether we could
13262         access private members we compute our containing type from the
13263         EmitContext.
13264
13265         (FieldExpr): Added partial support for volatile fields.  This does
13266         not work for volatile fields exposed from assemblies, as I can not
13267         figure out how to extract the modreq from it.
13268
13269         Updated all the source files to use this.
13270
13271         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13272         because it is referenced by MemberLookup very often. 
13273
13274 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13275
13276         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13277         TypeBuilder.GetCustomAttributes to retrieve what we need.
13278
13279         Get rid of redundant default_member_attr_type as this is the same as
13280         default_member_type which already exists.
13281
13282         * interface.cs, attribute.cs : Update accordingly.
13283
13284 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13285
13286         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13287         work for TYpeBuilders though.  Ravi, can you please fix this?
13288
13289         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13290
13291         * expression.cs (Argument.Emit): Handle the case of ref objects
13292         being passed to ref functions;  
13293
13294         (ParameterReference.EmitLoad): Loads the content of the pointer
13295         without dereferencing.
13296
13297 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13298
13299         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13300
13301 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13302
13303         * class.cs (Indexer.DefineMethod): Incorporate the interface
13304         type in the name of the method if we are doing explicit interface
13305         implementation.
13306
13307         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13308
13309         (BetterConversion): Fix extremely trivial bug where we were referring to
13310         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13311         again !
13312
13313         * ../errors/bug16.cs : Add although we have fixed it.
13314
13315 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13316
13317         * expression.cs (BaseIndexer): Begin implementation.
13318
13319         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13320
13321         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13322         production directly to remove a shift/reduce, and implement
13323         explicit interface implementation.
13324
13325         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13326         after a floating point suffix.
13327
13328         * expression.cs (DoNumericPromotions): Improved the conversion for
13329         uint/uint.  If we have a constant, we avoid doing a typecast to a
13330         larger type.
13331
13332         * class.cs (Indexer): Implement explicit interface implementation
13333         for indexers.
13334
13335 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13336
13337         * class.cs: make the default instance constructor public and hidebysig.
13338
13339 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13340
13341         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13342         so we can call it from elsewhere.
13343
13344         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13345         we emit it internally if the class has a defined indexer; otherwise the user
13346         emits it by decorating the class definition with the DefaultMemberAttribute.
13347
13348         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13349         attribute is not used on a type which defines an indexer.
13350
13351         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13352         character when we skip whitespace.
13353
13354         * ../errors/cs0646.cs : Add.
13355
13356 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13357
13358         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13359         again. 
13360
13361         * makefile: Add practical target `mcs3.exe' which builds the third
13362         generation compiler. 
13363
13364         * expression.cs (New): Fix structures constructor calling.
13365
13366         * class.cs (Property, Method, Indexer): Emit Final flag on the
13367         method if we are an interface implementation and we are not
13368         abstract. 
13369
13370         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13371         whether this property is referencing a `base' method.
13372
13373         * expression.cs (Invocation.EmitCall): take an extra argument:
13374         is_base, this is used to determine whether the `call' or
13375         `callvirt' opcode should be used.
13376
13377
13378         * delegate.cs: update EmitCall.
13379
13380         * class.cs (Method.Define): Set NewSlot for the cases where we are
13381         not implementing an interface method.
13382
13383         (Property.Define): ditto.
13384
13385 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13386
13387         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13388         'r'.  Allows mcs to parse itself fully.
13389
13390 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13391
13392         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13393         of the number of initializers that require the InitializeArray method.
13394
13395         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13396         update the above field where necessary.
13397
13398         (MakeByteBlob): Update accordingly.
13399
13400         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13401         greater than 2.
13402
13403         (EmitDynamicInitializers): Update in accordance with the new optimization.
13404
13405         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13406         same OpCode applies.
13407
13408         * cs-parser.jay : Fix some glaring errors I introduced.
13409
13410 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13411
13412         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13413         so that we can check for name clashes there too.
13414
13415         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13416         for interface indexers.
13417
13418         * interfaces.cs (Define): Emit the default member attribute.
13419
13420         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13421         variable was being referred to while setting the value ;-)
13422
13423 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13424
13425         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13426         byte-by-byte information when we know the data is zero.
13427
13428         Make the block always a multiple of 4, because
13429         DefineInitializedData has a bug.
13430
13431         * assign.cs: Fix, we should assign from the temporary, not from
13432         the source. 
13433
13434         * expression.cs (MakeByteBlob): Fix my incorrect code.
13435
13436 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13437
13438         * typemanager.cs (EnumToUnderlying): This function is used to get
13439         the underlying type from an enumeration, because it does not
13440         always work. 
13441
13442         * constant.cs: Use the I4_S form for values between -128 and 127.
13443
13444         * statement.cs (Block.LookupLabel): Looks up a label.
13445         (Block): Drop support for labeled blocks.
13446
13447         (LabeledStatement): New kind of statement that represents a label
13448         only.
13449
13450         (Goto): Finally implement this bad boy.
13451
13452         * cs-parser.jay: Update to reflect new mechanism to implement
13453         labels.
13454
13455 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13456
13457         * codegen.cs (EmitContext.This): a codegen property that keeps the
13458         a single instance of this instead of creating many different this
13459         instances. 
13460
13461         * delegate.cs (Delegate.DoResolve): Update to use the property;
13462
13463         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13464
13465         * expression.cs (BaseAccess.DoResolve): Ditto.
13466
13467 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13468
13469         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13470         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13471
13472         (InitCoreTypes): Update accordingly.
13473
13474         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13475         so we can quickly store the state.
13476
13477         (ApplyAttributes): Set the correct implementation flags
13478         for InternalCall methods.
13479
13480 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13481
13482         * expression.cs (EmitCall): if a method is not virtual, then do
13483         not use callvirt on it.
13484
13485         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13486         user defined stuff) requires the use of stobj, which takes an
13487         address on the stack instead of an array and an index.  So emit
13488         the Ldelema operation for it.
13489
13490         (EmitStoreOpcode): Use stobj for valuetypes.
13491
13492         (UnaryMutator.EmitCode): Use the right 1 value depending on
13493         whether we are dealing with int64/uint64, float or doubles.
13494
13495         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13496         constructors that I implemented last night.
13497
13498         (Constructor.IsDefault): Fix to work properly for static
13499         constructors.
13500
13501         * cs-parser.jay (CheckDef): report method signature errors.
13502         Update error number 103 to be 132.
13503
13504         * decl.cs: New AdditionResult enumeration value: MethodExists.
13505         Although we do this check for methods later on in the semantic
13506         analysis, catching repeated default constructors is so easy that
13507         we catch these here. 
13508
13509         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13510         promotions code.
13511
13512         (ParameterReference.EmitAssign, Emit): handle
13513         bools as bytes.
13514
13515         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13516         (ArrayAccess.EmitStoreOpcode): ditto.
13517
13518         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13519
13520         * expression.cs (MakeByteBlob): Complete all the missing types
13521         (uint, short, ushort, byte, sbyte)
13522
13523         * class.cs: Only init instance field initializers on instance
13524         constructors. 
13525
13526         Rename `constructors' to instance_constructors. 
13527
13528         (TypeContainer.AddConstructor): Only add constructors to the list
13529         if it is not static.
13530
13531         Make sure that we handle default_static_constructor independently
13532         everywhere where we handle instance_constructors
13533
13534 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13535
13536         * class.cs: Do not lookup or create a base initializer for a
13537         static constructor.
13538
13539         (ConstructorInitializer.Resolve): use the proper type to lookup
13540         for constructors.
13541
13542         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13543
13544         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13545         in DeclSpace. 
13546
13547         * decl.cs: CloseType is now an virtual method, the default
13548         implementation just closes this type.
13549
13550 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13551
13552         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13553         to PreserveSig by default. Also emit HideBySig on such methods.
13554
13555         Basically, set the defaults to standard values.
13556
13557         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13558         argument, if candidate is better, it can't be worse than the best !
13559
13560         (Invocation): Re-write bits to differentiate between methods being
13561         applicable in their expanded form and their normal form - for params
13562         methods of course.
13563
13564         Get rid of use_standard everywhere as only standard conversions are allowed
13565         in overload resolution. 
13566
13567         More spec conformance.
13568
13569 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13570
13571         * driver.cs: Add --timestamp, to see where the compiler spends
13572         most of its time.
13573
13574         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13575         `this' in static code.
13576
13577         (SimpleName.DoResolve): Implement in terms of a helper function
13578         that allows static-references to be passed upstream to
13579         MemberAccess.
13580
13581         (Expression.ResolveWithSimpleName): Resolve specially simple
13582         names when called by MemberAccess to implement the special
13583         semantics. 
13584
13585         (Expression.ImplicitReferenceConversion): Handle conversions from
13586         Null to reference types before others, as Null's type is
13587         System.Object. 
13588
13589         * expression.cs (Invocation.EmitCall): Handle the special case of
13590         calling methods declared on a reference type from a ValueType
13591         (Base classes System.Object and System.Enum)
13592
13593         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13594         the left hand side is a TypeExpr, not on every enumeration. 
13595
13596         (Binary.Resolve): If types are reference types, then do a cast to
13597         object on operators != and == of both arguments.
13598
13599         * typemanager.cs (FindMembers): Extract instance and static
13600         members if requested.
13601
13602         * interface.cs (PopulateProperty): Use void_type instead of null
13603         as the return type for the setter method.
13604
13605         (PopulateIndexer): ditto.
13606
13607 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13608
13609         * support.cs (ReflectionParameters): Fix minor bug where we
13610         were examining the wrong parameter for the ParamArray attribute.
13611
13612         Cope with requests for the type of the parameter at position
13613         greater than the params parameter's. We now return the element
13614         type of the params array as that makes more sense.
13615
13616         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13617         accordingly as we no longer have to extract the element type
13618         ourselves.
13619
13620         (Invocation.OverloadResolve): Update.
13621
13622 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13623
13624         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13625         against IEnumerator, test whether the return value is a descendant
13626         of the IEnumerator interface.
13627
13628         * class.cs (Indexer.Define): Use an auxiliary method to implement
13629         the other bits of the method definition.  Begin support for
13630         explicit interface implementation.
13631
13632         (Property.DefineMethod): Use TypeManager.void_type instead of null
13633         for an empty return value.
13634
13635 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13636
13637         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13638         dealing with a FieldExpr which is composed of a FieldBuilder, in
13639         the code path we did extract the constant, but we should have
13640         obtained the underlying value to be able to cast it (otherwise we
13641         end up in an infinite loop, this is what Ravi was running into).
13642
13643         (ArrayCreation.UpdateIndices): Arrays might be empty.
13644
13645         (MemberAccess.ResolveMemberAccess): Add support for section
13646         14.5.4.1 that deals with the special case of E.I when E is a type
13647         and something else, that I can be a reference to a static member.
13648
13649         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13650         handle a particular array type to create byte blobs, it is just
13651         something we dont generate byteblobs for.
13652
13653         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13654         arguments. 
13655
13656         * location.cs (Push): remove the key from the hashtable that we
13657         are about to add.   This happens for empty files.
13658
13659         * driver.cs: Dispose files after we have parsed them.
13660
13661         (tokenize): new function that only runs the tokenizer on its
13662         input, for speed testing.
13663
13664 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13665
13666         * class.cs (Event.Define): Define the private field only if there
13667         are no accessors defined.
13668
13669         * expression.cs (ResolveMemberAccess): If there is no associated
13670         field with the event, that means we have an event defined with its
13671         own accessors and we should flag error cs0070 since transforming
13672         ourselves into a field is not valid in that case.
13673
13674         * ecore.cs (SimpleName.DoResolve): Same as above.
13675
13676         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13677         and charset to sane values.
13678
13679 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13680
13681         * assign.cs (DoResolve): Perform check on events only if they 
13682         are being accessed outside the declaring type.
13683
13684         * cs-parser.jay (event_declarations): Update rules to correctly
13685         set the type of the implicit parameter etc.
13686
13687         (add_accessor, remove_accessor): Set current local parameters.
13688
13689         * expression.cs (Binary): For delegate addition and subtraction,
13690         cast the return value from the method into the appropriate delegate
13691         type.
13692
13693 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13694
13695         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13696         of these as the workaround is unnecessary.
13697
13698         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13699         delegate data - none of that is needed at all.
13700
13701         Re-write bits to extract the instance expression and the delegate method
13702         correctly.
13703
13704         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13705         on delegates too.
13706
13707         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13708         of attaching attributes instead of duplicating code everywhere.
13709
13710         * everywhere : Update code to do attribute emission using the above method.
13711
13712 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13713
13714         * expression.cs (IsParamsMethodApplicable): if there are not
13715         parameters, return immediately.
13716
13717         * ecore.cs: The 0 literal can be implicity converted to an enum
13718         type. 
13719
13720         (SimpleName.DoResolve): First lookup the type, then lookup the
13721         members. 
13722
13723         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13724         want to get its address.  If the InstanceExpression is not
13725         addressable, store the result in a temporary variable, then get
13726         the address of it.
13727
13728         * codegen.cs: Only display 219 errors on warning level or above. 
13729
13730         * expression.cs (ArrayAccess): Make it implement the
13731         IMemoryLocation interface.
13732
13733         (Binary.DoResolve): handle the operator == (object a, object b)
13734         and operator != (object a, object b) without incurring into a
13735         BoxedCast (because 5 != o should never be performed).
13736
13737         Handle binary enumerator operators.
13738
13739         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13740         value type, otherwise use Ldelem_ref.
13741
13742         Use precomputed names;
13743
13744         (AddressOf): Implement address of
13745
13746         * cs-parser.jay (labeled_statement): Fix recursive block
13747         addition by reworking the production.
13748
13749         * expression.cs (New.DoEmit): New has a special case:
13750                 
13751                  If we are dealing with a ValueType, we have a few
13752                  situations to deal with:
13753                 
13754                     * The target of New is a ValueType variable, that is
13755                       easy, we just pass this as the variable reference
13756                 
13757                     * The target of New is being passed as an argument,
13758                       to a boxing operation or a function that takes a
13759                       ValueType.
13760                 
13761                       In this case, we need to create a temporary variable
13762                       that is the argument of New.
13763
13764
13765 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13766
13767         * rootcontext.cs (LookupType): Check that current_type is not null before
13768         going about looking at nested types.
13769
13770         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13771         not implement the IAssignMethod interface any more.
13772
13773         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13774         where we tranform them into FieldExprs if they are being resolved from within
13775         the declaring type.
13776
13777         * ecore.cs (SimpleName.DoResolve): Do the same here.
13778
13779         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13780
13781         * ../errors/bug10.cs : Add.
13782
13783         * ../errors/cs0070.cs : Add.
13784
13785         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13786
13787         * assign.cs : Get rid of EventIsLocal everywhere.
13788
13789 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13790
13791         * ecore.cs (ConvertIntLiteral): finished the implementation.
13792
13793         * statement.cs (SwitchLabel): Convert the value we are using as a
13794         key before looking up the table.
13795
13796 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13797
13798         * codegen.cs (EmitTopBlock): Require a Location argument now.
13799
13800         * cs-parser.jay (constructor_declarator): We need to setup
13801         current_local_parameters before we parse the
13802         opt_constructor_initializer, to allow the variables to be bound
13803         to the constructor arguments.
13804
13805         * rootcontext.cs (LookupType): First lookup nested classes in our
13806         class and our parents before we go looking outside our class.
13807
13808         * expression.cs (ConstantFold): Extract/debox the values at the
13809         beginnning. 
13810
13811         * rootcontext.cs (EmitCode): Resolve the constants first before we
13812         resolve the types.  This is not really needed, but it helps debugging.
13813
13814         * statement.cs: report location.
13815
13816         * cs-parser.jay: pass location to throw statement.
13817
13818         * driver.cs: Small bug fix.
13819
13820         * report.cs: Updated format to be 4-zero filled digits.
13821
13822 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13823
13824         * expression.cs (CheckIndices): Fix minor bug where the wrong
13825         variable was being referred to ;-)
13826
13827         (DoEmit): Do not call EmitStaticInitializers when the 
13828         underlying type is System.Object.
13829
13830 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13831
13832         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13833         and do the usual workaround for SRE.
13834
13835         * class.cs (MyEventBuilder.EventType): New member to get at the type
13836         of the event, quickly.
13837
13838         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13839
13840         * assign.cs (Assign.DoResolve): Handle the case when the target
13841         is an EventExpr and perform the necessary checks.
13842
13843         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13844         interface.
13845
13846         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13847
13848         (EventExpr): Set the type in the constructor itself since we 
13849         are meant to be born fully resolved.
13850
13851         (EventExpr.Define): Revert code I wrote earlier.
13852                 
13853         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13854         instance expression is null. The instance expression is a This in that case
13855         or a null, depending on whether it is a static method or not.
13856
13857         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13858         refers to more than one method.
13859
13860         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13861         and accordingly flag errors.
13862
13863 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13864
13865         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13866
13867 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13868
13869         * location.cs (ToString): Provide useful rutine.
13870
13871 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13872
13873         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13874         objects, return the actual integral boxed.
13875
13876         * statement.cs (SwitchLabel): define an ILLabel for each
13877         SwitchLabel. 
13878
13879         (Switch.CheckSwitch): If the value is a Literal, extract
13880         the underlying literal.
13881
13882         Also in the unused hashtable we had, add the SwitchLabel so we can
13883         quickly look this value up.
13884
13885         * constant.cs: Implement a bunch of new constants.  Rewrite
13886         Literal based on this.  Made changes everywhere to adapt to this.
13887
13888         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13889         dereferencing array only once, and also copes with enumrations.
13890
13891         bytes are two bytes wide, not one.
13892
13893         (Cast): Perform constant conversions.
13894
13895         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13896         wrappers to the literals here.
13897
13898         * expression.cs (DoNumericPromotions): long literals can converted
13899         to ulong implicity (this is taken care of elsewhere, but I was
13900         missing this spot).
13901
13902         * ecore.cs (Expression.Literalize): Make the return type Literal,
13903         to improve type checking.
13904
13905         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13906
13907 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13908
13909         * literal.cs: Revert code from ravi that checked the bounds.  The
13910         bounds are sane by the definition of the type itself. 
13911
13912         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13913         need to actually look up in our parent hierarchy for interfaces
13914         implemented. 
13915
13916         * const.cs: Use the underlying type for enumerations
13917
13918         * delegate.cs: Compute the basename for the delegate creation,
13919         that should fix the delegate test case, and restore the correct
13920         Type Lookup semantics in rootcontext
13921
13922         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13923         referencing a nested type with the Reflection API is using the "+"
13924         sign. 
13925
13926         * cs-parser.jay: Do not require EOF token at the end.
13927
13928 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13929
13930         * rootcontext.cs (LookupType): Concatenate type names with
13931         a '.' instead of a '+' The test suite passes again.
13932
13933         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13934         field of the enumeration.
13935
13936         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13937         the case when the member is an EventExpr.
13938
13939         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13940         static has an associated instance expression.
13941
13942         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13943
13944         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13945
13946         * class.cs (Event.Define): Register event and perform appropriate checks
13947         for error #111.
13948
13949         We define the Add and Remove methods even if the use provides none because
13950         in that case, we provide default implementations ourselves.
13951
13952         Define a private field of the type of the event. This is done by the CSC compiler
13953         and we should be doing it too ;-)
13954
13955         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13956         More methods we use in code we generate.
13957
13958         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13959         is important.
13960
13961         (InitCoreTypes): Update accordingly for the above.
13962
13963         * class.cs (Event.Emit): Generate code for default accessors that we provide
13964
13965         (EmitDefaultMethod): Do the job in the above.
13966
13967         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13968         appropriate place.
13969
13970 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13971
13972         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13973         builders even if we were missing one.
13974
13975         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13976         pass the Basename as our class name instead of the Name.  The
13977         basename will be correctly composed for us.
13978
13979         * parameter.cs (Paramters): Now takes a Location argument.
13980
13981         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13982         make all the code call directly LookupType in RootContext and take
13983         this chance to pass the Location information everywhere.
13984
13985         * Everywhere: pass Location information.
13986
13987 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13988
13989         * class.cs (Constructor.Define): Updated way of detecting the
13990         length of the parameters.
13991
13992         (TypeContainer.DefineType): Use basename as the type name for
13993         nested types.
13994
13995         (TypeContainer.Define): Do not recursively define types here, as
13996         definition is taken care in order by the RootContext.
13997
13998         * tree.cs: Keep track of namespaces in a per-file basis.
13999
14000         * parameter.cs (Parameter.ComputeSignature): Update to use
14001         DeclSpace. 
14002
14003         (Parameters.GetSignature): ditto.
14004
14005         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14006         instead of a TypeContainer.
14007
14008         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14009         resolve names.  Because we need to be resolve in our context, not
14010         our parents.
14011
14012         * driver.cs: Implement response files.
14013
14014         * class.cs (TypeContainer.DefineType): If we are defined, do not
14015         redefine ourselves.
14016
14017         (Event.Emit): Emit the code for add/remove handlers.
14018         (Event.Define): Save the MethodBuilders for add/remove.
14019
14020         * typemanager.cs: Use pair here too.
14021
14022         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14023         DictionaryEntry requires the first argument to be non-null.  
14024
14025         (enum_declaration): Compute full name for registering the
14026         enumeration.
14027
14028         (delegate_declaration): Instead of using
14029         formal_parameter_list, use opt_formal_parameter_list as the list
14030         can be empty.
14031
14032         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14033         (EventParsing): New property that controls whether `add' and
14034         `remove' are returned as tokens or identifiers (for events);
14035
14036 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14037
14038         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14039         use MyEventBuilder only and let it wrap the real builder for us.
14040
14041         (MyEventBuilder): Revamp constructor etc.
14042
14043         Implement all operations that we perform on EventBuilder in precisely the same
14044         way here too.
14045
14046         (FindMembers): Update to use the EventBuilder member.
14047
14048         (Event.Emit): Update accordingly.
14049
14050 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14051
14052         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14053         by calling the appropriate methods.
14054
14055         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14056         useful.
14057
14058         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14059
14060 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14061
14062         * delegate.cs (Delegate.Populate): Check that the return type
14063         and various parameters types are indeed accessible.
14064
14065         * class.cs (Constructor.Define): Same here.
14066
14067         (Field.Define): Ditto.
14068
14069         (Event.Define): Ditto.
14070
14071         (Operator.Define): Check that the underlying Method defined itself
14072         correctly - so it's MethodBuilder should not be null.
14073
14074         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14075         expression happens to be null.
14076
14077         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14078         members but as of now we don't seem to be able to do anything really useful with it.
14079
14080         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14081         not the EventBuilder.
14082
14083 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14084
14085         * cs-tokenizer.cs: Add support for defines.
14086         Add support for #if, #elif, #else, #endif
14087
14088         (eval_var): evaluates a variable.
14089         (eval): stubbed for evaluating functions.
14090
14091         * cs-parser.jay: Pass the defines information
14092
14093         * driver.cs: Add --define command line option.
14094
14095         * decl.cs: Move MemberCore here.
14096
14097         Make it the base class for DeclSpace.  This allows us to catch and
14098         report 108 and 109 for everything now.
14099
14100         * class.cs (TypeContainer.Define): Extract all the members
14101         before populating and emit the warning 108 (new keyword required
14102         to override) instead of having each member implement this.
14103
14104         (MemberCore.Define): New abstract method, we will be using this in
14105         the warning reporting engine in Populate.
14106
14107         (Operator.Define): Adjust to new MemberCore protocol. 
14108
14109         * const.cs (Const): This does not derive from Expression, it is a
14110         temporary object we use to create fields, it is a MemberCore. 
14111
14112         * class.cs (Method.Define): Allow the entry point to be in a
14113         specific class.
14114
14115         * driver.cs: Rewrite the argument handler to clean it up a bit.
14116
14117         * rootcontext.cs: Made it just an auxiliary namespace feature by
14118         making everything static.
14119
14120         * driver.cs: Adapt code to use RootContext type name instead of
14121         instance variable.
14122
14123         * delegate.cs: Remove RootContext argument.
14124
14125         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14126         argument. 
14127
14128         * class.cs (Event.Define): The lookup can fail.
14129
14130         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14131
14132         * expression.cs: Resolve the this instance before invoking the code.
14133
14134 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14135
14136         * cs-parser.jay: Add a production in element_access that allows
14137         the thing to become a "type" reference.  This way we can parse
14138         things like "(string [])" as a type.
14139
14140         Note that this still does not handle the more complex rules of
14141         casts. 
14142
14143
14144         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14145
14146         * ecore.cs: (CopyNewMethods): new utility function used to
14147         assemble the list of methods from running FindMembers.
14148
14149         (MemberLookup): Rework FindMembers so that 
14150
14151 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14152
14153         * class.cs (TypeContainer): Remove Delegates who fail to be
14154         defined.
14155
14156         * delegate.cs (Populate): Verify that we dont get null return
14157         values.   TODO: Check for AsAccessible.
14158
14159         * cs-parser.jay: Use basename to emit error 574 (destructor should
14160         have the same name as container class), not the full name.
14161
14162         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14163         possible representation.  
14164
14165         Also implements integer type suffixes U and L.
14166
14167 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14168
14169         * expression.cs (ArrayCreation.DoResolve): We need to do the
14170         argument resolution *always*.
14171
14172         * decl.cs: Make this hold the namespace.  Hold the root context as
14173         well.
14174         (LookupType): Move here.
14175
14176         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14177
14178         * location.cs (Row, Name): Fixed the code, it was always returning
14179         references to the first file.
14180
14181         * interface.cs: Register properties defined through interfaces.
14182
14183         * driver.cs: Add support for globbing on the command line
14184
14185         * class.cs (Field): Make it derive from MemberCore as well.
14186         (Event): ditto.
14187
14188 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14189
14190         * class.cs (Event::Define): Check that the type of the event is a delegate
14191         type else flag error #66.
14192
14193         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14194         same.
14195
14196         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14197         values of EntryPoint, CharSet etc etc.
14198
14199         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14200
14201         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14202         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14203         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14204         which needs this to do its work.
14205
14206         * ../errors/cs0066.cs : Add.
14207
14208 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14209
14210         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14211         helper functions.
14212
14213         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14214         clears out the parameters field.
14215         (MemberSignatureCompare): Cleanup
14216
14217         (MemberCore): New base class used to share code between MethodCore
14218         and Property.
14219
14220         (RegisterRequiredImplementations) BindingFlags.Public requires
14221         either BindingFlags.Instace or Static.  Use instance here.
14222
14223         (Property): Refactored code to cope better with the full spec.
14224
14225         * parameter.cs (GetParameterInfo): Return an empty array instead
14226         of null on error.
14227
14228         * class.cs (Property): Abstract or extern properties have no bodies.
14229
14230         * parameter.cs (GetParameterInfo): return a zero-sized array.
14231
14232         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14233         method modifier validation to the typecontainer so we can reuse
14234         this on properties.
14235
14236         (MethodCore.ParameterTypes): return an empty sized array of types.
14237
14238         (Property.Define): Test property modifier validity.
14239
14240         Add tests for sealed/override too.
14241
14242         (Method.Emit): abstract or extern methods have no bodies.
14243
14244 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14245
14246         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14247         thing.
14248
14249         (Method::Define, ::Emit): Modify accordingly.
14250
14251         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14252
14253         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14254
14255         * makefile: Pass in /unsafe.
14256
14257 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14258
14259         * class.cs (MakeKey): Kill routine.
14260
14261         * class.cs (TypeContainer.Define): Correctly define explicit
14262         method implementations (they require the full interface name plus
14263         the method name).
14264
14265         * typemanager.cs: Deply the PtrHashtable here and stop using the
14266         lame keys.  Things work so much better.
14267
14268         This of course broke everyone who depended on `RegisterMethod' to
14269         do the `test for existance' test.  This has to be done elsewhere.
14270
14271         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14272         the object stupid Equals method (because, that like fails all over
14273         the place).  We still do not use it.
14274
14275         * class.cs (TypeContainer.SetRequiredInterface,
14276         TypeContainer.RequireMethods): Killed these two routines and moved
14277         all the functionality to RegisterRequiredImplementations.
14278
14279         (TypeContainer.RegisterRequiredImplementations): This routine now
14280         registers all the implementations required in an array for the
14281         interfaces and abstract methods.  We use an array of structures
14282         which can be computed ahead of time to reduce memory usage and we
14283         also assume that lookups are cheap as most classes will not
14284         implement too many interfaces.
14285
14286         We also avoid creating too many MethodSignatures.
14287
14288         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14289         clear the "pending" bit if we find that there are problems with
14290         the declaration.
14291
14292         (TypeContainer.VerifyPendingMethods): Update to report errors of
14293         methods that look like implementations but are not.
14294
14295         (TypeContainer.Define): Add support for explicit interface method
14296         implementation. 
14297
14298 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14299
14300         * typemanager.cs: Keep track of the parameters here instead of
14301         being a feature of the TypeContainer.
14302
14303         * class.cs: Drop the registration of parameters here, as
14304         InterfaceMethods are also interface declarations.
14305
14306         * delegate.cs: Register methods with the TypeManager not only with
14307         the TypeContainer.  This code was buggy.
14308
14309         * interface.cs: Full registation here.
14310
14311 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14312
14313         * expression.cs: Remove reducer for binary expressions, it can not
14314         be done this way.
14315
14316         * const.cs: Put here the code that used to go into constant.cs
14317
14318         * constant.cs: Put here the code for constants, this is a new base
14319         class for Literals.
14320
14321         * literal.cs: Make Literal derive from Constant.
14322
14323 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14324
14325         * statement.cs (Return.Emit): Report error 157 if the user
14326         attempts to return from a finally block.
14327
14328         (Return.Emit): Instead of emitting a return, jump to the end of
14329         the function.
14330
14331         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14332         LocalBuilder to store the result of the function.  ReturnLabel is
14333         the target where we jump.
14334
14335
14336 2001-12-09  Radek Doulik  <rodo@ximian.com>
14337
14338         * cs-parser.jay: remember alias in current namespace
14339
14340         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14341         namespaces
14342
14343         * class.cs (LookupAlias): lookup alias in my_namespace
14344
14345         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14346         aliases hashtable
14347         (LookupAlias): lookup alias in this and if needed in parent
14348         namespaces
14349
14350 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14351
14352         * support.cs: 
14353
14354         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14355         making things static.  I need this to avoid passing the
14356         TypeContainer when calling ParameterType.
14357
14358         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14359         that did string manipulation to compute the type and then call
14360         GetType.  Use Parameter.ParameterType instead.
14361
14362         * cs-tokenizer.cs: Consume the suffix for floating values.
14363
14364         * expression.cs (ParameterReference): figure out whether this is a
14365         reference parameter or not.  Kill an extra variable by computing
14366         the arg_idx during emission.
14367
14368         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14369         function that returns whether a parameter is an out/ref value or not.
14370
14371         (Parameter.ParameterType): The type of the parameter (base,
14372         without ref/out applied).
14373
14374         (Parameter.Resolve): Perform resolution here.
14375         (Parameter.ExternalType): The full type (with ref/out applied).
14376
14377         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14378         support for expressions on the using statement.
14379
14380 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14381
14382         * statement.cs (Using.EmitLocalVariableDecls): Split the
14383         localvariable handling of the using statement.
14384
14385         (Block.EmitMeta): Keep track of variable count across blocks.  We
14386         were reusing slots on separate branches of blocks.
14387
14388         (Try.Emit): Emit the general code block, we were not emitting it. 
14389
14390         Check the type of the declaration to be an IDisposable or
14391         something that can be implicity converted to it. 
14392
14393         Emit conversions if required.
14394
14395         * ecore.cs (EmptyExpression): New utility class.
14396         (Expression.ImplicitConversionExists): New utility function.
14397
14398 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14399
14400         * statement.cs (Using): Implement.
14401
14402         * expression.cs (LocalVariableReference): Support read only variables.
14403
14404         * statement.cs: Remove the explicit emit for the Leave opcode.
14405         (VariableInfo): Add a readonly field.
14406
14407 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14408
14409         * ecore.cs (ConvCast): new class used to encapsulate the various
14410         explicit integer conversions that works in both checked and
14411         unchecked contexts.
14412
14413         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14414         properly generate the overflow opcodes.
14415
14416 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14417
14418         * statement.cs: The correct type for the EmptyExpression is the
14419         element_type, not the variable type.  Ravi pointed this out.
14420
14421 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14422
14423         * class.cs (Method::Define): Handle PInvoke methods specially
14424         by using DefinePInvokeMethod instead of the usual one.
14425
14426         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14427         above to do the task of extracting information and defining the method.
14428
14429 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14430
14431         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14432         of the condition for string type.
14433
14434         (Emit): Move that here. 
14435
14436         (ArrayCreation::CheckIndices): Keep string literals in their expression
14437         form.
14438
14439         (EmitDynamicInitializers): Handle strings appropriately.
14440
14441 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14442
14443         * codegen.cs (EmitContext): Replace multiple variables with a
14444         single pointer to the current Switch statement.
14445
14446         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14447         EmitContext.
14448
14449 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14450
14451         * statement.cs 
14452
14453         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14454         default'.
14455
14456         (Foreach.Emit): Foreach on arrays was not setting
14457         up the loop variables (for break/continue).
14458
14459         (GotoCase): Semi-implented.
14460
14461 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14462
14463         * attribute.cs (CheckAttribute): Handle system attributes by using
14464         Attribute.GetAttributes to examine information we need.
14465
14466         (GetValidPlaces): Same here.
14467
14468         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14469
14470         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14471
14472         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14473
14474         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14475
14476         (Method::Emit): Handle the case when we are a PInvoke method.
14477
14478 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14479
14480         * expression.cs: Use ResolveWithSimpleName on compound names.
14481
14482 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14483
14484         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14485         before trying to reduce it.
14486
14487         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14488
14489         * constant.cs (LookupConstantValue): Implement.
14490
14491         (EmitConstant): Use the above in emitting the constant.
14492
14493         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14494         that are user-defined by doing a LookupConstantValue on them.
14495
14496         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14497         too, like above.
14498
14499 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14500
14501         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14502
14503         (BaseAccess.DoResolve): Implement.
14504
14505         (MemberAccess.DoResolve): Split this routine into a
14506         ResolveMemberAccess routine that can be used independently
14507
14508 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14509
14510         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14511         As that share bits of the implementation.  Is returns a boolean,
14512         while As returns the Type that is being probed.
14513
14514 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14515
14516         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14517         instead of a Literal - much easier.
14518
14519         (EnumInTransit): Remove - utterly useless :-)
14520
14521         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14522
14523         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14524
14525         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14526         chain when we have no associated expression.
14527
14528 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14529
14530         * constant.cs (Define): Use Location while reporting the errror.
14531
14532         Also emit a warning when 'new' is used and there is no inherited
14533         member to hide.
14534
14535         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14536         populated.
14537
14538         (LookupEnumValue): Implement to lookup an enum member's value and define it
14539         if necessary.
14540
14541         (Populate): Re-write accordingly to use the above routine.
14542
14543 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14544
14545         * expression.cs (This): Fix prototype for DoResolveLValue to
14546         override the base class DoResolveLValue.
14547
14548         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14549         declarations) 
14550
14551         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14552         (we need to load the address of the field here).  This fixes
14553         test-22. 
14554
14555         (FieldExpr.DoResolveLValue): Call the DoResolve
14556         function to initialize the Instance expression.
14557
14558         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14559         correctly the GetEnumerator operation on a value type.
14560
14561         * cs-parser.jay: Add more simple parsing error catches.
14562
14563         * statement.cs (Switch): Add support for string switches.
14564         Handle null specially.
14565
14566         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14567
14568 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14569
14570         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14571
14572         (declare_local_constant): New helper function.
14573
14574         * statement.cs (AddConstant): Keep a separate record of constants
14575
14576         (IsConstant): Implement to determine if a variable is a constant.
14577
14578         (GetConstantExpression): Implement.
14579
14580         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14581
14582         * statement.cs (IsVariableDefined): Re-write.
14583
14584 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14585
14586         * class.cs (TypeContainer::FindMembers): Look for constants
14587         in the case when we are looking for MemberTypes.Field
14588
14589         * expression.cs (MemberAccess::DoResolve): Check that in the
14590         case we are a FieldExpr and a Literal, we are not being accessed
14591         by an instance reference.
14592
14593         * cs-parser.jay (local_constant_declaration): Implement.
14594
14595         (declaration_statement): Implement for constant declarations.
14596
14597 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14598
14599         * statement.cs (Switch): Catch double defaults.
14600
14601         (Switch): More work on the switch() statement
14602         implementation.  It works for integral values now, need to finish
14603         string support.
14604
14605
14606 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14607
14608         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14609         integer literals into other integer literals.  To be used by
14610         switch. 
14611
14612 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14613
14614         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14615         some memory.
14616
14617         (EmitDynamicInitializers): Cope with the above since we extract data
14618         directly from ArrayData now.
14619
14620         (ExpectInitializers): Keep track of whether initializers are mandatory
14621         or not.
14622
14623         (Bounds): Make it a hashtable to prevent the same dimension being 
14624         recorded for every element in that dimension.
14625
14626         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14627         from being found.
14628
14629         Also fix bug which was causing the indices to be emitted in the reverse
14630         order.
14631
14632 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14633
14634         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14635         unfinished.  They do not work, because the underlying code is
14636         sloppy.
14637
14638 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14639
14640         * cs-parser.jay: Remove bogus fixme.
14641
14642         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14643         on Switch statement.
14644
14645 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14646
14647         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14648         the same. 
14649
14650         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14651         parameter. Apparently, any expression is allowed. 
14652
14653         (ValidateInitializers): Update accordingly.
14654
14655         (CheckIndices): Fix some tricky bugs thanks to recursion.
14656
14657         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14658         I was being completely brain-dead.
14659
14660         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14661         and re-write acordingly.
14662
14663         (DelegateInvocation): Re-write accordingly.
14664
14665         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14666
14667         (MakeByteBlob): Handle types more correctly.
14668
14669         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14670         initialization from expressions but it is incomplete because I am a complete
14671         Dodo :-|
14672
14673 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14674
14675         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14676         on If.  Basically, we have to return `true' (ie, we do return to
14677         our caller) only if both branches of the if return.
14678
14679         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14680         short-circuit operators, handle them as short circuit operators. 
14681
14682         (Cast.DoResolve): Resolve type.
14683         (Cast.Cast): Take an expression as the target type.
14684
14685         * cs-parser.jay (cast_expression): Remove old hack that only
14686         allowed a limited set of types to be handled.  Now we take a
14687         unary_expression and we resolve to a type during semantic
14688         analysis.
14689
14690         Use the grammar productions from Rhys to handle casts (this is
14691         not complete like Rhys syntax yet, we fail to handle that corner
14692         case that C# has regarding (-x), but we will get there.
14693
14694 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14695
14696         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14697         field which is an array type.
14698
14699         * cs-parser.jay (declare_local_variables): Support array initialization too.
14700
14701         * typemanager.cs (MakeKey): Implement.
14702
14703         (everywhere): Use the above appropriately.
14704
14705         * cs-parser.jay (for_statement): Update for array initialization while
14706         declaring variables.
14707
14708         * ecore.cs : The error message was correct, it's the variable's names that
14709         were misleading ;-) Make the code more readable.
14710
14711         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14712         the correct type etc.
14713
14714         (ConvertExplicit): Handle Enum types by examining the underlying type.
14715
14716 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14717
14718         * parameter.cs (GetCallingConvention): Always return
14719         CallingConventions.Standard for now.
14720
14721 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14722
14723         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14724         and `r' after calling DoNumericPromotions.
14725
14726         * ecore.cs: Fix error message (the types were in the wrong order).
14727
14728         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14729         BindingFlags.Instance as well 
14730
14731         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14732         implicit int literal conversion in an empty cast so that we
14733         propagate the right type upstream.
14734
14735         (UnboxCast): new class used to unbox value types.
14736         (Expression.ConvertExplicit): Add explicit type conversions done
14737         by unboxing.
14738
14739         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14740         the target type before applying the implicit LongLiterals to ULong
14741         literal cast.
14742
14743 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14744
14745         * cs-parser.jay (for_statement): Reworked the way For works: now
14746         we declare manually any variables that are introduced in
14747         for_initializer to solve the problem of having out-of-band code
14748         emition (that is what got for broken).
14749
14750         (declaration_statement): Perform the actual variable declaration
14751         that used to be done in local_variable_declaration here.
14752
14753         (local_variable_declaration): Do not declare anything, just pass
14754         the information on a DictionaryEntry
14755
14756 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14757
14758         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14759         re-write of the logic to now make it recursive.
14760
14761         (UpdateIndices): Re-write accordingly.
14762
14763         Store element data in a separate ArrayData list in the above methods.
14764
14765         (MakeByteBlob): Implement to dump the array data into a byte array.
14766
14767 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14768
14769         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14770         into CheckIndices.
14771
14772         * constant.cs (Define): Implement.
14773
14774         (EmitConstant): Re-write fully.
14775
14776         Pass in location info.
14777
14778         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14779         respectively.
14780
14781         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14782         DictionaryEntry since we need location info too.
14783
14784         (constant_declaration): Update accordingly.
14785
14786         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14787         code into another method : UpdateIndices.
14788
14789 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14790
14791         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14792         some type checking etc.
14793
14794 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14795
14796         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14797         bits to provide dimension info if the user skips doing that.
14798
14799         Update second constructor to store the rank correctly.
14800
14801 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14802
14803         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14804         and try to implement.
14805
14806         * ../errors/cs0150.cs : Add.
14807
14808         * ../errors/cs0178.cs : Add.
14809
14810 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14811
14812         * statement.cs: Implement foreach on multi-dimensional arrays. 
14813
14814         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14815         name of the params argument.
14816
14817         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14818         initializing the array.
14819
14820         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14821         we can use this elsewhere.
14822
14823         * statement.cs: Finish implementation of foreach for single
14824         dimension arrays.
14825
14826         * cs-parser.jay: Use an out-of-band stack to pass information
14827         around, I wonder why I need this.
14828
14829         foreach_block: Make the new foreach_block the current_block.
14830
14831         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14832         function used to return a static Parameters structure.  Used for
14833         empty parameters, as those are created very frequently.
14834
14835         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14836
14837 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14838
14839         * interface.cs : Default modifier is private, not public. The
14840         make verify test passes again.
14841
14842 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14843
14844         * support.cs (ReflectionParameters): Fix logic to determine
14845         whether the last parameter is a params one. Test 9 passes again.
14846
14847         * delegate.cs (Populate): Register the builders we define with
14848         RegisterParameterForBuilder. Test 19 passes again.
14849
14850         * cs-parser.jay (property_declaration): Reference $6 instead
14851         of $$ to get at the location.
14852
14853         (indexer_declaration): Similar stuff.
14854
14855         (attribute): Ditto.
14856
14857         * class.cs (Property): Register parameters for the Get and Set methods
14858         if they exist. Test 23 passes again.
14859
14860         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14861         call to EmitArguments as we are sure there aren't any params arguments. 
14862         Test 32 passes again.
14863
14864         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14865         IndexOutOfRangeException. 
14866
14867         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14868         Test 33 now passes again.
14869
14870 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14871
14872         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14873         broke a bunch of things.  Will have to come up with a better way
14874         of tracking locations.
14875
14876         * statement.cs: Implemented foreach for single dimension arrays.
14877
14878 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14879
14880         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14881         an error.  This removes the lookup from the critical path.
14882
14883         * cs-parser.jay: Removed use of temporary_loc, which is completely
14884         broken. 
14885
14886 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14887
14888         * support.cs (ReflectionParameters.ParameterModifier): Report
14889         whether the argument is a PARAMS argument or not.
14890
14891         * class.cs: Set the attribute `ParamArrayAttribute' on the
14892         parameter argument.
14893
14894         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14895         and cons_param_array_attribute (ConstructorInfo for
14896         ParamArrayAttribute)., 
14897
14898         * codegen.cs: Emit the return using the `Return' statement, that
14899         way we can report the error correctly for missing return values. 
14900
14901         * class.cs (Method.Emit): Clean up.
14902
14903         * expression.cs (Argument.Resolve): Take another argument: the
14904         location where this argument is used.  Notice that this is not
14905         part of the "Argument" class as to reduce the size of the
14906         structure (we know the approximate location anyways).
14907
14908         Test if the argument is a variable-reference, if not, then
14909         complain with a 206.
14910
14911         (Argument.Emit): Emit addresses of variables.
14912
14913         (Argument.FullDesc): Simplify.
14914
14915         (Invocation.DoResolve): Update for Argument.Resolve.
14916
14917         (ElementAccess.DoResolve): ditto.
14918
14919         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14920         method should be virtual, as this method is always virtual.
14921
14922         (NewDelegate.DoResolve): Update for Argument.Resolve.
14923
14924         * class.cs (ConstructorInitializer.DoResolve): ditto.
14925
14926         * attribute.cs (Attribute.Resolve): ditto.
14927
14928 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14929
14930         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14931
14932         * expression.cs (ParameterReference): Drop IStackStorage and implement
14933         IAssignMethod instead. 
14934
14935         (LocalVariableReference): ditto.
14936
14937         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14938         IAssignMethod instead. 
14939
14940 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14941
14942         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14943         enumerations that are used in heavily used structures derive from
14944         byte in a laughable and pathetic attempt to reduce memory usage.
14945         This is the kind of pre-optimzations that you should not do at
14946         home without adult supervision.
14947
14948         * expression.cs (UnaryMutator): New class, used to handle ++ and
14949         -- separatedly from the other unary operators.  Cleans up the
14950         code, and kills the ExpressionStatement dependency in Unary.
14951
14952         (Unary): Removed `method' and `Arguments' from this class, making
14953         it smaller, and moving it all to SimpleCall, so I can reuse this
14954         code in other locations and avoid creating a lot of transient data
14955         strucutres when not required.
14956
14957         * cs-parser.jay: Adjust for new changes.
14958
14959 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14960
14961         * enum.cs (Enum.Populate): If there is a failure during
14962         definition, return
14963
14964         * cs-parser.jay (opt_enum_base): we used to catch type errors
14965         here, but this is really incorrect.  The type error should be
14966         catched during semantic analysis.
14967
14968 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14969
14970         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14971         current_local_parameters as expected since I, in my stupidity, had forgotten
14972         to do this :-)
14973
14974         * attribute.cs (GetValidPlaces): Fix stupid bug.
14975
14976         * class.cs (Method::Emit): Perform check on applicability of attributes.
14977
14978         (Constructor::Emit): Ditto.
14979
14980         (Field::Emit): Ditto.
14981
14982         (Field.Location): Store location information.
14983
14984         (Property, Event, Indexer, Operator): Ditto.
14985
14986         * cs-parser.jay (field_declaration): Pass in location for each field.
14987
14988         * ../errors/cs0592.cs : Add.
14989
14990 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14991
14992         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14993
14994         (InitCoreTypes): Update accordingly.
14995
14996         (RegisterAttrType, LookupAttr): Implement.
14997
14998         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14999         info about the same.
15000
15001         (Resolve): Update to populate the above as necessary.
15002
15003         (Error592): Helper.
15004
15005         (GetValidPlaces): Helper to the above.
15006
15007         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15008
15009         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15010
15011 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15012
15013         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15014
15015         * ../errors/cs0617.cs : Add.
15016
15017 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15018
15019         * enum.cs (Emit): Rename to Populate to be more consistent with what
15020         we expect it to do and when exactly it is called.
15021
15022         * class.cs, rootcontext.cs : Update accordingly.
15023
15024         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15025         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15026
15027         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15028
15029         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15030         of a fieldinfo using the above, when dealing with a FieldBuilder.
15031
15032 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15033
15034         * ../errors/cs0031.cs : Add.
15035
15036         * ../errors/cs1008.cs : Add.
15037
15038         * ../errrors/cs0543.cs : Add.
15039
15040         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15041         enum type.
15042
15043         (FindMembers): Implement.
15044
15045         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15046         enums and delegates too.
15047
15048         (enum_types): Rename to builder_to_enum.
15049
15050         (delegate_types): Rename to builder_to_delegate.
15051
15052         * delegate.cs (FindMembers): Implement.
15053
15054 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15055
15056         * typemanager.cs (IsEnumType): Implement.
15057
15058         * enum.cs (Emit): Re-write parts to account for the underlying type
15059         better and perform checking etc.
15060
15061         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15062         of the underlying type.
15063
15064         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15065         value
15066
15067         * enum.cs (error31): Helper to report error #31.
15068
15069         * cs-parser.jay (enum_declaration): Store location of each member too.
15070
15071         * enum.cs (member_to_location): New hashtable. 
15072
15073         (AddEnumMember): Update location hashtable.
15074
15075         (Emit): Use the location of each member while reporting errors.
15076
15077 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15078
15079         * cs-parser.jay: A for_initializer if is a
15080         local_variable_declaration really ammount to have an implicit
15081         block with the variable declaration and no initializer for for.
15082
15083         * statement.cs (For.Emit): Cope with null initializers.
15084
15085         This fixes the infinite loop on for initializers.
15086
15087 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15088
15089         * enum.cs: More cleanup.
15090
15091         * ecore.cs: Remove dead code.
15092
15093         * class.cs (Property.Emit): More simplification.
15094         (Event.Emit): ditto.
15095
15096         Reworked to have less levels of indentation.
15097
15098 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15099
15100         * class.cs (Property): Emit attributes.
15101
15102         (Field): Ditto.
15103
15104         (Event): Ditto.
15105
15106         (Indexer): Ditto.
15107
15108         (Operator): Ditto.
15109
15110         * enum.cs (Emit): Ditto.
15111
15112         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15113         Enums too.
15114
15115         * class.cs (Field, Event, etc.): Move attribute generation into the
15116         Emit method everywhere.
15117
15118         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15119         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15120         as we had no way of defining nested enums !
15121
15122         * rootcontext.cs : Adjust code accordingly.
15123
15124         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15125
15126 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15127
15128         * expression.cs (EvalConstantExpression): Move into ecore.cs
15129
15130         * enum.cs (Enum): Rename some members and make them public and readonly
15131         according to our convention.
15132
15133         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15134         nothing else.
15135
15136         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15137
15138         (Enum::Emit): Write a simple version for now which doesn't try to compute
15139         expressions. I shall modify this to be more robust in just a while.
15140
15141         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15142
15143         (TypeContainer::CloseType): Create the Enum types too.
15144
15145         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15146
15147         * expression.cs (EvalConstantExpression): Get rid of completely.
15148
15149         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15150         user-defined values and other cases.
15151
15152         (IsValidEnumLiteral): Helper function.
15153
15154         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15155         out there in the case we had a literal FieldExpr.
15156
15157         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15158
15159         (Literalize): Revamp a bit to take two arguments.
15160
15161         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15162
15163 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15164
15165         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15166
15167         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15168
15169         (Resolve): Use the above to ensure we have proper initializers.
15170
15171 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15172
15173         * expression.cs (Expression::EvalConstantExpression): New method to 
15174         evaluate constant expressions.
15175
15176         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15177
15178 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15179
15180         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15181         in an array.
15182
15183         (Binary.ResolveOperator): Handle operator != (object a, object b)
15184         and operator == (object a, object b);
15185
15186         (Binary.DoNumericPromotions): Indicate whether the numeric
15187         promotion was possible.
15188
15189         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15190         Implement.  
15191
15192         Made the ArrayAccess implement interface IAssignMethod instead of
15193         IStackStore as the order in which arguments are passed reflects
15194         this.
15195
15196         * assign.cs: Instead of using expr.ExprClass to select the way of
15197         assinging, probe for the IStackStore/IAssignMethod interfaces.
15198
15199         * typemanager.cs: Load InitializeArray definition.
15200
15201         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15202         static data that can be used to initialize arrays. 
15203
15204 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15205
15206         * expression.cs: Handle operator== and operator!= for booleans.
15207
15208         (Conditioal.Reduce): Implement reducer for the ?: operator.
15209
15210         (Conditional.Resolve): Implement dead code elimination.
15211
15212         (Binary.Resolve): Catch string literals and return a new
15213         concatenated string.
15214
15215         (Unary.Reduce): Implement reduction of unary expressions.
15216
15217         * ecore.cs: Split out the expression core handling here.
15218
15219         (Expression.Reduce): New method used to perform constant folding
15220         and CSE.  This is needed to support constant-expressions. 
15221
15222         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15223         targets, and optimize for !x.
15224
15225 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15226
15227         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15228         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15229         set custom atttributes.
15230
15231         * literal.cs (Literal::GetValue): New abstract method to return the actual
15232         value of the literal, cast as an object.
15233
15234         (*Literal): Implement GetValue method.
15235
15236         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15237         expressions to the arraylist but objects of type Argument.
15238
15239         * class.cs (TypeContainer::Emit): Emit our attributes too.
15240
15241         (Method::Emit, Constructor::Emit): Ditto.
15242
15243         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15244         to be ignoring earlier.
15245
15246 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15247
15248         * attribute.cs (AttributeSection::Define): Implement to do the business
15249         of constructing a CustomAttributeBuilder.
15250
15251         (Attribute): New trivial class. Increases readability of code.  
15252
15253         * cs-parser.jay : Update accordingly.
15254
15255         (positional_argument_list, named_argument_list, named_argument): New rules
15256
15257         (attribute_arguments): Use the above so that we are more correct.
15258
15259 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15260
15261         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15262         to perform all checks for a method with a params parameter.
15263
15264         (Invocation::OverloadResolve): Update to use the above method and therefore
15265         cope correctly with params method invocations.
15266
15267         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15268         params too.
15269
15270         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15271         constructors in our parent too because we can't afford to miss out on 
15272         protected ones ;-)
15273
15274         * attribute.cs (AttributeSection): New name for the class Attribute
15275
15276         Other trivial changes to improve readability.
15277
15278         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15279         use the new class names.
15280
15281 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15282
15283         * class.cs (Method::Define): Complete definition for params types too
15284
15285         (Indexer::Define): Ditto.
15286
15287         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15288         Cope everywhere with a request for info about the array parameter.
15289
15290 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15291
15292         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15293
15294         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15295         local_variable_type to extract the string corresponding to the type.
15296
15297         (local_variable_type): Fixup the action to use the new helper method.
15298
15299         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15300         go.
15301
15302         * expression.cs : Clean out code which uses the above.
15303
15304 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15305
15306         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15307         and bale out if necessary by returning a false.
15308
15309         (RegisterProperty): Ditto.
15310
15311         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15312         and print out appropriate error messages.
15313
15314         * interface.cs (everywhere): Ditto.
15315
15316         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15317         location to constructor.
15318
15319         * class.cs (Property, Event, Indexer): Update accordingly.
15320
15321         * ../errors/cs111.cs : Added.
15322
15323         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15324         of a method, as laid down by the spec.
15325
15326         (Invocation::OverloadResolve): Use the above method.
15327
15328 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15329
15330         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15331         now take a TypeContainer and a Parameters object.
15332
15333         (ParameterData): Modify return type of ParameterModifier method to be 
15334         Parameter.Modifier and not a string.
15335
15336         (ReflectionParameters, InternalParameters): Update accordingly.
15337
15338         * expression.cs (Argument::GetParameterModifier): Same here.
15339
15340         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15341         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15342         symbol in it at all so maybe this is only for now.
15343
15344 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15345
15346         * support.cs (InternalParameters): Constructor now takes an extra argument 
15347         which is the actual Parameters class.
15348
15349         (ParameterDesc): Update to provide info on ref/out modifiers.
15350
15351         * class.cs (everywhere): Update call to InternalParameters to pass in
15352         the second argument too.
15353
15354         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15355         to return the modifier info [ref/out etc]
15356
15357         (InternalParameters, ReflectionParameters): Implement the above.
15358
15359         * expression.cs (Argument::ParameterModifier): Similar function to return
15360         info about the argument's modifiers.
15361
15362         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15363         too.
15364
15365         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15366         a new SetFormalParameters object which we pass to InternalParameters.
15367
15368 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15369
15370         * expression.cs (NewArray): Merge into the ArrayCreation class.
15371
15372 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15373
15374         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15375         NewUserdefinedArray into one as there wasn't much of a use in having
15376         two separate ones.
15377
15378         * expression.cs (Argument): Change field's name to ArgType from Type.
15379
15380         (Type): New readonly property which returns the proper type, taking into 
15381         account ref/out modifiers.
15382
15383         (everywhere): Adjust code accordingly for the above.
15384
15385         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15386         whether we are emitting for a ref or out parameter.
15387
15388         * expression.cs (Argument::Emit): Use the above field to set the state.
15389
15390         (LocalVariableReference::Emit): Update to honour the flag and emit the
15391         right stuff.
15392
15393         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15394
15395         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15396
15397         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15398
15399         (ReflectionParameters, InternalParameters): Implement the above method.
15400
15401         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15402         reporting errors.
15403
15404         (Invocation::FullMethodDesc): Ditto. 
15405
15406 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15407
15408         * cs-parser.jay: Add extra production for the second form of array
15409         creation. 
15410
15411         * expression.cs (ArrayCreation): Update to reflect the above
15412         change. 
15413
15414         * Small changes to prepare for Array initialization.
15415
15416 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15417
15418         * typemanager.cs (ImplementsInterface): interface might be null;
15419         Deal with this problem;
15420
15421         Also, we do store negative hits on the cache (null values), so use
15422         this instead of calling t.GetInterfaces on the type everytime.
15423
15424 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15425
15426         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15427
15428         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15429         split functionality out into different classes.
15430
15431         (New::FormArrayType): Move into NewBuiltinArray.
15432
15433         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15434         quite useless.
15435
15436         (NewBuiltinArray): New class to handle creation of built-in arrays.
15437
15438         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15439         account creation of one-dimensional arrays.
15440
15441         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15442
15443         (NewUserdefinedArray::DoResolve): Implement.
15444
15445         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15446
15447         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15448         we maintain inside the TypeManager. This is necessary to perform lookups on the
15449         module builder.
15450
15451         (LookupType): Update to perform GetType on the module builders too.     
15452
15453         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15454
15455         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15456
15457 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15458
15459         * expression.cs (New::DoResolve): Implement guts of array creation.
15460
15461         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15462
15463 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15464
15465         * expression.cs: Fix bug I introduced lsat night that broke
15466         Delegates. 
15467
15468         (Expression.Resolve): Report a 246 error (can not resolve name)
15469         if we find a SimpleName in the stream.
15470
15471         (Expression.ResolveLValue): Ditto.
15472
15473         (Expression.ResolveWithSimpleName): This function is a variant of
15474         ResolveName, this one allows SimpleNames to be returned without a
15475         warning.  The only consumer of SimpleNames is MemberAccess
15476
15477 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15478
15479         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15480         might arrive here.  I have my doubts that this is correct.
15481
15482         * statement.cs (Lock): Implement lock statement.
15483
15484         * cs-parser.jay: Small fixes to support `lock' and `using'
15485
15486         * cs-tokenizer.cs: Remove extra space
15487
15488         * driver.cs: New flag --checked, allows to turn on integer math
15489         checking. 
15490
15491         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15492         Threading.Monitor.Exit 
15493
15494 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15495
15496         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15497         Expression Class to be IndexerAccess.
15498
15499         Notice that Indexer::DoResolve sets the eclass to Value.
15500
15501 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15502
15503         * class.cs (TypeContainer::Emit): Emit code for indexers.
15504
15505         * assign.cs (IAssignMethod): New interface implemented by Indexers
15506         and Properties for handling assignment.
15507
15508         (Assign::Emit): Simplify and reuse code. 
15509
15510         * expression.cs (IndexerAccess, PropertyExpr): Implement
15511         IAssignMethod, clean up old code. 
15512
15513 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15514
15515         * typemanager.cs (ImplementsInterface): New method to determine if a type
15516         implements a given interface. Provides a nice cache too.
15517
15518         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15519         method.
15520
15521         (ConvertReferenceExplicit): Ditto.
15522
15523         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15524         various methods, with correct names etc.
15525
15526         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15527         Operator.UnaryNegation.
15528
15529         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15530         we have a unary plus or minus operator.
15531
15532         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15533         UnaryMinus.
15534
15535         * everywhere : update accordingly.
15536
15537         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15538         respectively.
15539
15540         * class.cs (Method::Define): For the case where we are implementing a method
15541         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15542         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15543
15544 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15545
15546         * interface.cs (FindMembers): Implement to work around S.R.E
15547         lameness.
15548
15549         * typemanager.cs (IsInterfaceType): Implement.
15550
15551         (FindMembers): Update to handle interface types too.
15552
15553         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15554         use IsAssignableFrom as that is not correct - it doesn't work.
15555
15556         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15557         and accordingly override EmitStatement.
15558
15559         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15560         using the correct logic :-)
15561
15562 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15563
15564         * ../errors/cs-11.cs : Add to demonstrate error -11 
15565
15566 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15567
15568         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15569         then pass this as a hint to ResolveLValue.
15570
15571         * expression.cs (FieldExpr): Add Location information
15572
15573         (FieldExpr::LValueResolve): Report assignment to readonly
15574         variable. 
15575
15576         (Expression::ExprClassFromMemberInfo): Pass location information.
15577
15578         (Expression::ResolveLValue): Add new method that resolves an
15579         LValue. 
15580
15581         (Expression::DoResolveLValue): Default invocation calls
15582         DoResolve. 
15583
15584         (Indexers): New class used to keep track of indexers in a given
15585         Type. 
15586
15587         (IStackStore): Renamed from LValue, as it did not really describe
15588         what this did.  Also ResolveLValue is gone from this interface and
15589         now is part of Expression.
15590
15591         (ElementAccess): Depending on the element access type
15592
15593         * typemanager.cs: Add `indexer_name_type' as a Core type
15594         (System.Runtime.CompilerServices.IndexerNameAttribute)
15595
15596         * statement.cs (Goto): Take a location.
15597
15598 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15599
15600         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15601         if two delegates are compatible.
15602
15603         (NewDelegate::DoResolve): Update to take care of the case when
15604         we instantiate a delegate from another delegate.
15605
15606         * typemanager.cs (FindMembers): Don't even try to look up members
15607         of Delegate types for now.
15608
15609 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15610
15611         * delegate.cs (NewDelegate): New class to take care of delegate
15612         instantiation.
15613
15614         * expression.cs (New): Split the delegate related code out into 
15615         the NewDelegate class.
15616
15617         * delegate.cs (DelegateInvocation): New class to handle delegate 
15618         invocation.
15619
15620         * expression.cs (Invocation): Split out delegate related code into
15621         the DelegateInvocation class.
15622
15623 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15624
15625         * expression.cs (New::DoResolve): Implement delegate creation fully
15626         and according to the spec.
15627
15628         (New::DoEmit): Update to handle delegates differently.
15629
15630         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15631         because of which we were printing out arguments in reverse order !
15632
15633         * delegate.cs (VerifyMethod): Implement to check if the given method
15634         matches the delegate.
15635
15636         (FullDelegateDesc): Implement.
15637
15638         (VerifyApplicability): Implement.
15639
15640         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15641         delegate invocations too.
15642
15643         (Invocation::Emit): Ditto.
15644
15645         * ../errors/cs1593.cs : Added.
15646
15647         * ../errors/cs1594.cs : Added.
15648
15649         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15650
15651 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15652
15653         * typemanager.cs (intptr_type): Core type for System.IntPtr
15654
15655         (InitCoreTypes): Update for the same.
15656
15657         (iasyncresult_type, asynccallback_type): Ditto.
15658
15659         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15660         correct.
15661
15662         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15663         too.
15664
15665         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15666         the builders for the 4 members of a delegate type :-)
15667
15668         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15669         type.
15670
15671         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15672
15673         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15674
15675 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15676
15677         * statement.cs (Break::Emit): Implement.   
15678         (Continue::Emit): Implement.
15679
15680         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15681         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15682         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15683         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15684         end loop
15685
15686         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15687         properties that track the label for the current loop (begin of the
15688         loop and end of the loop).
15689
15690 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15691
15692         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15693         use of emitting anything at all.
15694
15695         * class.cs, rootcontext.cs : Get rid of calls to the same.
15696
15697         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15698
15699         (Populate): Define the constructor correctly and set the implementation
15700         attributes.
15701
15702         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15703         have been defined.
15704
15705         (AddDelegateType): Implement.
15706
15707         (IsDelegateType): Implement helper method.
15708
15709         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15710
15711         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15712         and accordingly handle it.
15713
15714         * delegate.cs (Populate): Take TypeContainer argument.
15715         Implement bits to define the Invoke method. However, I still haven't figured out
15716         how to take care of the native int bit :-(
15717
15718         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15719         Qualify the name of the delegate, not its return type !
15720
15721         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15722         conversion.
15723
15724         (StandardConversionExists): Checking for array types turns out to be recursive.
15725
15726         (ConvertReferenceExplicit): Implement array conversion.
15727
15728         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15729
15730 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15731
15732         * cs-parser.jay (delegate_declaration): Store the fully qualified
15733         name as it is a type declaration.
15734
15735         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15736         readonly.
15737
15738         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15739         as TypeContainer::DefineType.
15740
15741         (Populate): Method in which all the definition of the various methods (Invoke)
15742         etc is done.
15743
15744         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15745         see.
15746
15747         (CloseDelegate): Finally creates the delegate.
15748
15749         * class.cs (TypeContainer::DefineType): Update to define delegates.
15750         (Populate, Emit and CloseType): Do the same thing here too.
15751
15752         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15753         delegates in all these operations.
15754
15755 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15756
15757         * expression.cs: LocalTemporary: a new expression used to
15758         reference a temporary that has been created.
15759
15760         * assign.cs: Handle PropertyAccess back here, so that we can
15761         provide the proper semantic access to properties.
15762
15763         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15764         a few more explicit conversions. 
15765
15766         * modifiers.cs: `NEW' modifier maps to HideBySig.
15767
15768         * expression.cs (PropertyExpr): Make this into an
15769         ExpressionStatement, and support the EmitStatement code path. 
15770
15771         Perform get/set error checking, clean up the interface.
15772
15773         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15774         them into toplevel access objects.
15775
15776 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15777
15778         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15779         SRE.
15780
15781         * typemanager.cs: Keep track here of our PropertyBuilders again to
15782         work around lameness in SRE.
15783
15784 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15785
15786         * expression.cs (LValue::LValueResolve): New method in the
15787         interface, used to perform a second resolution pass for LValues. 
15788
15789         (This::DoResolve): Catch the use of this in static methods.
15790
15791         (This::LValueResolve): Implement.
15792
15793         (This::Store): Remove warning, assigning to `this' in structures
15794         is 
15795
15796         (Invocation::Emit): Deal with invocation of
15797         methods on value types.  We need to pass the address to structure
15798         methods rather than the object itself.  (The equivalent code to
15799         emit "this" for structures leaves the entire structure on the
15800         stack instead of a pointer to it). 
15801
15802         (ParameterReference::DoResolve): Compute the real index for the
15803         argument based on whether the method takes or not a `this' pointer
15804         (ie, the method is static).
15805
15806         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15807         value types returned from functions when we need to invoke a
15808         method on the sturcture.
15809
15810
15811 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15812
15813         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15814         defining the type in the Modulebuilder or Typebuilder. This is to take
15815         care of nested types which need to be defined on the TypeBuilder using
15816         DefineNestedMethod.
15817
15818         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15819         methods in RootContext, only ported to be part of TypeContainer.
15820
15821         (TypeContainer::GetInterfaceOrClass): Ditto.
15822
15823         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15824
15825         * interface.cs (Interface::DefineInterface): New method. Does exactly
15826         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15827         too.
15828
15829         (Interface::GetInterfaces): Move from RootContext here and port.
15830
15831         (Interface::GetInterfaceByName): Same here.
15832
15833         * rootcontext.cs (ResolveTree): Re-write.
15834
15835         (PopulateTypes): Re-write.
15836
15837         * class.cs (TypeContainer::Populate): Populate nested types too.
15838         (TypeContainer::Emit): Emit nested members too.
15839
15840         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15841         instead just use the name argument passed in as it is already fully
15842         qualified.
15843
15844         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15845         to TypeContainer mapping to see if a type is user-defined.
15846
15847         * class.cs (TypeContainer::CloseType): Implement. 
15848
15849         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15850         the default constructor.
15851
15852         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15853         twice.
15854
15855         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15856
15857         * interface.cs (CloseType): Create the type here.
15858
15859         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15860         the hierarchy.
15861
15862         Remove all the methods which are now in TypeContainer.
15863
15864 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15865
15866         * delegate.cs (Define): Re-write bits to define the delegate
15867         correctly.
15868
15869 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15870
15871         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15872
15873         * expression.cs (ImplicitReferenceConversion): handle null as well
15874         as a source to convert to any reference type.
15875
15876         * statement.cs (Return): Perform any implicit conversions to
15877         expected return type.  
15878
15879         Validate use of return statement.  
15880
15881         * codegen.cs (EmitContext): Pass the expected return type here.
15882
15883         * class.cs (Method, Constructor, Property): Pass expected return
15884         type to EmitContext.
15885
15886 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15887
15888         * expression.cs: Make DoResolve take an EmitContext instead of a
15889         TypeContainer.
15890
15891         Replaced `l' and `location' for `loc', for consistency.
15892
15893         (Error, Warning): Remove unneeded Tc argument.
15894
15895         * assign.cs, literal.cs, constant.cs: Update to new calling
15896         convention. 
15897
15898         * codegen.cs: EmitContext now contains a flag indicating whether
15899         code is being generated in a static method or not.
15900
15901         * cs-parser.jay: DecomposeQI, new function that replaces the old
15902         QualifiedIdentifier.  Now we always decompose the assembled
15903         strings from qualified_identifier productions into a group of
15904         memberaccesses.
15905
15906 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15907
15908         * rootcontext.cs: Deal with field-less struct types correctly now
15909         by passing the size option to Define Type.
15910
15911         * class.cs: Removed hack that created one static field. 
15912
15913 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15914
15915         * statement.cs: Moved most of the code generation here. 
15916
15917 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15918
15919         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15920         seem very right.
15921
15922         (ElementAccess): Remove useless bits for now - keep checks as the spec
15923         says.
15924
15925 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15926
15927         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15928         and start performing checks according to the spec.
15929
15930 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15931
15932         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15933         rank_specifiers instead.
15934
15935         (rank_specifiers): Change the order in which the rank specifiers are stored
15936
15937         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15938
15939         * expression.cs (ElementAccess): Implement the LValue interface too.
15940
15941 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15942
15943         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15944         except that user defined conversions are not included.
15945
15946         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15947         perform the conversion of the return type, if necessary.
15948
15949         (New::DoResolve): Check whether we are creating an array or an object
15950         and accordingly do the needful.
15951
15952         (New::Emit): Same here.
15953
15954         (New::DoResolve): Implement guts of array creation.
15955
15956         (New::FormLookupType): Helper function.
15957
15958 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15959
15960         * codegen.cs: Removed most of the code generation here, and move the
15961         corresponding code generation bits to the statement classes. 
15962
15963         Added support for try/catch/finalize and throw.
15964
15965         * cs-parser.jay: Added support for try/catch/finalize.
15966
15967         * class.cs: Catch static methods having the flags override,
15968         virtual or abstract.
15969
15970         * expression.cs (UserCast): This user cast was not really doing
15971         what it was supposed to do.  Which is to be born in fully resolved
15972         state.  Parts of the resolution were being performed at Emit time! 
15973
15974         Fixed this code.
15975
15976 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15977
15978         * expression.cs: Implicity convert the result from UserCast.
15979
15980 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15981
15982         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15983         prevented it from working correctly. 
15984
15985         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15986         merely ConvertImplicit.
15987
15988 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15989
15990         * typemanager.cs: Make the LookupTypeContainer function static,
15991         and not per-instance.  
15992
15993         * class.cs: Make static FindMembers (the one that takes a Type
15994         argument). 
15995
15996         * codegen.cs: Add EmitForeach here.
15997
15998         * cs-parser.jay: Make foreach a toplevel object instead of the
15999         inline expansion, as we need to perform semantic analysis on it. 
16000
16001 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16002
16003         * expression.cs (Expression::ImplicitUserConversion): Rename to
16004         UserDefinedConversion.
16005
16006         (Expression::UserDefinedConversion): Take an extra argument specifying 
16007         whether we look for explicit user conversions too.
16008
16009         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16010
16011         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16012
16013         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16014         with the appropriate arguments.
16015
16016         * cs-parser.jay (cast_expression): Record location too.
16017
16018         * expression.cs (Cast): Record location info.
16019
16020         (Expression::ConvertExplicit): Take location argument.
16021
16022         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16023         to determine if we are doing explicit conversions.
16024
16025         (UserCast::Emit): Update accordingly.
16026
16027         (Expression::ConvertExplicit): Report an error if everything fails.
16028
16029         * ../errors/cs0030.cs : Add.
16030
16031 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16032
16033         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16034         virtual and newslot bits. 
16035
16036         * class.cs (TypeContainer::RegisterRequiredImplementations):
16037         Record methods we need.
16038
16039         (TypeContainer::MakeKey): Helper function to make keys for
16040         MethodBases, since the Methodbase key is useless.
16041
16042         (TypeContainer::Populate): Call RegisterRequiredImplementations
16043         before defining the methods.   
16044
16045         Create a mapping for method_builders_to_methods ahead of time
16046         instead of inside a tight loop.
16047
16048         (::RequireMethods):  Accept an object as the data to set into the
16049         hashtable so we can report interface vs abstract method mismatch.
16050
16051 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16052
16053         * report.cs: Make all of it static.
16054
16055         * rootcontext.cs: Drop object_type and value_type computations, as
16056         we have those in the TypeManager anyways.
16057
16058         Drop report instance variable too, now it is a global.
16059
16060         * driver.cs: Use try/catch on command line handling.
16061
16062         Add --probe option to debug the error reporting system with a test
16063         suite. 
16064
16065         * report.cs: Add support for exiting program when a probe
16066         condition is reached.
16067
16068 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16069
16070         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16071         we do a forcible conversion regardless of type, to check if 
16072         ForceConversion returns a null.
16073
16074         (Binary::error19): Use location to report error.
16075
16076         (Unary::error23): Use location here too.
16077
16078         * ../errors/cs0019.cs : Check in.
16079
16080         * ../errors/cs0023.cs : Check in.
16081
16082         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16083         case of a non-null MethodInfo object with a length of 0 !
16084
16085         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16086         an applicable member - according to the spec :-)
16087         Also fix logic to find members in base types.
16088
16089         (Unary::ResolveOperator): Same here.
16090
16091         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16092         as I was getting thoroughly confused between this and error19 :-)
16093
16094         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16095         (::FindMostEncompassedType): Implement.
16096         (::FindMostEncompassingType): Implement.
16097         (::StandardConversionExists): Implement.
16098
16099         (UserImplicitCast): Re-vamp. We now need info about most specific
16100         source and target types so that we can do the necessary conversions.
16101
16102         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16103         mathematical union with no duplicates.
16104
16105 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16106
16107         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16108         in order from base classes to child classes, so that we can in
16109         child classes look up in our parent for method names and
16110         attributes (required for handling abstract, virtual, new, override
16111         constructs: we need to instrospect our base class, and if we dont
16112         populate the classes in order, the introspection might be
16113         incorrect.  For example, a method could query its parent before
16114         the parent has any methods and would determine that the parent has
16115         no abstract methods (while it could have had them)).
16116
16117         (RootContext::CreateType): Record the order in which we define the
16118         classes.
16119
16120 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16121
16122         * class.cs (TypeContainer::Populate): Also method definitions can
16123         fail now, keep track of this.
16124
16125         (TypeContainer::FindMembers): Implement support for
16126         DeclaredOnly/noDeclaredOnly flag.
16127
16128         (Constructor::Emit) Return the ConstructorBuilder.
16129
16130         (Method::Emit) Return the MethodBuilder. 
16131         Check for abstract or virtual methods to be public.
16132
16133         * rootcontext.cs (RootContext::CreateType): Register all the
16134         abstract methods required for the class to be complete and the
16135         interface methods that must be implemented. 
16136
16137         * cs-parser.jay: Report error 501 (method requires body if it is
16138         not marked abstract or extern).
16139
16140         * expression.cs (TypeOf::Emit): Implement.
16141
16142         * typemanager.cs: runtime_handle_type, new global type.
16143
16144         * class.cs (Property::Emit): Generate code for properties.
16145
16146 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16147
16148         * expression.cs (Unary::ResolveOperator): Find operators on base type
16149         too - we now conform exactly to the spec.
16150
16151         (Binary::ResolveOperator): Same here.
16152
16153         * class.cs (Operator::Define): Fix minor quirk in the tests.
16154
16155         * ../errors/cs0215.cs : Added.
16156
16157         * ../errors/cs0556.cs : Added.
16158
16159         * ../errors/cs0555.cs : Added.
16160
16161 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16162
16163         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16164         single integer which is really efficient
16165
16166 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16167
16168         *  expression.cs (Expression::ImplicitUserConversion): Use location
16169         even in the case when we are examining True operators.
16170  
16171         * class.cs (Operator::Define): Perform extensive checks to conform
16172         with the rules for operator overloading in the spec.
16173
16174         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16175         some of the other conversions mentioned in the spec.
16176
16177         * typemanager.cs (array_type): New static member for the System.Array built-in
16178         type.
16179
16180         (cloneable_interface): For System.ICloneable interface.
16181
16182         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16183         we start resolving the tree and populating types.
16184
16185         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16186  
16187 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16188
16189         * expression.cs (Expression::ExprClassFromMemberInfo,
16190         Expression::Literalize): Create literal expressions from
16191         FieldInfos which are literals.
16192
16193         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16194         type casts, because they were wrong.  The test suite in tests
16195         caught these ones.
16196
16197         (ImplicitNumericConversion): ushort to ulong requires a widening
16198         cast. 
16199
16200         Int32 constant to long requires widening cast as well.
16201
16202         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16203         for integers because the type on the stack is not i4.
16204
16205 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16206
16207         * expression.cs (report118): require location argument. 
16208
16209         * parameter.cs: Do not dereference potential null value.
16210
16211         * class.cs: Catch methods that lack the `new' keyword when
16212         overriding a name.  Report warnings when `new' is used without
16213         anything being there to override.
16214
16215         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16216
16217         * class.cs: Only add constructor to hashtable if it is non-null
16218         (as now constructors can fail on define).
16219
16220         (TypeManager, Class, Struct): Take location arguments.
16221
16222         Catch field instance initialization in structs as errors.
16223
16224         accepting_filter: a new filter for FindMembers that is static so
16225         that we dont create an instance per invocation.
16226
16227         (Constructor::Define): Catch errors where a struct constructor is
16228         parameterless 
16229
16230         * cs-parser.jay: Pass location information for various new
16231         constructs. 
16232
16233         * delegate.cs (Delegate): take a location argument.
16234
16235         * driver.cs: Do not call EmitCode if there were problesm in the
16236         Definition of the types, as many Builders wont be there. 
16237
16238         * decl.cs (Decl::Decl): Require a location argument.
16239
16240         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16241         into integers, and find the most appropiate integer for it.
16242
16243         * literal.cs: Implement ULongLiteral.
16244
16245         * rootcontext.cs: Provide better information about the location of
16246         failure when CreateType fails.
16247
16248 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16249
16250         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16251         as well.
16252
16253         * expression.cs (Binary::CheckShiftArguments): Add missing type
16254         computation.
16255         (Binary::ResolveOperator): Add type to the logical and and logical
16256         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16257         before.
16258
16259         (Binary::DoNumericPromotions): In the case where either argument
16260         is ulong (and most signed types combined with ulong cause an
16261         error) perform implicit integer constant conversions as well.
16262
16263 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16264
16265         * expression.cs (UserImplicitCast): Method should always be
16266         non-null. 
16267         (Invocation::BetterConversion): Simplified test for IntLiteral.
16268
16269         (Expression::ImplicitNumericConversion): Split this routine out.
16270         Put the code that performs implicit constant integer conversions
16271         here. 
16272
16273         (Expression::Resolve): Become a wrapper around DoResolve so we can
16274         check eclass and type being set after resolve.
16275
16276         (Invocation::Badness): Remove this dead function
16277
16278         (Binary::ResolveOperator): Do not compute the expensive argumnets
16279         unless we have a union for it.
16280
16281         (Probe::Emit): Is needs to do an isinst and then
16282         compare against null.
16283
16284         (::CanConvert): Added Location argument.  If the Location argument
16285         is null (Location.Null), then we do not report errors.  This is
16286         used by the `probe' mechanism of the Explicit conversion.  We do
16287         not want to generate an error for something that the user
16288         explicitly requested to be casted.  But the pipeline for an
16289         explicit cast first tests for potential implicit casts.
16290
16291         So for now, if the Location is null, it means `Probe only' to
16292         avoid adding another argument.   Might have to revise this
16293         strategy later.
16294
16295         (ClassCast): New class used to type cast objects into arbitrary
16296         classes (used in Explicit Reference Conversions).
16297
16298         Implement `as' as well.
16299
16300         Reverted all the patches from Ravi below: they were broken:
16301
16302                 * The use of `level' as a mechanism to stop recursive
16303                   invocations is wrong.  That was there just to catch the
16304                   bug with a strack trace but not as a way of addressing
16305                   the problem.
16306
16307                   To fix the problem we have to *understand* what is going
16308                   on and the interactions and come up with a plan, not
16309                   just get things going.
16310
16311                 * The use of the type conversion cache that I proposed
16312                   last night had an open topic: How does this work across
16313                   protection domains.  A user defined conversion might not
16314                   be public in the location where we are applying the
16315                   conversion, a different conversion might be selected
16316                   (ie, private A->B (better) but public B->A (worse),
16317                   inside A, A->B applies, but outside it, B->A will
16318                   apply).
16319
16320                 * On top of that (ie, even if the above is solved),
16321                   conversions in a cache need to be abstract.  Ie, `To
16322                   convert from an Int to a Short use an OpcodeCast', not
16323                   `To convert from an Int to a Short use the OpcodeCast on
16324                   the variable 5' (which is what this patch was doing).
16325
16326 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16327
16328         * expression.cs (Invocation::ConversionExists): Re-write to use
16329         the conversion cache
16330
16331         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16332         cache all conversions done, not just user-defined ones.
16333
16334         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16335         to determine if a conversion exists instead of acutually trying to 
16336         perform the conversion. It's faster too.
16337
16338         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16339         and only then attempt the implicit conversion.
16340
16341 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16342
16343         * expression.cs (ConvertImplicit): Use a cache for conversions
16344         already found. Check level of recursion and bail out if necessary.
16345
16346 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16347
16348         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16349         Export standard methods that we expect for string operations.
16350
16351         * statement.cs (Block::UsageWarning): Track usage of variables and
16352         report the errors for not used variables.
16353
16354         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16355         operator. 
16356
16357 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16358
16359         * codegen.cs: remove unnneded code 
16360
16361         * expression.cs: Removed BuiltinTypeAccess class
16362
16363         Fix the order in which implicit conversions are
16364         done.  
16365
16366         The previous fixed dropped support for boxed conversions (adding a
16367         test to the test suite now)
16368
16369         (UserImplicitCast::CanConvert): Remove test for source being null,
16370         that code is broken.  We should not feed a null to begin with, if
16371         we do, then we should track the bug where the problem originates
16372         and not try to cover it up here.
16373
16374         Return a resolved expression of type UserImplicitCast on success
16375         rather than true/false.  Ravi: this is what I was talking about,
16376         the pattern is to use a static method as a "constructor" for
16377         objects. 
16378
16379         Also, do not create arguments until the very last minute,
16380         otherwise we always create the arguments even for lookups that
16381         will never be performed. 
16382
16383         (UserImplicitCast::Resolve): Eliminate, objects of type
16384         UserImplicitCast are born in a fully resolved state. 
16385
16386         * typemanager.cs (InitCoreTypes): Init also value_type
16387         (System.ValueType). 
16388
16389         * expression.cs (Cast::Resolve): First resolve the child expression.
16390
16391         (LValue): Add new method AddressOf to be used by
16392         the `&' operator.  
16393
16394         Change the argument of Store to take an EmitContext instead of an
16395         ILGenerator, because things like FieldExpr need to be able to call
16396         their children expression to generate the instance code. 
16397
16398         (Expression::Error, Expression::Warning): Sugar functions for
16399         reporting errors.
16400
16401         (Expression::MemberLookup): Accept a TypeContainer instead of a
16402         Report as the first argument.
16403
16404         (Expression::ResolvePrimary): Killed.  I still want to improve
16405         this as currently the code is just not right.
16406
16407         (Expression::ResolveMemberAccess): Simplify, but it is still
16408         wrong. 
16409
16410         (Unary::Resolve): Catch errors in AddressOf operators.
16411
16412         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16413         index to a byte for the short-version, or the compiler will choose
16414         the wrong Emit call, which generates the wrong data.
16415
16416         (ParameterReference::Emit, ::Store): same.
16417
16418         (FieldExpr::AddressOf): Implement.
16419
16420         * typemanager.cs: TypeManager: made public variable instead of
16421         property.
16422
16423         * driver.cs: document --fatal.
16424
16425         * report.cs (ErrorMessage, WarningMessage): new names for the old
16426         Error and Warning classes.
16427
16428         * cs-parser.jay (member_access): Turn built-in access to types
16429         into a normal simplename
16430
16431 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16432
16433         * expression.cs (Invocation::BetterConversion): Fix to cope
16434         with q being null, since this was introducing a bug.
16435
16436         * expression.cs (ConvertImplicit): Do built-in conversions first.
16437
16438 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16439
16440         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16441
16442 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16443
16444         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16445         I had introduced long ago (what's new ?).
16446
16447         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16448         the work of all the checking. 
16449         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16450         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16451
16452         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16453         that is the right way. 
16454
16455         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16456         overloading resolution. Use everywhere instead of cutting and pasting code.
16457
16458         (Binary::ResolveOperator): Use MakeUnionSet.
16459
16460         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16461         we have to convert to bool types. Not complete yet.
16462
16463 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16464
16465         * typemanager.cs (TypeManager::CSharpName): support ushort.
16466
16467         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16468         to provide an expression that performsn an implicit constant int
16469         conversion (section 6.1.6).
16470         (Expression::ConvertImplicitRequired): Reworked to include
16471         implicit constant expression conversions.
16472
16473         (Expression::ConvertNumericExplicit): Finished.
16474
16475         (Invocation::Emit): If InstanceExpression is null, then it means
16476         that we perform a call on this.
16477
16478 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16479
16480         * expression.cs (Unary::Emit): Remove some dead code.
16481         (Probe): Implement Resolve and Emit for `is'.
16482         (Expression::ConvertImplicitRequired): Attempt to do constant
16483         expression conversions here.  Maybe should be moved to
16484         ConvertImplicit, but I am not sure.
16485         (Expression::ImplicitLongConstantConversionPossible,
16486         Expression::ImplicitIntConstantConversionPossible): New functions
16487         that tell whether is it possible to apply an implicit constant
16488         expression conversion.
16489
16490         (ConvertNumericExplicit): Started work on explicit numeric
16491         conversions.
16492
16493         * cs-parser.jay: Update operator constants.
16494
16495         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16496         (Parameters::GetSignature): Hook up VerifyArgs here.
16497         (Parameters::VerifyArgs): Verifies that no two arguments have the
16498         same name. 
16499
16500         * class.cs (Operator): Update the operator names to reflect the
16501         ones that the spec expects (as we are just stringizing the
16502         operator names).
16503
16504         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16505         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16506         previous usage did only work for our methods.
16507         (Expression::ConvertImplicit): Handle decimal implicit numeric
16508         conversions as well.
16509         (Expression::InternalTypeConstructor): Used to invoke constructors
16510         on internal types for default promotions.
16511
16512         (Unary::Emit): Implement special handling for the pre/post
16513         increment/decrement for overloaded operators, as they need to have
16514         the same semantics as the other operators.
16515
16516         (Binary::ResolveOperator): ditto.
16517         (Invocation::ConversionExists): ditto.
16518         (UserImplicitCast::Resolve): ditto.
16519
16520 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16521
16522         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16523         operator, return after emitting body. Regression tests pass again !
16524
16525         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16526         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16527         (Invocation::OverloadResolve): Ditto.
16528         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16529
16530         * everywhere : update calls to the above methods accordingly.
16531
16532 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16533
16534         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16535
16536         * expression.cs (ExpressionStatement): New base class used for
16537         expressions that can appear in statements, so that we can provide
16538         an alternate path to generate expression that do not leave a value
16539         on the stack.
16540
16541         (Expression::Emit, and all the derivatives): We no longer return
16542         whether a value is left on the stack or not.  Every expression
16543         after being emitted leaves a single value on the stack.
16544
16545         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16546         facilties of ExpressionStatement if possible.
16547
16548         * cs-parser.jay: Update statement_expression.
16549
16550 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16551
16552         * driver.cs: Change the wording of message
16553
16554 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16555
16556         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16557         the type of the expression to the return type of the method if
16558         we have an overloaded operator match ! The regression tests pass again !
16559         (Unary::ResolveOperator): Ditto.
16560
16561         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16562         to find "op_Implicit", not "implicit" ;-)
16563         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16564         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16565
16566         * everywhere : Correct calls to the above accordingly.
16567
16568         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16569         (ConvertImplicit): Do user-defined conversion if it exists.
16570
16571 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16572
16573         * assign.cs: track location.
16574         (Resolve): Use implicit conversions on assignment.
16575
16576         * literal.cs: Oops.  Not good, Emit of short access values should
16577         pass (Bytes) or the wrong argument will be selected.
16578
16579         * expression.cs (Unary::Emit): Emit code for -expr.
16580
16581         (Unary::ResolveOperator): Handle `Substract' for non-constants
16582         (substract from zero from the non-constants).
16583         Deal with Doubles as well. 
16584
16585         (Expression::ConvertImplicitRequired): New routine that reports an
16586         error if no implicit conversion exists. 
16587
16588         (Invocation::OverloadResolve): Store the converted implicit
16589         expressions if we make them
16590
16591 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16592
16593         * class.cs (ConstructorInitializer): Take a Location argument.
16594         (ConstructorBaseInitializer): Same here.
16595         (ConstructorThisInitializer): Same here.
16596
16597         * cs-parser.jay : Update all calls accordingly.
16598
16599         * expression.cs (Unary, Binary, New): Take location argument.
16600         Update accordingly everywhere.
16601
16602         * cs-parser.jay : Update all calls to the above to take a location
16603         argument.
16604
16605         * class.cs : Ditto.
16606
16607 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16608
16609         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16610         (Invocation::BetterConversion): Same here
16611         (Invocation::ConversionExists): Ditto.
16612
16613         (Invocation::ConversionExists): Implement.
16614
16615 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16616
16617         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16618         Also take an additional TypeContainer argument.
16619
16620         * All over : Pass in TypeContainer as argument to OverloadResolve.
16621
16622         * typemanager.cs (CSharpName): Update to check for the string type and return
16623         that too.
16624
16625         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16626         a given method.
16627
16628 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16629
16630         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16631         (Invocation::BetterFunction): Implement.
16632         (Invocation::BetterConversion): Implement.
16633         (Invocation::ConversionExists): Skeleton, no implementation yet.
16634
16635         Okay, things work fine !
16636
16637 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16638
16639         * typemanager.cs: declare and load enum_type, delegate_type and
16640         void_type. 
16641
16642         * expression.cs (Expression::Emit): Now emit returns a value that
16643         tells whether a value is left on the stack or not.  This strategy
16644         might be reveted tomorrow with a mechanism that would address
16645         multiple assignments.
16646         (Expression::report118): Utility routine to report mismatches on
16647         the ExprClass.
16648
16649         (Unary::Report23): Report impossible type/operator combination
16650         utility function.
16651
16652         (Unary::IsIncrementableNumber): Whether the type can be
16653         incremented or decremented with add.
16654         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16655         complemented. 
16656         (Unary::ResolveOperator): Implement ++, !, ~,
16657
16658         (Invocation::Emit): Deal with new Emit convetion.
16659
16660         * All Expression derivatives: Updated their Emit method to return
16661         whether they leave values on the stack or not.
16662
16663         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16664         stack for expressions that are statements. 
16665
16666 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16667
16668         * expression.cs (LValue): New interface.  Must be implemented by
16669         LValue objects.
16670         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16671         LValue interface.
16672
16673         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16674         interface for generating code, simplifies the code.
16675
16676 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16677
16678         * expression.cs (everywhere): Comment out return statements in ::Resolve
16679         methods to avoid the warnings.
16680
16681 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16682
16683         * driver.cs (parse): Report error 2001 if we can not open the
16684         source file.
16685
16686         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16687         not resolve it.
16688
16689         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16690         object. 
16691
16692         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16693         otherwise nested blocks end up with the same index.
16694
16695         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16696
16697         * expression.cs:  Instead of having FIXMEs in the Resolve
16698         functions, throw exceptions so it is obvious that we are facing a
16699         bug. 
16700
16701         * cs-parser.jay (invocation_expression): Pass Location information.
16702
16703         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16704         Use a basename for those routines because .NET does not like paths
16705         on them. 
16706
16707         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16708         already defined.
16709
16710 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16711
16712         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16713         are loading the correct data types (throws an exception if not).
16714         (TypeManager::InitCoreTypes): Use CoreLookupType
16715
16716         * expression.cs (Unary::ResolveOperator): return the child
16717         expression for expressions which are just +expr.
16718         (Unary::ResolveOperator): Return negative literals for -LITERAL
16719         expressions (otherwise they are Unary {Literal}).
16720         (Invocation::Badness): Take into account `Implicit constant
16721         expression conversions'.
16722
16723         * literal.cs (LongLiteral): Implement long literal class.
16724         (IntLiteral): export the `Value' of the intliteral. 
16725
16726 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16727
16728         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16729
16730         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16731         instead of 'Operator'
16732
16733         * expression.cs (Binary::ResolveOperator): Update accordingly.
16734         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16735         and 'Minus'
16736
16737         * cs-parser.jay (unary_expression): Update to use the new names.
16738
16739         * gen-treedump.cs (GetUnary): Same here.
16740
16741         * expression.cs (Unary::Resolve): Implement.
16742         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16743         operators are found instead of making noise ;-)
16744         (Unary::ResolveOperator): New method to do precisely the same thing which
16745         Binary::ResolveOperator does for Binary expressions.
16746         (Unary.method, .Arguments): Add.
16747         (Unary::OperName): Implement.   
16748         (Unary::ForceConversion): Copy and Paste !
16749
16750         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16751         a unary operator.
16752
16753         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16754         for the inbuilt operators. Only overloading works for now ;-)
16755
16756 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16757
16758         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16759         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16760
16761         * expression.cs (This::Emit): Implement. 
16762         (This::Resolve): Implement.
16763         (TypeOf:Resolve): Implement.
16764         (Expression::ResolveSimpleName): Add an implicit this to instance
16765         field references. 
16766         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16767         Bind instance variable to Field expressions.
16768         (FieldExpr::Instance): New field used to track the expression that
16769         represents the object instance.
16770         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16771         binding 
16772         (FieldExpr::Emit): Implement.
16773
16774         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16775         the last instruction contains a return opcode to avoid generating
16776         the last `ret' instruction (this generates correct code, and it is
16777         nice to pass the peverify output).
16778
16779         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16780         initializer for static and instance variables.
16781         (Constructor::Emit): Allow initializer to be null in the case of
16782         static constructors.  Only emit initializer for instance
16783         constructors. 
16784
16785         (TypeContainer::FindMembers): Return a null array if there are no
16786         matches.
16787
16788         Also fix the code for the MemberTypes.Method branch, as it was not
16789         scanning that for operators (or tried to access null variables before).
16790
16791         * assign.cs (Assign::Emit): Handle instance and static fields. 
16792
16793         * TODO: Updated.
16794
16795         * driver.cs: Stop compilation if there are parse errors.
16796
16797         * cs-parser.jay (constructor_declaration): Provide default base
16798         initializer for non-static constructors.
16799         (constructor_declarator): Do not provide a default base
16800         initializers if none was specified.
16801         Catch the fact that constructors should not have parameters.
16802
16803         * class.cs: Do not emit parent class initializers for static
16804         constructors, that should be flagged as an error.
16805
16806 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16807
16808         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16809         Move back code into TypeContainer::Populate.
16810
16811 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16812
16813         * class.cs (TypeContainer::AddConstructor): Fix the check to
16814         compare against Name, not Basename. 
16815         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16816
16817         * cs-parser.jay : Update accordingly.
16818
16819         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16820         for methods, don't forget to look into the operators too.
16821         (RegisterMethodBuilder): Helper method to take care of this for
16822         methods, constructors and operators.
16823         (Operator::Define): Completely revamp.
16824         (Operator.OperatorMethod, MethodName): New fields.
16825         (TypeContainer::Populate): Move the registering of builders into
16826         RegisterMethodBuilder.
16827         (Operator::Emit): Re-write.
16828
16829         * expression.cs (Binary::Emit): Comment out code path to emit method
16830         invocation stuff for the case when we have a user defined operator. I am
16831         just not able to get it right !
16832
16833 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16834
16835         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16836         argument. 
16837
16838         (Expression::MemberLookup): Provide a version that allows to
16839         specify the MemberTypes and BindingFlags. 
16840
16841         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16842         so it was not fetching variable information from outer blocks.
16843
16844         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16845         Beforefieldinit as it was buggy.
16846
16847         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16848         that Ravi put here.  
16849
16850         * class.cs (Constructor::Emit): Only emit if block is not null.
16851         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16852         deal with this by semantically definining it as if the user had
16853         done it.
16854
16855         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16856         constructors as we now "emit" them at a higher level.
16857
16858         (TypeContainer::DefineDefaultConstructor): Used to define the
16859         default constructors if none was provided.
16860
16861         (ConstructorInitializer): Add methods Resolve and Emit. 
16862
16863         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16864
16865 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16866
16867         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16868         the default constructor builder with our hashtable for methodbuilders
16869         to methodcores.
16870
16871         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16872         and argument_count is 0 in which case we have a match.
16873         (Binary::ResolveOperator): More null checking and miscellaneous coding
16874         style cleanup.
16875
16876 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16877
16878         * rootcontext.cs (IsNameSpace): Compare against null.
16879
16880         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16881
16882         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16883         and Unary::Operator.
16884
16885         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16886         accordingly.
16887
16888         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16889         we have overloaded operators.
16890         (Binary::ResolveOperator): Implement the part which does the operator overload
16891         resolution.
16892
16893         * class.cs (Operator::Emit): Implement.
16894         (TypeContainer::Emit): Emit the operators we have too.
16895
16896         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16897         the case when we have a user-defined operator.
16898
16899 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16900
16901         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16902
16903 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16904
16905         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16906         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16907         (Constructor::Emit): Implement.
16908         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16909         if we have no work to do. 
16910         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16911         Emit method.
16912
16913         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16914         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16915
16916         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16917         of parent.parent.
16918
16919 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16920
16921         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16922         in the source.
16923         (Tree::RecordNamespace): Method to do what the name says ;-)
16924         (Tree::Namespaces): Property to get at the namespaces hashtable.
16925
16926         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16927         keep track.
16928
16929         * rootcontext.cs (IsNamespace): Fixed it :-)
16930
16931 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16932
16933         * class.cs (TypeContainer::FindMembers): Add support for
16934         constructors. 
16935         (MethodCore): New class that encapsulates both the shared aspects
16936         of a Constructor and a Method.  
16937         (Method, Constructor): Factored pieces into MethodCore.
16938
16939         * driver.cs: Added --fatal which makes errors throw exceptions.
16940         Load System assembly as well as part of the standard library.
16941
16942         * report.cs: Allow throwing exceptions on errors for debugging.
16943
16944         * modifiers.cs: Do not use `parent', instead use the real type
16945         container to evaluate permission settings.
16946
16947         * class.cs: Put Ravi's patch back in.  He is right, and we will
16948         have to cope with the
16949
16950 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16951
16952         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16953         FamORAssem, not FamANDAssem.
16954
16955 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16956
16957         * driver.cs: Added --parse option that only parses its input files
16958         and terminates.
16959
16960         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16961         incorrect.  IsTopLevel is not used to tell whether an object is
16962         root_types or not (that can be achieved by testing this ==
16963         root_types).  But to see if this is a top-level *class* (not
16964         necessarly our "toplevel" container). 
16965
16966 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16967
16968         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16969         parent instead of a direct call to GetType.
16970
16971 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16972
16973         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16974         Modifiers.TypeAttr. This should just be a call to that method.
16975
16976         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16977         object so that we can determine if we are top-level or not.
16978
16979         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16980         TypeContainer too.
16981
16982         * enum.cs (Enum::Define): Ditto.
16983
16984         * modifiers.cs (FieldAttr): Re-write.
16985
16986         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16987         (TypeContainer::HaveStaticConstructor): New property to provide access
16988         to precisely that info.
16989
16990         * modifiers.cs (MethodAttr): Re-write.
16991         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16992
16993         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16994         of top-level types as claimed.
16995
16996 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16997
16998         * expression.cs (MemberLookup): Fruitless attempt to lookup
16999         constructors.  Maybe I need to emit default constructors?  That
17000         might be it (currently .NET emits this for me automatically).
17001         (Invocation::OverloadResolve): Cope with Arguments == null.
17002         (Invocation::EmitArguments): new function, shared by the new
17003         constructor and us.
17004         (Invocation::Emit): Handle static and instance methods.  Emit
17005         proper call instruction for virtual or non-virtual invocations.
17006         (New::Emit): Implement.
17007         (New::Resolve): Implement.
17008         (MemberAccess:Resolve): Implement.
17009         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17010         to track instances.
17011         (FieldExpr::Resolve): Set type.
17012
17013         * support.cs: Handle empty arguments.
17014                 
17015         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17016         SimpleLookup): Auxiliary routines to help parse a qualifier
17017         identifier.  
17018
17019         Update qualifier_identifier rule.
17020
17021         * codegen.cs: Removed debugging messages.
17022
17023         * class.cs: Make this a global thing, this acts just as a "key" to
17024         objects that we might have around.
17025
17026         (Populate): Only initialize method_builders_to_methods once.
17027
17028         * expression.cs (PropertyExpr): Initialize type from the
17029         PropertyType. 
17030
17031         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17032         Resolve pattern.  Attempt to implicitly convert value to boolean.
17033         Emit code.
17034
17035         * expression.cs: Set the type for the int32/int32 argument case.
17036         (Binary::ResolveOperator): Set the return type to boolean for
17037         comparission operators
17038
17039         * typemanager.cs: Remove debugging print code.
17040
17041         (Invocation::Resolve): resolve type.
17042
17043         * class.cs: Allocate a MemberInfo of the correct size, as the code
17044         elsewhere depends on the test to reflect the correct contents.
17045
17046         (Method::) Keep track of parameters, due to System.Reflection holes
17047
17048         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17049         mapping here.
17050
17051         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17052         of the exact size and return that.
17053
17054         (Class::LookupMethodByBuilder): New function that maps
17055         MethodBuilders to its methods.  Required to locate the information
17056         on methods because System.Reflection bit us again.
17057
17058         * support.cs: New file, contains an interface ParameterData and
17059         two implementations: ReflectionParameters and InternalParameters
17060         used to access Parameter information.  We will need to grow this
17061         as required.
17062
17063         * expression.cs (Invocation::GetParameterData): implement a cache
17064         and a wrapper around the ParameterData creation for methods. 
17065         (Invocation::OverloadResolve): Use new code.
17066
17067 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17068
17069         * class.cs (TypeContainer::EmitField): Remove and move into 
17070         (Field::Define): here and modify accordingly.
17071         (Field.FieldBuilder): New member.
17072         (TypeContainer::Populate): Update accordingly.
17073         (TypeContainer::FindMembers): Implement.
17074
17075 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17076
17077         * statement.cs: (VariableInfo::VariableType): New field to be
17078         initialized with the full type once it is resolved. 
17079
17080 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17081
17082         * parameter.cs (GetParameterInfo): Use a type cache to compute
17083         things only once, and to reuse this information
17084
17085         * expression.cs (LocalVariableReference::Emit): Implement.
17086         (OpcodeCast::Emit): fix.
17087
17088         (ParameterReference::Resolve): Implement.
17089         (ParameterReference::Emit): Implement.
17090
17091         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17092         that are expressions need to stay as Expressions.
17093
17094         * typemanager.cs (CSharpName): Returns the C# name of a type if
17095         possible. 
17096
17097         * expression.cs (Expression::ConvertImplicit): New function that
17098         implements implicit type conversions.
17099
17100         (Expression::ImplicitReferenceConversion): Implements implicit
17101         reference conversions.
17102
17103         (EmptyCast): New type for transparent casts.
17104
17105         (OpcodeCast): New type for casts of types that are performed with
17106         a sequence of bytecodes.
17107
17108         (BoxedCast): New type used for casting value types into reference
17109         types.  Emits a box opcode.
17110
17111         (Binary::DoNumericPromotions): Implements numeric promotions of
17112         and computation of the Binary::Type.
17113
17114         (Binary::EmitBranchable): Optimization.
17115
17116         (Binary::Emit): Implement code emission for expressions.
17117
17118         * typemanager.cs (TypeManager): Added two new core types: sbyte
17119         and byte.
17120
17121 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17122
17123         * class.cs (TypeContainer::FindMembers): Method which does exactly
17124         what Type.FindMembers does, only we don't have to use reflection. No
17125         implementation yet.
17126
17127         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17128         typecontainer objects as we need to get at them.
17129         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17130
17131         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17132         typecontainer object.
17133
17134         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17135         of just a Report object.
17136
17137 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17138
17139         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17140         "remove_"
17141         (TypeContainer::Populate): Now define the delegates of the type too.
17142         (TypeContainer.Delegates): Property to access the list of delegates defined
17143         in the type.
17144
17145         * delegates.cs (Delegate::Define): Implement partially.
17146
17147         * modifiers.cs (TypeAttr): Handle more flags.
17148
17149 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17150
17151         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17152         and not <=
17153         (Operator::Define): Re-write logic to get types by using the LookupType method
17154         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17155         (Indexer::Define): Ditto.
17156         (Event::Define): Ditto.
17157         (Property::Define): Ditto.
17158
17159 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17160
17161         * class.cs (TypeContainer::Populate): Now define operators too. 
17162         (TypeContainer.Operators): New property to access the list of operators
17163         in a type.
17164         (Operator.OperatorMethodBuilder): New member to hold the method builder
17165         for the operator we are defining.
17166         (Operator::Define): Implement.
17167
17168 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17169
17170         * class.cs (Event::Define): Make the prefixes of the accessor methods
17171         addOn_ and removeOn_ 
17172
17173         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17174         of the location being passed in too. Ideally, this should go later since all
17175         error reporting should be done through the Report object.
17176
17177         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17178         (Populate): Iterate thru the indexers we have and define them too.
17179         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17180         for the get and set accessors.
17181         (Indexer::Define): Implement.
17182
17183 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17184
17185         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17186         my previous implementation, did not work.
17187
17188         * typemanager.cs: Add a couple of missing types (the longs).
17189
17190         * literal.cs: Use TypeManager.bool_type instead of getting it.
17191
17192         * expression.cs (EventExpr): New kind of expressions.
17193         (Expressio::ExprClassFromMemberInfo): finish
17194
17195 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17196
17197         * assign.cs: Emit stores to static fields differently.
17198
17199 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17200
17201         * Merge in changes and adjust code to tackle conflicts. Backed out my
17202         code in Assign::Resolve ;-) 
17203
17204 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17205
17206         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17207         instead Report.Error and also pass in the location.
17208         (CSharpParser::Lexer): New readonly property to return the reference
17209         to the Tokenizer object.
17210         (declare_local_variables): Use Report.Error with location instead of plain 
17211         old error.
17212         (CheckDef): Ditto.
17213
17214         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17215         (Operator.CheckBinaryOperator): Ditto.
17216
17217         * cs-parser.jay (operator_declarator): Update accordingly.
17218
17219         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17220         (CheckBinaryOperator): Same here.
17221
17222         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17223         on the name without any prefixes of namespace names etc. This is because we
17224         already might have something already fully qualified like 
17225         'System.Console.WriteLine'
17226
17227         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17228
17229 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17230
17231         * cs-tokenizer.cs (location): Return a string which also contains
17232         the file name.
17233
17234         * expression.cs (ElementAccess): New class for expressions of the
17235         type 'element access.'
17236         (BaseAccess): New class for expressions of the type 'base access.'
17237         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17238         respectively.
17239
17240         * cs-parser.jay (element_access): Implement action.
17241         (base_access): Implement actions.
17242         (checked_expression, unchecked_expression): Implement.
17243
17244         * cs-parser.jay (local_variable_type): Correct and implement.
17245         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17246
17247         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17248
17249         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17250         name and the specifiers.
17251
17252         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17253
17254         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17255         making them all public ;-)
17256
17257         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17258         class anyways.
17259
17260 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17261
17262         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17263         PropertyExprs.
17264         (FieldExpr, PropertyExprs): New resolved expressions.
17265         (SimpleName::MemberStaticCheck): Perform static checks for access
17266         to non-static fields on static methods. Maybe this should be
17267         generalized for MemberAccesses. 
17268         (SimpleName::ResolveSimpleName): More work on simple name
17269         resolution. 
17270
17271         * cs-parser.jay (primary_expression/qualified_identifier): track
17272         the parameter index.
17273
17274         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17275         (EmitContext::EmitBoolExpression): Chain to expression generation
17276         instead of temporary hack.
17277         (::EmitStatementExpression): Put generic expression code generation.
17278
17279         * assign.cs (Assign::Emit): Implement variable assignments to
17280         local variables, parameters and fields.
17281
17282 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17283
17284         * statement.cs (Block::GetVariableInfo): New method, returns the
17285         VariableInfo for a variable name in a block.
17286         (Block::GetVariableType): Implement in terms of GetVariableInfo
17287
17288         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17289         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17290
17291 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17292
17293         * cs-parser.jay (operator_declaration): Continue on my quest : update
17294         to take attributes argument.
17295         (event_declaration): Ditto.
17296         (enum_declaration): Ditto.
17297         (indexer_declaration): Ditto.
17298
17299         * class.cs (Operator::Operator): Update constructor accordingly.
17300         (Event::Event): Ditto.
17301
17302         * delegate.cs (Delegate::Delegate): Same here.
17303
17304         * enum.cs (Enum::Enum): Same here.
17305
17306 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17307
17308         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17309
17310         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17311
17312         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17313         being passed around as an arraylist.
17314         (Attributes::AddAttribute): Method to add attribute sections.
17315
17316         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17317         (struct_declaration): Update accordingly.
17318         (constant_declaration): Update.
17319         (field_declaration): Update.
17320         (method_header): Update.
17321         (fixed_parameter): Update.
17322         (parameter_array): Ditto.
17323         (property_declaration): Ditto.
17324         (destructor_declaration): Ditto.
17325
17326         * class.cs (Struct::Struct): Update constructors accordingly.
17327         (Class::Class): Ditto.
17328         (Field::Field): Ditto.
17329         (Method::Method): Ditto.
17330         (Property::Property): Ditto.
17331         (TypeContainer::OptAttribute): update property's return type.
17332
17333         * interface.cs (Interface.opt_attributes): New member.
17334         (Interface::Interface): Update to take the extra Attributes argument.
17335
17336         * parameter.cs (Parameter::Parameter): Ditto.
17337
17338         * constant.cs (Constant::Constant): Ditto.
17339
17340         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17341         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17342         the attributes as a parameter.
17343         (InterfaceProperty): Update constructor call.
17344         (InterfaceEvent): Ditto.
17345         (InterfaceMethod): Ditto.
17346         (InterfaceIndexer): Ditto.
17347
17348         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17349         pass the attributes too.
17350         (interface_event_declaration): Ditto.
17351         (interface_property_declaration): Ditto.
17352         (interface_method_declaration): Ditto.
17353         (interface_declaration): Ditto.
17354
17355 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17356
17357         * class.cs (Method::Define): Track the "static Main" definition to
17358         create an entry point. 
17359
17360         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17361         EntryPoint if we find it. 
17362
17363         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17364         (EmitContext::ig): Make this variable public.
17365
17366         * driver.cs: Make the default output file be the first file name
17367         with the .exe extension.  
17368
17369         Detect empty compilations
17370
17371         Handle various kinds of output targets.  Handle --target and
17372         rename -t to --dumper.
17373
17374         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17375         methods inherited from Expression return now an Expression.  This
17376         will is used during the tree rewriting as we resolve them during
17377         semantic analysis.
17378
17379         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17380         the spec.  Missing entirely is the information about
17381         accessability of elements of it.
17382
17383         (Expression::ExprClassFromMemberInfo): New constructor for
17384         Expressions that creates a fully initialized Expression based on
17385         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17386         a Type.
17387
17388         (Invocation::Resolve): Begin implementing resolution of invocations.
17389
17390         * literal.cs (StringLiteral):  Implement Emit.
17391
17392 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17393
17394         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17395         member.
17396
17397 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17398
17399         * cs-parser.jay (attribute_arguments): Implement actions.
17400         (attribute): Fix bug in production. Implement action.
17401         (attribute_list): Implement.
17402         (attribute_target): Implement.
17403         (attribute_target_specifier, opt_target_specifier): Implement
17404         (CheckAttributeTarget): New method to check if the attribute target
17405         is valid.
17406         (attribute_section): Implement.
17407         (opt_attributes): Implement.
17408
17409         * attribute.cs : New file to handle attributes.
17410         (Attribute): Class to hold attribute info.
17411
17412         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17413         (attribute_section): Modify production to use 2 different rules to 
17414         achieve the same thing. 1 s/r conflict down !
17415         Clean out commented, useless, non-reducing dimension_separator rules.
17416
17417         * class.cs (TypeContainer.attributes): New member to hold list
17418         of attributes for a type.
17419         (Struct::Struct): Modify to take one more argument, the attribute list.
17420         (Class::Class): Ditto.
17421         (Field::Field): Ditto.
17422         (Method::Method): Ditto.
17423         (Property::Property): Ditto.
17424
17425         * cs-parser.jay (struct_declaration): Update constructor call to
17426         pass in the attributes too.
17427         (class_declaration): Ditto.
17428         (constant_declaration): Ditto.
17429         (field_declaration): Ditto.
17430         (method_header): Ditto.
17431         (fixed_parameter): Ditto.
17432         (parameter_array): Ditto.
17433         (property_declaration): Ditto.
17434
17435         * constant.cs (Constant::Constant): Update constructor similarly.
17436         Use System.Collections.
17437
17438         * parameter.cs (Parameter::Parameter): Update as above.
17439
17440 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17441
17442         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17443         (TypeContainer.delegates): New member to hold list of delegates.
17444
17445         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17446         this time as I seem to be on crack ;-)
17447
17448 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17449
17450         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17451         tell whether an identifier represents a namespace.
17452
17453         * expression.cs (NamespaceExpr): A namespace expression, used only
17454         temporarly during expression resolution.
17455         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17456         utility functions to resolve names on expressions.
17457
17458 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17459
17460         * codegen.cs: Add hook for StatementExpressions. 
17461
17462         * class.cs: Fix inverted test for static flag in methods.
17463
17464 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17465
17466         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17467         to make it coincide with MS' number.
17468         (Operator::CheckBinaryOperator): Ditto.
17469
17470         * ../errors/errors.txt : Remove error numbers added earlier.
17471
17472         * ../errors/cs1019.cs : Test case for error # 1019
17473
17474         * ../errros/cs1020.cs : Test case for error # 1020
17475
17476         * cs-parser.jay : Clean out commented cruft.
17477         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17478         used anywhere - non-reducing rule.
17479         (namespace_declarations): Non-reducing rule - comment out.
17480
17481         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17482         with TypeContainer::AddEnum.
17483
17484         * delegate.cs : New file for delegate handling classes.
17485         (Delegate): Class for declaring delegates.
17486
17487         * makefile : Update.
17488
17489         * cs-parser.jay (delegate_declaration): Implement.
17490
17491 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17492
17493         * class.cs (Event::Define): Implement.
17494         (Event.EventBuilder): New member.
17495
17496         * class.cs (TypeContainer::Populate): Update to define all enums and events
17497         we have.
17498         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17499         readonly fields for all these cases ?
17500
17501 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17502
17503         * class.cs (Property): Revamp to use the convention of making fields readonly.
17504         Accordingly modify code elsewhere.
17505
17506         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17507         the Define method of the Property class.
17508
17509         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17510         trivial bug.
17511         (TypeContainer::Populate): Update to define all the properties we have. Also
17512         define all enumerations.
17513
17514         * enum.cs (Define): Implement.
17515
17516 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17517
17518         * cs-parser.jay (overloadable_operator): The semantic value is an
17519         enum of the Operator class.
17520         (operator_declarator): Implement actions.
17521         (operator_declaration): Implement.
17522
17523         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17524         validity of definitions.
17525         (Operator::CheckBinaryOperator): Static method to check for binary operators
17526         (TypeContainer::AddOperator): New method to add an operator to a type.
17527
17528         * cs-parser.jay (indexer_declaration): Added line to actually call the
17529         AddIndexer method so it gets added ;-)
17530
17531         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17532         already taken care of by the MS compiler ?  
17533
17534 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17535
17536         * class.cs (Operator): New class for operator declarations.
17537         (Operator::OpType): Enum for the various operators.
17538
17539 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17540
17541         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17542         ostensibly handle this in semantic analysis.
17543
17544         * cs-parser.jay (general_catch_clause): Comment out
17545         (specific_catch_clauses, specific_catch_clause): Ditto.
17546         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17547         (catch_args, opt_catch_args): New productions.
17548         (catch_clause): Rewrite to use the new productions above
17549         (catch_clauses): Modify accordingly.
17550         (opt_catch_clauses): New production to use in try_statement
17551         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17552         and re-write the code in the actions to extract the specific and
17553         general catch clauses by being a little smart ;-)
17554
17555         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17556         Hooray, try and catch statements parse fine !
17557
17558 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17559
17560         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17561         string from the hashtable of variables.
17562
17563         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17564         I end up making that mistake ;-)
17565         (catch_clauses): Fixed gross error which made Key and Value of the 
17566         DictionaryEntry the same : $1 !!
17567
17568 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17569
17570         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17571
17572         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17573         when the add and remove accessors are specified. 
17574
17575 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17576
17577         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17578         information about indexer_declarator.
17579         (indexer_declarator): Implement actions.
17580         (parsing_indexer): New local boolean used to keep track of whether
17581         we are parsing indexers or properties. This is necessary because 
17582         implicit_parameters come into picture even for the get accessor in the 
17583         case of an indexer.
17584         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17585
17586         * class.cs (Indexer): New class for indexer declarations.
17587         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17588         (TypeContainer::indexers): New member to hold list of indexers for the
17589         type.
17590
17591 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17592
17593         * cs-parser.jay (add_accessor_declaration): Implement action.
17594         (remove_accessor_declaration): Implement action.
17595         (event_accessors_declaration): Implement
17596         (variable_declarators): swap statements for first rule - trivial.
17597
17598         * class.cs (Event): New class to hold information about event
17599         declarations.
17600         (TypeContainer::AddEvent): New method to add an event to a type
17601         (TypeContainer::events): New member to hold list of events.
17602
17603         * cs-parser.jay (event_declaration): Implement actions.
17604
17605 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17606
17607         * cs-parser.jay (dim_separators): Implement. Make it a string
17608         concatenating all the commas together, just as they appear.
17609         (opt_dim_separators): Modify accordingly
17610         (rank_specifiers): Update accordingly. Basically do the same
17611         thing - instead, collect the brackets here.
17612         (opt_rank_sepcifiers): Modify accordingly.
17613         (array_type): Modify to actually return the complete type string
17614         instead of ignoring the rank_specifiers.
17615         (expression_list): Implement to collect the expressions
17616         (variable_initializer): Implement. We make it a list of expressions
17617         essentially so that we can handle the array_initializer case neatly too.
17618         (variable_initializer_list): Implement.
17619         (array_initializer): Make it a list of variable_initializers
17620         (opt_array_initializer): Modify accordingly.
17621
17622         * expression.cs (New::NType): Add enumeration to help us
17623         keep track of whether we have an object/delegate creation
17624         or an array creation.
17625         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17626         members to hold data about array creation.
17627         (New:New): Modify to update NewType
17628         (New:New): New Overloaded contructor for the array creation
17629         case.
17630
17631         * cs-parser.jay (array_creation_expression): Implement to call
17632         the overloaded New constructor.
17633
17634 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17635
17636         * class.cs (TypeContainer::Constructors): Return member
17637         constructors instead of returning null.
17638
17639 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17640
17641         * typemanager.cs (InitCoreTypes): Initialize the various core
17642         types after we have populated the type manager with the user
17643         defined types (this distinction will be important later while
17644         compiling corlib.dll)
17645
17646         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17647         on Expression Classification.  Now all expressions have a method
17648         `Resolve' and a method `Emit'.
17649
17650         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17651         generation from working.     Also add some temporary debugging
17652         code. 
17653
17654 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17655
17656         * codegen.cs: Lots of code generation pieces.  This is only the
17657         beginning, will continue tomorrow with more touches of polish.  We
17658         handle the fundamentals of if, while, do, for, return.  Others are
17659         trickier and I need to start working on invocations soon.
17660
17661         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17662         s.InitStatement. 
17663
17664         * codegen.cs (EmitContext): New struct, used during code
17665         emission to keep a context.   Most of the code generation will be
17666         here. 
17667
17668         * cs-parser.jay: Add embedded blocks to the list of statements of
17669         this block.  So code generation proceeds in a top down fashion.
17670
17671 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17672
17673         * statement.cs: Add support for multiple child blocks.
17674
17675 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17676
17677         * codegen.cs (EmitCode): New function, will emit the code for a
17678         Block of code given a TypeContainer and its ILGenerator. 
17679
17680         * statement.cs (Block): Standard public readonly optimization.
17681         (Block::Block constructors): Link children. 
17682         (Block::Child): Child Linker.
17683         (Block::EmitVariables): Emits IL variable declarations.
17684
17685         * class.cs: Drop support for MethodGroups here, delay until
17686         Semantic Analysis.
17687         (Method::): Applied the same simplification that I did before, and
17688         move from Properties to public readonly fields.
17689         (Method::ParameterTypes): Returns the parameter types for the
17690         function, and implements a cache that will be useful later when I
17691         do error checking and the semantic analysis on the methods is
17692         performed.
17693         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17694         and made a method, optional argument tells whether this is a class
17695         or a structure to apply the `has-this' bit.
17696         (Method::GetCallingConvention): Implement, returns the calling
17697         convention. 
17698         (Method::Define): Defines the type, a second pass is performed
17699         later to populate the methods.
17700
17701         (Constructor::ParameterTypes): implement a cache similar to the
17702         one on Method::ParameterTypes, useful later when we do semantic
17703         analysis. 
17704
17705         (TypeContainer::EmitMethod):  New method.  Emits methods.
17706
17707         * expression.cs: Removed MethodGroup class from here.
17708
17709         * parameter.cs (Parameters::GetCallingConvention): new method.
17710
17711 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17712
17713         * class.cs (TypeContainer::Populate): Drop RootContext from the
17714         argument. 
17715
17716         (Constructor::CallingConvention): Returns the calling convention.
17717         (Constructor::ParameterTypes): Returns the constructor parameter
17718         types. 
17719
17720         (TypeContainer::AddConstructor): Keep track of default constructor
17721         and the default static constructor.
17722
17723         (Constructor::) Another class that starts using `public readonly'
17724         instead of properties. 
17725
17726         (Constructor::IsDefault): Whether this is a default constructor. 
17727
17728         (Field::) use readonly public fields instead of properties also.
17729
17730         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17731         track of static constructors;  If none is used, turn on
17732         BeforeFieldInit in the TypeAttributes. 
17733
17734         * cs-parser.jay (opt_argument_list): now the return can be null
17735         for the cases where there are no arguments. 
17736
17737         (constructor_declarator): If there is no implicit `base' or
17738         `this', then invoke the default parent constructor. 
17739
17740         * modifiers.cs (MethodAttr): New static function maps a set of
17741         modifiers flags into a MethodAttributes enum
17742         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17743         MethodAttr, TypeAttr to represent the various mappings where the
17744         modifiers are used.
17745         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17746
17747 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17748
17749         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17750         method arguments.
17751
17752         * interface.cs (PopulateIndexer): Implemented the code generator
17753         for interface indexers.
17754
17755 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17756
17757         * interface.cs (InterfaceMemberBase): Now we track the new status
17758         here.  
17759
17760         (PopulateProperty): Implement property population.  Woohoo!  Got
17761         Methods and Properties going today. 
17762
17763         Removed all the properties for interfaces, and replaced them with
17764         `public readonly' fields. 
17765
17766 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17767
17768         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17769         initialize their hashtables/arraylists only when they are needed
17770         instead of doing this always.
17771
17772         * parameter.cs: Handle refs and out parameters.
17773
17774         * cs-parser.jay: Use an ArrayList to construct the arguments
17775         instead of the ParameterCollection, and then cast that to a
17776         Parameter[] array.
17777
17778         * parameter.cs: Drop the use of ParameterCollection and use
17779         instead arrays of Parameters.
17780
17781         (GetParameterInfo): Use the Type, not the Name when resolving
17782         types. 
17783
17784 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17785
17786         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17787         and instead use public readonly fields.
17788
17789         * class.cs: Put back walking code for type containers.
17790
17791 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17792
17793         * class.cs (MakeConstant): Code to define constants.
17794
17795         * rootcontext.cs (LookupType): New function.  Used to locate types 
17796
17797
17798 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17799
17800         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17801         this System.Reflection code is.  Kudos to Microsoft
17802
17803         * typemanager.cs: Implement a type cache and avoid loading all
17804         types at boot time.  Wrap in LookupType the internals.  This made
17805         the compiler so much faster.  Wow.  I rule!
17806
17807         * driver.cs: Make sure we always load mscorlib first (for
17808         debugging purposes, nothing really important).
17809
17810         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17811         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17812
17813         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17814         on namespaces that have been imported using the `using' keyword.
17815
17816         * class.cs (TypeContainer::TypeAttr): Virtualize.
17817         (Class::TypeAttr): Return attributes suitable for this bad boy.
17818         (Struct::TypeAttr): ditto.
17819         Handle nested classes.
17820         (TypeContainer::) Remove all the type visiting code, it is now
17821         replaced with the rootcontext.cs code
17822
17823         * rootcontext.cs (GetClassBases): Added support for structs. 
17824
17825 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17826
17827         * interface.cs, statement.cs, class.cs, parameter.cs,
17828         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17829         Drop use of TypeRefs, and use strings instead.
17830
17831 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17832
17833         * rootcontext.cs: 
17834
17835         * class.cs (Struct::Struct): set the SEALED flags after
17836         checking the modifiers.
17837         (TypeContainer::TypeAttr): new property, returns the
17838         TypeAttributes for a class.  
17839
17840         * cs-parser.jay (type_list): Oops, list production was creating a
17841         new list of base types.
17842
17843         * rootcontext.cs (StdLib): New property.
17844         (GetInterfaceTypeByName): returns an interface by type name, and
17845         encapsulates error handling here.
17846         (GetInterfaces): simplified.
17847         (ResolveTree): Encapsulated all the tree resolution here.
17848         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17849         types. 
17850
17851         * driver.cs: Add support for --nostdlib, to avoid loading the
17852         default assemblies.
17853         (Main): Do not put tree resolution here. 
17854
17855         * rootcontext.cs: Beginning of the class resolution.
17856
17857 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17858
17859         * rootcontext.cs: Provide better error reporting. 
17860
17861         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17862
17863         * rootcontext.cs (CreateInterface): Handle the case where there
17864         are no parent interfaces.
17865
17866         (CloseTypes): Routine to flush types at the end.
17867         (CreateInterface): Track types.
17868         (GetInterfaces): Returns an array of Types from the list of
17869         defined interfaces.
17870
17871         * typemanager.c (AddUserType): Mechanism to track user types (puts
17872         the type on the global type hash, and allows us to close it at the
17873         end). 
17874
17875 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17876
17877         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17878         RecordInterface instead.
17879
17880         * cs-parser.jay: Updated to reflect changes above.
17881
17882         * decl.cs (Definition): Keep track of the TypeBuilder type that
17883         represents this type here.  Not sure we will use it in the long
17884         run, but wont hurt for now.
17885
17886         * driver.cs: Smaller changes to accomodate the new code.
17887
17888         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17889         when done. 
17890
17891         * rootcontext.cs (CreateInterface):  New method, used to create
17892         the System.TypeBuilder type for interfaces.
17893         (ResolveInterfaces): new entry point to resolve the interface
17894         hierarchy. 
17895         (CodeGen): Property, used to keep track of the code generator.
17896
17897 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17898
17899         * cs-parser.jay: Add a second production for delegate_declaration
17900         with `VOID'.
17901
17902         (enum_body): Put an opt_comma here instead of putting it on
17903         enum_body or enum_member_declarations so we can handle trailing
17904         commas on enumeration members.  Gets rid of a shift/reduce.
17905
17906         (type_list): Need a COMMA in the middle.
17907
17908         (indexer_declaration): Tell tokenizer to recognize get/set
17909
17910         * Remove old targets.
17911
17912         * Re-add the parser target.
17913
17914 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17915
17916         * cs-parser.jay: Add precendence rules for a number of operators
17917         ot reduce the number of shift/reduce conflicts in the grammar.
17918
17919 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17920
17921         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17922         and put it here.
17923
17924         Get rid of old crufty code.
17925
17926         * rootcontext.cs: Use this to keep track of the parsed
17927         representation and the defined types available to the program. 
17928
17929         * gen-treedump.cs: adjust for new convention.
17930
17931         * type.cs: Split out the type manager, and the assembly builder
17932         from here. 
17933
17934         * typemanager.cs: the type manager will live here now.
17935
17936         * cil-codegen.cs: And the code generator here. 
17937
17938 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17939
17940         * makefile: Fixed up for easy making.
17941
17942 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17943
17944         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17945         the 
17946
17947         (unary_expression): Expand pre_increment_expression and
17948         post_decrement_expression to reduce a shift/reduce.
17949
17950 2001-07-11  Simon Cozens
17951
17952         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17953
17954         Improve allow_keyword_as_indent name.
17955
17956 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17957
17958         * Adjustments for Beta2. 
17959
17960 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17961
17962         * decl.cs: Added `Define' abstract method.
17963         (InTransit): new property, used to catch recursive definitions. 
17964
17965         * interface.cs: Implement `Define'. 
17966
17967         * modifiers.cs: Map Modifiers.constants to
17968         System.Reflection.TypeAttribute flags.
17969
17970         * class.cs: Keep track of types and user-defined types.
17971         (BuilderInit): New method for creating an assembly
17972         (ResolveType): New function to launch the resolution process, only
17973         used by interfaces for now.
17974
17975         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17976         that are inserted into the name space. 
17977
17978 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17979
17980         * ARGH.  I have screwed up my tree so many times due to the use of
17981         rsync rather than using CVS.  Going to fix this at once. 
17982
17983         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17984         load types.
17985
17986 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17987
17988         * Experiment successful: Use System.Type rather that our own
17989         version of Type.  
17990
17991 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17992
17993         * cs-parser.jay: Removed nsAliases from here.
17994
17995         Use new namespaces, handle `using XXX;' 
17996
17997         * namespace.cs: Reimplemented namespace handling, use a recursive
17998         definition of the class.  Now we can keep track of using clauses
17999         and catch invalid using clauses.
18000
18001 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18002
18003         * gen-treedump.cs: Adapted for all the renaming.
18004
18005         * expression.cs (Expression): this class now has a Type property
18006         which returns an expression Type.
18007
18008         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18009         `Type', as this has a different meaning now in the base
18010
18011 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18012
18013         * interface.cs, class.cs: Removed from all the sources the
18014         references to signature computation, as we can not do method
18015         signature computation during the parsing time, as we are not
18016         trying to solve at that point distinguishing:
18017
18018         class X {
18019                 void a (Blah x) {}
18020                 void a (NS.Blah x) {}
18021         }
18022
18023         Which depending on the context might be valid or not, as we do not
18024         know if Blah is the same thing as NS.Blah at that point.
18025
18026         * Redid everything so the code uses TypeRefs now instead of
18027         Types.  TypeRefs are just temporary type placeholders, that need
18028         to be resolved.  They initially have a pointer to a string and the
18029         current scope in which they are used.  This is used later by the
18030         compiler to resolve the reference to an actual Type. 
18031
18032         * DeclSpace is no longer a CIR.Type, and neither are
18033         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18034         are all DeclSpaces, but no Types. 
18035
18036         * type.cs (TypeRefManager): This implements the TypeRef manager,
18037         which keeps track of all the types that need to be resolved after
18038         the parsing has finished. 
18039
18040 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18041
18042         * ARGH.  We are going to have to store `foreach' as a class rather
18043         than resolving it, as we need to verify error 1579 after name
18044         resolution.   *OR* we could keep a flag that says `This request to
18045         IEnumerator comes from a foreach statement' which we can then use
18046         to generate the error.
18047
18048 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18049
18050         * class.cs (TypeContainer.AddMethod): we now add methods to the
18051         MethodGroup instead of the method hashtable.  
18052
18053         * expression.cs: Add MethodGroup abstraction, which gets us one
18054         step closer to the specification in the way we handle method
18055         declarations.  
18056
18057         * cs-parser.jay (primary_expression): qualified_identifier now
18058         tried to match up an identifier to a local variable reference or
18059         to a parameter reference.
18060
18061         current_local_parameters is now a parser global variable that
18062         points to the current parameters for the block, used during name
18063         lookup.
18064
18065         (property_declaration): Now creates an implicit `value' argument to
18066         the set accessor.
18067
18068 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18069
18070         * parameter.cs: Do not use `param' arguments as part of the
18071         signature, per the spec.
18072
18073 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18074
18075         * decl.cs: Base class for classes, structs and interfaces.  This
18076         is the "Declaration Space" 
18077
18078         * cs-parser.jay: Use CheckDef for checking declaration errors
18079         instead of having one on each function.
18080
18081         * class.cs: Factor out some code for handling error handling in
18082         accordance to the "Declarations" section in the "Basic Concepts"
18083         chapter in the ECMA C# spec.
18084
18085         * interface.cs: Make all interface member classes derive from
18086         InterfaceMemberBase.
18087
18088 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18089
18090         * Many things: all interfaces are parsed and generated in
18091         gen-treedump.  Support for member variables, constructors,
18092         destructors, properties, constants is there.
18093
18094         Beginning of the IL backend, but very little done, just there for
18095         testing purposes. 
18096
18097 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18098
18099         * cs-parser.jay: Fix labeled statement.
18100
18101         * cs-tokenizer.cs (escape): Escape " and ' always.
18102         ref_line, ref_name: keep track of the line/filename as instructed
18103         by #line by the compiler.
18104         Parse #line.
18105
18106 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18107
18108         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18109         to match the values in System.CodeDOM.
18110
18111         Divid renamed to Divide.
18112
18113         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18114         statements. 
18115         (Statements.set): remove.
18116
18117         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18118         statements. 
18119
18120         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18121         falseStatements always have valid values. 
18122
18123         * cs-parser.jay: Use System.CodeDOM now.
18124