Fix build
[mono.git] / mcs / mcs / ChangeLog
1 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
2
3         * attribute.cs: Check for null and empty strings.  
4
5         I have lost another battle to Paolo.
6
7 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
8
9         Fix #70942
10         * class.cs (PropertyMethod): Set Parent field in ctors.
11         (SetMethod.InternalParameters): Add unsafe switch hack.
12         Override MarkForDuplicationCheck where it is appropriate.
13
14         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
15         It says whether container allows members with the same name.
16         Base default is no.
17         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
18         Removed is_method parameter.
19
20 2005-01-06  Duncan Mak  <duncan@ximian.com>
21
22         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
23         because the previous change led to incorrect reporting of CS1032
24         ("Cannot define/undefine preprocessor symbols after first token in
25         file"). Instead of using `tokens_seen' as the only flag that
26         triggers CS1040, introduce `comments_seen'. This new flag is used
27         to signify having seen comments on the current line, so it is
28         unset after a newline.
29
30 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
31
32         * doc.cs : When searching for a type, find nested type too.
33           This fixes bug #71040.
34
35 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
36
37         * doc.cs :
38           - Warn missing member comment on those classes which also does not
39             have doc comments. Fixed bug #71041.
40           - Don't warn missing doc comment on default constructor.
41             Fixed bug #71042.
42
43 2005-01-06  Duncan Mak  <duncan@ximian.com>
44
45         * cs-tokenizer.cs (xtoken): After handling traditional C-style
46         comments, set `tokens_seen' to true. This allows us to detect
47         misplaced preprocessor directives (i.e. not at the beginning of
48         the a line, nor after whitespaces). In that case, report error
49         CS1040. This fixes bug #56460.
50
51         * cs-parser.jay (interface_member_declaration): Add checks for
52         IsExplicitImpl, and report CS0541 error if an interface member is
53         defined as an explicit interface declaration.
54
55 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
56
57         Fix #70817
58         * class.cs (PropertyMethod): Set Parent field in ctors.
59         (SetMethod.InternalParameters): Add unsafe switch hack.
60         
61         * decl.cs (MemberCore.Parent): Cannot be readonly.
62
63 2005-01-06  Raja R Harinath  <rharinath@novell.com>
64
65         * decl.cs (DeclSpace.ResolveType): Remove.
66         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
67         Merge in code from ...
68         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
69         * class.cs, enum.cs: Update to changes.
70
71 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
72
73         * anonymous.cs: Ensure that we init the scope of our parent if it
74         has not been initialized yet.
75
76 2004-12-30  Duncan Mak  <duncan@ximian.com>
77
78         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
79         if field.FieldBuilder is null. Fixes #70758.
80
81         * convert.cs: Fixed some typos and updated some of the comments.
82         (ImplicitStandardConversionExists):
83         (TryImplicitIntConversion): If `target_type' is an interface and
84         the type of `ic' implements this interface, return true or a new
85         BoxedCast instead of null. This fixes #70468.
86
87 2004-12-29  Duncan Mak  <duncan@ximian.com>
88
89         * expression.cs (Argument.Emit): Check that Expr is
90         IMemoryLocation before casting to it, and report CS1510 otherwise.
91
92         This fixes #70402.
93
94 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
95
96         * statement.cs (Block.ThisVariable): remove the recursion here, to
97         make the --profile more sane.
98
99 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
100
101         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
102         assembly, by JB Evain.
103
104 2004-12-17  Raja R Harinath  <rharinath@novell.com>
105
106         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
107           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
108         "parent" refers to enclosing type/class.  "base" refers to superclass.
109
110 2004-12-17  Raja R Harinath  <rharinath@novell.com>
111
112         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
113         Ensure that we only have GlobalAttributes.
114         * attribute.cs (Attribute.Emit): Make non-virtual.
115         (GlobalAttribute.Emit): Remove.
116         (Attribute.Resolve): Make virtual.
117         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
118         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
119         the argument. Don't create one.
120         (Attribute.GetObsoleteAttribute): Likewise.
121         (Attribute.GetClsCompliantAttributeValue): Likewise.
122         * class.cs, decl.cs: Update to changes.
123
124 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
125
126         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
127         
128         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
129         
130         * statement.cs (Foreach.Resolve): Add error 186 report.
131
132 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
133
134         * expression.cs (Conditional.DoResolve): Add warning 429.
135         
136         * statement.cs (If.Resolve): Add warning 665.
137
138 2004-12-16  Raja R Harinath  <rharinath@novell.com>
139
140         New invariant: RootContext.Tree.Types.NamespaceEntry == null
141         except when in the parser, and in GlobalAttribute.
142         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
143         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
144         RootContext.Tree.Types.NamespaceEntry once work is done.
145         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
146         and resets RootContext.Tree.Types.NamespaceEntry.
147
148 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
149
150         * cs-parser.jay: Don't create a block for every variable.
151
152 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
153
154         * location.cs: Provide extra information.
155
156         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
157         variables from the captured environment, it is the ldarg_0.
158
159 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
160
161         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
162         find a conclusion.
163         
164         * class.cs: Changed warning level for 169 to avoid developer
165         displeasure from warning flooding. It will be changed back when they
166         fix most of current BCL warnings.
167         
168         * RootContext.cs: Pushed default WarningLevel to 3.
169         
170         * statement.cs: Removed unused variable.
171
172 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
173
174         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
175         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
176         Add error 502 report.
177         (StaticClass.DefineType): Add error 441 report.
178         (Class.AllowedModifiersProp): New virtual property as temporary
179         extension to AllowedModifiers.
180         (Class.DefineType): Add error 418 report. Moved ModFlags check here
181         to share implementation with StaticClass and don't call virtual
182         methods from ctor.
183         
184         * driver.cs (MainDriver): Add error 1558 test.
185
186         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
187         report. Moved error 36 test here.
188
189         * statement.cs (Throw.Resolve): Add error 724 report.
190
191         * typemanager.cs: Add out_attribute_type core type.
192         
193 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
194
195         * class.cs (TypeContainer.VerifyClsCompliance): Add error
196         3018 report.
197         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
198
199         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
200         3017 report.
201         
202         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
203
204         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
205         Add error 3023 report.
206         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
207
208         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
209         implementation.
210
211 2004-12-12  John Luke  <john.luke@gmail.com>
212
213         * driver.cs (AddArgs): take -- into account when
214         adding arguments, fixes bug 65710 
215
216 2004-12-12  Martin Baulig  <martin@ximian.com>
217
218         * expression.cs (Unary.TryReduceNegative): Added support for
219         SByteConstant and ByteConstant.
220         (Unary.Reduce): Check error values from TryReduceNegative().
221
222 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
223
224         * attributes.cs (Attribute.Resolve): Avoid multiple error report
225         and report exception as error 182.
226
227 2004-12-10  Raja R Harinath  <rharinath@novell.com>
228
229         * driver.cs (Main): Fix message when there are warnings.
230
231 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
232
233         * delegate.cs: Fixed my fix from yesterday, sorry about that.
234
235 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
236
237         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
238         Reduced number of warnings.
239         
240         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
241
242 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
243
244         * driver.cs: Removed message.
245
246         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
247
248 2004-12-08    <vargaz@freemail.hu>
249
250         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
251
252 2004-12-08  Martin Baulig  <martin@ximian.com>
253
254         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
255         instead of a CS3002 for properties and indexer.
256
257 2004-12-08  Martin Baulig  <martin@ximian.com>
258
259         * decl.cs (MemberName.ToString): Make this work again.
260
261 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
262
263         * attribute.cs (Resolve): Add error 591 detection.
264
265         * class.cs (FieldMember.Define): Add error 1547 detection.
266         (Indexer.Define): Add error 620 detection.
267         (Operator.Define): Add error 590 detection.
268
269         * ecore.cs: Missing argument for error 79.
270
271         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
272         detection.
273
274 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
275
276         Fix #70106
277         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
278         only.
279
280 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
281
282         * cs-parser.jay : handle doc comments on implicit/explicit operators.
283           Some operator comments were suppressed.
284         * doc.cs : Implicit/explicit operator name in doc comments are like
285           "op_Explicit(type)~returnType", so added suffix handling.
286
287 2004-12-07  Martin Baulig  <martin@ximian.com>
288
289         * decl.cs
290         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
291         (MemberCore.GetClsCompliantAttributeValue): Likewise.
292         (DeclSpace.ec): New protected field; store the EmitContext here.
293         (DeclSpace.EmitContext): New public property; moved here from
294         `TypeContainer'.
295         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
296         EmitContext.
297
298         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
299         (Enum.Emit): Don't create a new EmitContext.
300
301         * delegate.cs (Delegate.DefineType): Always create the
302         EmitContext.
303
304         * iterators.cs (Iterators.DefineIterator): Create a new
305         EmitContext and store it in `ec'.
306
307 2004-08-24  Martin Baulig  <martin@ximian.com>
308
309         * typemanager.cs
310         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
311         this for accessibility checks.
312         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
313         IsNestedFamilyAccessible.
314         (TypeManager.IsSubclassOf): New method, do what the name actually
315         says.   
316
317 2004-12-06  Raja R Harinath  <rharinath@novell.com>
318
319         Fix crash on cs0657-17.cs.
320         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
321         Use RootContext.Tree.Types, not 'new RootTypes ()'.
322         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
323         the case where the NamespaceEntry gets overwritten.
324
325 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
326
327         Fixed #69195, #56821
328         * ecore.cs (ResolveBoolean): Tiny refactoring.
329
330         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
331         of right expression resolving when left is false constant and
332         operator is LogicalAnd OR true constant and operator is LogicalOr.
333
334         * statement.cs (ResolveUnreachable): Always reports warning.
335
336 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
337
338         * class.cs: Distinguish between 1721 and 1722 (just a little help
339         for the programmer).
340
341 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
342
343         * delegate.cs: Only allow this on new versions of the language. 
344
345 2004-12-02  Duncan Mak  <duncan@ximian.com>
346
347         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
348         Expression class.
349         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
350         here as a static method. Take an additional bool out parameter
351         `must_do_cs1540_check' for signaling to InstanceResolve.
352         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
353         member field from PropertyExpr class and made it an argument of
354         the method instead.
355         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
356         check for MarshalByRefObject, and report CS0122 instead of CS1540.
357         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
358         and `remove_accessor' as well as InstanceResolve: report CS0122
359         where applicable.
360
361         Fixes #70129.
362
363 2004-12-03  Raja R Harinath  <rharinath@novell.com>
364
365         Fix test-327.cs, test-328.cs, and put in early infrastructure
366         for eventually fixing #52697.
367         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
368         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
369         from other methods.
370         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
371         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
372         (VerifyUsing, error246): Update.
373         * rootcontext.cs (RootContext.NamespaceLookup): Just use
374         'NamespaceEntry.LookupNamespaceOrType'.
375
376 2004-12-03  Martin Baulig  <martin@ximian.com>
377
378         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
379         method as our child, call AnonymousMethod.Compatible() on it.
380
381 2004-12-03  Raja R Harinath  <rharinath@novell.com>
382
383         Disable XML documentation support in 'basic' profile.
384         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
385         Redirect XmlElement to System.Object.
386         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
387         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
388         * mcs.exe.sources: Add doc-bootstrap.cs.
389         * doc-bootstrap.cs: New file.  Contains empty stub implementation
390         of doc.cs.
391
392 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
393
394         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
395           comments are allowed.
396
397 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
398
399         * delegate.cs: Add checks for subtypes in paramaters and return values
400         in VerifyMethod () to add support for Covariance/Contravariance
401         in delegates.
402         
403 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
404
405         * report.cs: Remove extra closing parenthesis.
406
407         * convert.cs (Error_CannotImplicitConversion): If the name of the
408         types are the same, provide some extra information.
409
410         * class.cs (FieldBase): Use an unused bit field from the field to
411         encode the `has_offset' property from the FieldMember.  This saves
412         a couple of Ks on bootstrap compilation.
413
414         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
415         method as our child, return the AnonymousMethod resolved
416         expression.
417
418         * expression.cs (New.DoResolve): Allow return values from
419         NewDelegate to also include AnonymousMethods.
420
421         Fixes #70150.
422
423 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
424
425         Fix bug #70102
426         * attribute.cs (Resolve): Improved implementation of params
427         attribute arguments.
428
429         * support.cs (ParameterData): Add HasParams to be faster.
430
431 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
432
433         all things are for /doc support:
434
435         * doc.cs: new file that supports XML documentation generation.
436         * mcs.exe.sources: added doc.cs.
437         * driver.cs:
438           Handle /doc command line option.
439           Report error 2006 instead of 5 for missing file name for /doc.
440           Generate XML documentation when required, after type resolution.
441         * cs-tokenizer.cs:
442           Added support for picking up documentation (/// and /** ... */),
443           including a new XmlCommentState enumeration.
444         * cs-parser.jay:
445           Added lines to fill Documentation element for field, constant,
446           property, indexer, method, constructor, destructor, operator, event
447           and class, struct, interface, delegate, enum.
448           Added lines to warn incorrect comment.
449         * rootcontext.cs :
450           Added Documentation field (passed only when /doc was specified).
451         * decl.cs:
452           Added DocComment, DocCommentHeader, GenerateDocComment() and
453           OnGenerateDocComment() and some supporting private members for
454           /doc feature to MemberCore.
455         * class.cs:
456           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
457         * delegate.cs:
458           Added overriden DocCommentHeader.
459         * enum.cs:
460           Added overriden DocCommentHeader and GenerateDocComment().
461
462 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
463
464         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
465         unwrapping the enumeration values, chain to
466         DoConstantNumericPromotions again, so we can promote things to the
467         fundamental types (takes care of enums that are bytes, sbytes).
468
469         Fixes bug #62054.
470
471 2004-12-01  Raja R Harinath  <rharinath@novell.com>
472
473         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
474         Fix long-standing bug in type-lookup.  Use FindType instead of
475         LookupType when ec.ResolvingTypeTree.
476         (Attribute.ResolveType, Attribute.Resolve)
477         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
478         Update to changes.
479         (Attributes.Search): Remove internal version.  Update.
480         (Attributes.SearchMulti): Update.
481         (Attributes.GetClsCompliantAttribute): Remove.
482         (Attributes.GetIndexerNameAttribute): Remove.
483         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
484         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
485         * class.cs (Indexer.Define): Likewise.
486
487 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
488
489         Fix bug #68790
490         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
491         MarshallByReference members access.
492
493         * expression.cs: Use CheckMarshallByRefAccess;
494         Better error CS0197 message.
495
496         * report.cs: Print whole related error message.
497
498 2004-11-30  Raja R Harinath  <rharinath@novell.com>
499
500         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
501         the current directory to help debugging.
502
503 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
504
505         * class (GetClassBases): Better error 60 report.
506         (EventProperty): Disabled warning 67 detection.
507
508 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
509
510         Fix bug #60324
511         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
512
513         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
514         precise values.
515
516 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
517
518         Fix bug #49488
519         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
520
521         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
522
523 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
524
525         * attribute.cs (Attribute.Resolve): Refine error reporting and
526         report a cs0117 if the identifier does not exist, to distinguish
527         from 0617 which is a miss-use of the actual identifier.
528
529         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
530         between cs0070 and cs0079.
531
532         * class.cs (MemberBase.DoDefine): When reporting a wrong
533         accessibility level, we use MethodCore to compare instead of
534         Method (this was a regression in some refactoring effort).
535
536         So now we correctly report cs0056 again.
537
538         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
539         testing the target_type (which was known to be object_type) and
540         not the source type (which is anonymous_method).
541
542         Fixed reporting of error cs1660.
543
544         * expression.cs (UserCast.Source): Expose the underlying cast.
545
546         * statement.cs (Switch.SwitchGoverningType): Sort the list of
547         allowed types to find a match to int32 first (most common).
548
549         In addition, it ignores any ImplicitUserConversions that did an
550         internal implicit conversion (as the switch statement allows only
551         one integral conversion to exist).
552
553         * class.cs (PartialContainer.Create): rename `name' to
554         `member_name' for clarity.  Then replace the string calls with a
555         call to MemberName.GetPartialName, as now using
556         MemberName.ToString is an error (this is due to the side effects
557         it had, that were fixed in the past).
558
559         This will restore the error reporting on a number of partial class
560         errors that were missusing this (and getting an exception as a
561         results, which is now just a plain textual warning, because
562         yyparse debug output would crash otherwise).
563
564 2004-11-26  Raja R Harinath  <rharinath@novell.com>
565
566         * Makefile (PROGRAM_INSTALL_DIR): Remove.
567
568 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
569
570         * rootcontext.cs (LookupType): Make sure to cache lookups that
571         don't give us a negative result. This saves about 5% of corlib
572         compilation time.
573
574 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
575
576         * report.cs (AbstractMessage.Print): messages are sent to stderr
577
578         * class.cs (TypeContainer.GetClassBases): It is an error to have a
579         non-interface in the list of interfaces (at this point, either
580         parent was properly set, or a base class is being listed in the
581         interfaces section).
582
583         This flags error 1722, and resolves the crash from bug 69259.
584
585 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
586
587         * statement.cs (Using.EmitExpressionFinally): make this work right
588         for valuetypes. Fixes 69926.
589
590 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
591
592         * const.cs (Const.ChangeType): Cope with the "0 literal can be
593         converted to an enum" here, before we try to change the underlying
594         type.  This code exists, but it is a different code path than the
595         one used while encoding constants.
596
597         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
598         old bug: when converting from the null literal to a pointer,
599         return an EmptyCast, not the NullLiteral.
600
601         This fixes #69921, the recent null_type changes probably made this
602         bug more prominent.
603
604         (ImplicitReferenceConversionExists): In addition, resynchronized
605         the code here, so it matches the same code in
606         ImplicitReferenceConversionExists for the `from any class-type S
607         to any interface-type T'.
608         
609
610 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
611
612         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
613
614 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
615
616         * cs-parser.jay: Use verbosity accordingly. 
617
618 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
619
620         * expression.cs (Unary.ResolveOperator): Do not report warning;
621         AddressOf reads from variable.
622         
623         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
624
625 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
626
627         Fix bug #69462
628
629         * attribute.cs (Attributable): Removed CheckTargets.
630         (Attributes.Emit): Explicit attribute targets are tested here.
631
632         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
633         not enabled for interfaces.
634
635         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
636         (GetAssemblyName): Ouch next bug there.
637
638 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
639
640         * expression.cs: Error 275 added.
641         
642 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
643
644         Fix bug #69177 (Implemented decimal constant support)
645
646         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
647         (BinaryFold): Add DecimalConstant.
648
649         * const.cs (Define): Decimal constant 
650         (is not constant.
651         (ChangeType): Add decimal type handling.
652         (LookupConstantValue): Don't set value for decimal type but
653         emit DecimalConstantAttribute. Needed for constant optimization.
654
655         * constant.cs (ToDecimal): New method.
656         (ConvertToDecimal): New method.
657         (IntConstant): Implemented ConvertToDecimal.
658         (DecimalConstant.Emit): Emit optimized version for decimals in
659         int range.
660
661         * expression.cs (ResolveOperator): Changed order of constant
662         reduction to work correctly with native types which have
663         overloaded operators.
664         (ResolveMemberAccess): Extract constant value from attribute
665         for decimal type.
666
667         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
668
669         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
670         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
671         (ChangeType): Decimal is special.
672         (TypeToCoreType): Add decimal type.
673
674 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
675
676         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
677         decimal types.
678
679 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
680
681         * class.cs (EventField.ApplyAttributeBuilder): Fix error
682         test cs1667-5.cs.
683
684 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
685
686         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
687
688         * pending.cs (PendingImplementation): Grab only interfaces.
689
690 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
691
692         * statement.cs (ForeachHelperMethods): Add location member and
693         error 202 detection.
694
695 2004-11-19  Raja R Harinath  <rharinath@novell.com>
696
697         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
698         automatically handled by executable.make.
699         (PROGRAM): Make profile-specific.
700
701 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
702
703         * expression.cs (DoResolveBase): Fixed wrong warning for out
704         variables.
705
706 2004-11-18  Martin Baulig  <martin@ximian.com>
707
708         Merged latest changes into gmcs.  Please keep this comment in
709         here, it makes it easier for me to see what changed in MCS since
710         the last time I merged.
711
712 2004-11-17  Raja R Harinath  <rharinath@novell.com>
713
714         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
715         (TypeHandle.GetMemberCache): New.
716         (TypeHandle.TypeHandle): Update.
717         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
718         (TypeManager.LookupParentInterfacesCache):
719         Rename from LookupInterfaceCache.  Optimize slightly.
720         (TypeManager.MemberLookup_FindMembers): Update.
721         * decl.cs (MemberCache.MemberCache): Set Container to null in the
722         multi-type variant.
723         (AddCacheContents): Rename from AddHashtable.
724         * class.cs (TypeContainer.parent_container): Remove.
725         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
726         (TypeContainer.DoDefineMembers): Don't initialize it.
727         Update to name changes.
728         
729 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
730
731         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
732         that factors the code to check access modifiers on override.  
733
734         (PropertyBase): Use the code here.
735
736         Patch from Lluis S'anchez, fixes bug #69361.
737
738 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
739
740         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
741         routine that is used to report the use of a captured variable
742         whose address has been taken.
743
744         There are two checks: one when variables are being captured and
745         the other check is when the address of a variable is taken. 
746         
747         (because an anonymous methods might be resolved before *or* after
748         the address has been taken) and 
749
750         * expression.cs (Conditional.DoResolve): Remove the special
751         casing that Martin added to trueExpr and falseExpr being both
752         NullLiteral.  We get the right behavior now just by introducing
753         the null_type into the compiler. 
754
755         * convert.cs (ExplicitConversion): Change the code to use
756         null_type instead of testing `expr is NullLiteral'.
757         (ImplicitConversionStandard): use null_type too.
758         (ImplicitReferenceConversionExists): use null_type too.
759         (ImplicitReferenceConversion): use null_type too.
760
761         * literal.cs: The type of `NullLiteral' is now null_type instead
762         of object_type. 
763         (Resolve): Set the type here.
764
765         * typemanager.cs: Introduce null_type.
766
767 2004-11-17  Martin Baulig  <martin@ximian.com>
768
769         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
770         direction, like FindMembers() does.  Fixes #69546, testcase is in
771         test-315.cs.    
772
773 2004-11-16  Martin Baulig  <martin@ximian.com>
774
775         This is based on a patch from Marek Safar, see bug #69082.
776         Fixes bugs #63705 and #67130.
777
778         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
779         method; create a MemberCache for an interface type and cache the
780         result.
781
782         * decl.cs (IMemberContainer.ParentContainer): Removed.
783         (IMemberContainer.ParentCache): New property.
784         (MemberCache.SetupCacheForInterface): Removed.
785         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
786         to create a cache for an interface's "parent".
787
788         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
789         interfaces too.
790
791 2004-11-16  Martin Baulig  <martin@ximian.com>
792
793         Merged back from gmcs; these changes already went into gmcs a
794         couple of weeks ago.
795
796         * typemanager.cs
797         (TypeManager.AddUserType): Removed the `ifaces' argument.
798         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
799         `TypeExpr []'.
800         (TypeManager.AddUserInterface): Removed.
801         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
802         `TypeExpr []'.
803         (TypeManager.GetInterfaces): Likewise.
804         (TypeManager.GetExplicitInterfaces): Likewise.
805
806         * ecore.cs (TypeExpr.GetInterfaces): Removed.
807
808         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
809         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
810
811 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
812
813         * statement.cs: Avoid adding bools to a hashtable.
814
815 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
816
817         * expression.cs (Invocation.OverloadResolve): Flag error if we are
818         calling an unsafe method from a safe location.
819
820 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
821
822         Fix #69167
823         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
824
825 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
826
827         * namespace.cs (VerifyUsing): use GetPartialName instead of
828         ToString. 
829
830 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
831
832         * statement.cs (Return.Resolve): Fix regression in typo: if
833         `in_exc', we have to request a NeedReturnLabel, this was a typo
834         introduced in the anonymous method check-in.  Fixes #69131.
835
836         * Indexers were using the ShortName when defining themselves,
837         causing a regression in the compiler bootstrap when applying the
838         patch from 2004-11-02 (first part), now they use their full name
839         and the bug is gone.
840
841 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
842
843         * driver.cs: Strip the path from the names of embedded resources. Fixes
844         #68519.
845
846 2004-11-04  Raja R Harinath  <rharinath@novell.com>
847
848         Fix error message regression: cs0104-2.cs.
849         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
850         (AliasEntry.Resolve): Update.
851         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
852         'silent' flag.
853         (RootContext.LookupType): Update.
854
855 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
856
857         * cs-parser.jay: Add support for handling accessor modifiers
858         * class: Add support port accessor modifiers and error checking,
859         define PropertyMethod.Define as virtual (not abstract anymore)
860         * ecore.cs: Add checking for proeprties access with access modifiers
861         * iterators.cs: Modify Accessor constructor call based in the modified
862         constructor
863 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
864
865         * expression.cs (StringConcat): Handle being called twice,
866         as when we have a concat in a field init with more than two
867         ctors in the class
868
869 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
870
871         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
872         special case explicit implementations, we should always produce
873         the .property or .event declaration.
874         
875         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
876         since it will not return correct data if people use this
877         unresolved in the presence of using statements (see test-313).
878
879         * class.cs (MethodData.Define): If we are an explicit interface
880         implementation, set the method name to the full name of the
881         interface plus the name of the method.  
882
883         Notice that using the method.MethodName.GetFullName() does not
884         work, as it will only contain the name as declared on the source
885         file (it can be a shorthand in the presence of using statements)
886         and not the fully qualifed type name, for example:
887
888         using System;
889
890         class D : ICloneable {
891                 object ICloneable.Clone ()  {
892                 }
893         }
894
895         Would produce a method called `ICloneable.Clone' instead of
896         `System.ICloneable.Clone'.
897
898         * namespace.cs (Alias.Resolve): Use GetPartialName.
899         
900 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
901
902         * cs-parser.jay: Add error 1055 report.
903
904 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
905
906         * assign.cs (Assign.DoResolve): Only do the transform of
907         assignment into a New if the types are compatible, if not, fall
908         through and let the implicit code deal with the errors and with
909         the necessary conversions. 
910
911 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
912
913         * cs-parser.jay: Add error 1031 report.
914
915         * cs-tokenizer.cs: Add location for error 1038.
916
917 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
918
919         * cs-parser.jay: Add error 1016 report.
920
921 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
922
923         * cs-parser.jay: Add errors 1575,1611 report.
924
925 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
926
927         * cs-parser.jay: Add error 1001 report.
928
929 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
930
931         Fix #68850
932         * attribute.cs (GetMarshal): Add method argument for
933         caller identification.
934
935         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
936         agument for GetMarshal and RuntimeMissingSupport.
937
938 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
939
940         * attribute.cs (ExtractSecurityPermissionSet): Removed
941         TypeManager.code_access_permission_type.
942
943         * typemanager.cs: Removed TypeManager.code_access_permission_type.
944
945 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
946
947         * expression.cs (LocalVariableReference.DoResolveLValue): Check
948         for obsolete use of a variable here.   Fixes regression on errors
949         cs0619-25 and cs0619-26.
950
951 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
952
953         Fix #62358, implemented security attribute encoding.
954
955         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
956         Tests permitted SecurityAction for assembly or other types.
957         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
958         data from SecurityPermissionAttribute to PermisionSet class.
959
960         * class.cs (ApplyAttributeBuilder): Added special handling
961         for System.Security.Permissions.SecurityAttribute based types.
962
963         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
964         special handling for System.Security.Permissions.SecurityAttribute
965         based types.
966
967         * enum.cs (ApplyAttributeBuilder): Added special handling
968         for System.Security.Permissions.SecurityAttribute based types.
969
970         * parameter.cs (ApplyAttributeBuilder): Added special handling
971         for System.Security.Permissions.SecurityAttribute based types.
972
973         * rootcontext.cs: Next 2 core types.
974
975         * typemanager.cs (TypeManager.security_permission_attr_type):
976         Built in type for the SecurityPermission Attribute.
977         (code_access_permission_type): Build in type.
978
979 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
980
981         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
982         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
983         all of this information into
984         EmitContext.EmitCapturedVariableInstance.
985         
986         * codegen.cs (EmitCapturedVariableInstance): move here the
987         funcionality of emitting an ldarg.0 in the presence of a
988         remapping.   This centralizes the instance emit code.
989
990         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
991         then emit a load of this: it means that we have reached the
992         topmost ScopeInfo: the one that contains the pointer to the
993         instance of the class hosting the anonymous method.
994
995         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
996         captures to the topmost CaptureContext.
997
998 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
999
1000         * expression.cs (LocalVariableReference): Move the knowledge about
1001         the iterators into codegen's EmitCapturedVariableInstance.
1002
1003 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1004
1005         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1006         all code paths return a value from an anonymous method (it is the
1007         same as the 161 error, but for anonymous methods).
1008
1009 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1010
1011         The introduction of anonymous methods in the compiler changed
1012         various ways of doing things in the compiler.  The most
1013         significant one is the hard split between the resolution phase
1014         and the emission phases of the compiler.
1015
1016         For instance, routines that referenced local variables no
1017         longer can safely create temporary variables during the
1018         resolution phase: they must do so from the emission phase,
1019         since the variable might have been "captured", hence access to
1020         it can not be done with the local-variable operations from the runtime.
1021         
1022         * statement.cs 
1023
1024         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1025         is a toplevel block.
1026
1027         (ToplevelBlock): A new kind of Block, these are the blocks that
1028         are created by the parser for all toplevel method bodies.  These
1029         include methods, accessors and anonymous methods.
1030
1031         These contain some extra information not found in regular blocks:
1032         A pointer to an optional CaptureContext (for tracking captured
1033         local variables and parameters).  A pointer to the parent
1034         ToplevelBlock.
1035         
1036         (Return.Resolve): Catch missmatches when returning a value from an
1037         anonymous method (error 1662).
1038         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1039         phase.
1040
1041         (Break.Resolve): ditto.
1042
1043         (SwitchLabel): instead of defining the labels during the
1044         resolution phase, we now turned the public ILLabel and ILLabelCode
1045         labels into methods called GetILLabelCode() and GetILLabel() that
1046         only define the label during the Emit phase.
1047
1048         (GotoCase): Track the SwitchLabel instead of the computed label
1049         (its contained therein).  Emit the code by using
1050         SwitchLabel.GetILLabelCode ().
1051
1052         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1053         whether the Local has been captured or not.
1054
1055         (LocalInfo.IsCaptured): New property, used to tell whether the
1056         local has been captured.
1057         
1058         * anonymous.cs: Vastly updated to contain the anonymous method
1059         support.
1060
1061         The main classes here are: CaptureContext which tracks any
1062         captured information for a toplevel block and ScopeInfo used to
1063         track the activation frames for various local variables.   
1064
1065         Each toplevel block has an optional capture context associated
1066         with it.  When a method contains an anonymous method both the
1067         toplevel method and the anonymous method will create a capture
1068         context.   When variables or parameters are captured, they are
1069         recorded on the CaptureContext that owns them, for example:
1070
1071         void Demo () {
1072              int a;
1073              MyDelegate d = delegate {
1074                  a = 1;
1075              }
1076         }
1077
1078         Here `a' will be recorded as captured on the toplevel
1079         CapturedContext, the inner captured context will not have anything
1080         (it will only have data if local variables or parameters from it
1081         are captured in a nested anonymous method.
1082
1083         The ScopeInfo is used to track the activation frames for local
1084         variables, for example:
1085
1086         for (int i = 0; i < 10; i++)
1087                 for (int j = 0; j < 10; j++){
1088                    MyDelegate d = delegate {
1089                         call (i, j);
1090                    }
1091                 }
1092
1093         At runtime this captures a single captured variable `i', but it
1094         captures 10 different versions of the variable `j'.  The variable
1095         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1096         recorded on a child.  
1097
1098         The toplevel ScopeInfo will also track information like the `this'
1099         pointer if instance variables were referenced (this is necessary
1100         as the anonymous method lives inside a nested class in the host
1101         type of the method). 
1102
1103         (AnonymousMethod): Expanded to track the Toplevel, implement
1104         `AnonymousMethod.Compatible' to tell whether an anonymous method
1105         can be converted to a target delegate type. 
1106
1107         The routine now also produces the anonymous method content
1108
1109         (AnonymousDelegate): A helper class that derives from
1110         DelegateCreation, this is used to generate the code necessary to
1111         produce the delegate for the anonymous method that was created. 
1112
1113         * assign.cs: API adjustments for new changes in
1114         Convert.ImplicitStandardConversionExists.
1115
1116         * class.cs: Adjustments to cope with the fact that now toplevel
1117         blocks are of type `ToplevelBlock'. 
1118
1119         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1120         insteda of standard blocks.
1121
1122         Flag errors if params arguments are passed to anonymous methods.
1123
1124         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1125         `CurrentAnonymousMethod' which points to the current Anonymous
1126         Method.  The variable points to the AnonymousMethod class that
1127         holds the code being compiled.  It is set in the new EmitContext
1128         created for the anonymous method.
1129
1130         (EmitContext.Phase): Introduce a variable and an enumeration to
1131         assist in enforcing some rules about when and where we are allowed
1132         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1133         only one that enfonces this right now).
1134
1135         (EmitContext.HaveCaptureInfo): new helper method that returns
1136         whether we have a CapturedContext initialized.
1137
1138         (EmitContext.CaptureVariable): New method used to register that a
1139         LocalInfo must be flagged for capturing. 
1140
1141         (EmitContext.CapturedParameter): New method used to register that a
1142         parameters must be flagged for capturing. 
1143         
1144         (EmitContext.CapturedField): New method used to register that a
1145         field must be flagged for capturing. 
1146
1147         (EmitContext.HaveCapturedVariables,
1148         EmitContext.HaveCapturedFields): Return whether there are captured
1149         variables or fields. 
1150
1151         (EmitContext.EmitMethodHostInstance): This is used to emit the
1152         instance for the anonymous method.  The instance might be null
1153         (static methods), this (for anonymous methods that capture nothing
1154         and happen to live side-by-side with the current method body) or a
1155         more complicated expression if the method has a CaptureContext.
1156
1157         (EmitContext.EmitTopBlock): Routine that drives the emission of
1158         code: it will first resolve the top block, then emit any metadata
1159         and then emit the code.  The split is done so that we can extract
1160         any anonymous methods and flag any captured variables/parameters.
1161         
1162         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1163         during this phase, the ILGenerator should not be used as labels
1164         and local variables declared here might not be accessible to any
1165         code that is part of an anonymous method.  
1166
1167         Exceptions to this include the temporary variables that are
1168         created by some statements internally for holding temporary
1169         variables. 
1170         
1171         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1172         metadata for a cb
1173
1174         (EmitContext.TemporaryReturn): This method is typically called
1175         from the Emit phase, and its the only place where we allow the
1176         ReturnLabel to be defined other than the EmitMeta.  The reason is
1177         that otherwise we would have to duplicate a lot of logic in the
1178         Resolve phases of various methods that today is on the Emit
1179         phase. 
1180
1181         (EmitContext.NeedReturnLabel): This no longer creates the label,
1182         as the ILGenerator is not valid during the resolve phase.
1183
1184         (EmitContext.EmitThis): Extended the knowledge in this class to
1185         work in anonymous methods in addition to iterators. 
1186
1187         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1188         code is necessary on the stack to access the instance to a local
1189         variable (the variable will be accessed as a field).
1190
1191         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1192         EmitContext.EmitAddressOfParameter): Routines to support
1193         parameters (not completed at this point). 
1194         
1195         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1196         will also remove the parameters.
1197
1198         * convert.cs (Convert): Define a `ConstantEC' which points to a
1199         null.  This is just to prefity some code that uses
1200         ImplicitStandardConversion code and do not have an EmitContext
1201         handy.
1202
1203         The idea is to flag explicitly that at that point in time, it is
1204         known that the conversion will not trigger the delegate checking
1205         code in implicit conversions (which requires a valid
1206         EmitContext). 
1207
1208         Everywhere: pass new EmitContext parameter since
1209         ImplicitStandardConversionExists now requires it to check for
1210         anonymous method conversions. 
1211
1212         (Convert.ImplicitStandardConversionExists): If the type of an
1213         expression is the anonymous_method_type, and the type is a
1214         delegate, we invoke the AnonymousMethod.Compatible method to check
1215         whether an implicit conversion is possible. 
1216
1217         (Convert.ImplicitConversionStandard): Only do implicit method
1218         group conversions if the language level is not ISO_1.
1219
1220         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1221         MethodInfo for the Invoke method.  used by Delegate and
1222         AnonymousDelegate.
1223
1224         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1225         method conversions if the target type is a delegate.
1226
1227         Removed extra debugging nops.
1228
1229         (LocalVariableReference): Turn the `local_info' into a public
1230         field. 
1231
1232         Add `prepared' field, the same hack used for FieldExprs to cope
1233         with composed assignments, as Local variables do not necessarily
1234         operate purely on the stack as they used to: they can be captured
1235         fields. 
1236
1237         Add `temp' for a temporary result, like fields.
1238
1239         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1240
1241         It now copes with Local variables that are captured and emits the
1242         proper instance variable to load it from a field in the captured
1243         case. 
1244
1245         (ParameterReference.DoResolveBase): During the resolve phase,
1246         capture parameters if we are in an anonymous method.
1247
1248         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1249         anonymous method, use the EmitContext helper routines to emit the
1250         parameter reference.
1251
1252         * iterators.cs: Set RemapToProxy to true/false during the
1253         EmitDispose class.
1254
1255         * parameters.cs (GetParameterByName): New helper method. 
1256
1257         * typemanager.cs (anonymous_method_type) a new type that
1258         represents an anonyous method.  This is always an internal type,
1259         used as a fencepost to test against the anonymous-methodness of an
1260         expression. 
1261         
1262 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1263
1264         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1265         561 report.
1266         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1267
1268 2004-10-18  Martin Baulig  <martin@ximian.com>
1269
1270         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1271         `Type' directly, but call ResolveType() on it.
1272         (Catch.Resolve): Likewise.
1273         (Foreach.Resolve): Likewise.
1274
1275 2004-10-18  Martin Baulig  <martin@ximian.com>
1276
1277         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1278         `Type' directly, but call ResolveType() on it.
1279         (Probe.DoResolve): Likewise.
1280         (ArrayCreation.LookupType): Likewise.
1281         (TypeOf.DoResolve): Likewise.
1282         (SizeOf.DoResolve): Likewise.
1283
1284 2004-10-18  Martin Baulig  <martin@ximian.com>
1285
1286         * expression.cs (Invocation.BetterFunction): Put back
1287         TypeManager.TypeToCoreType().
1288
1289 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1290
1291         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1292         the ResolveType.
1293
1294 2004-10-18  Martin Baulig  <martin@ximian.com>
1295
1296         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1297         `Type' directly, but call ResolveType() on it.
1298
1299 2004-10-18  Martin Baulig  <martin@ximian.com>
1300
1301         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1302         `Type' directly, but call ResolveType() on it.
1303         (MemberBase.DoDefine): Likewise.
1304
1305         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1306         `Type' directly, but call ResolveType() on it.
1307         (ComposedCast.DoResolveAsTypeStep): Likewise.
1308
1309         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1310         `Type' directly, but call ResolveType() on it.
1311
1312 2004-10-17  John Luke  <john.luke@gmail.com>
1313
1314         * class.cs (Operator.GetSignatureForError): use CSharpName
1315
1316         * parameter.cs (Parameter.GetSignatureForError): Returns
1317         correct name even if was not defined.
1318
1319 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1320
1321         Fix #65816.
1322         * class.cs (TypeContainer.EmitContext): New property.
1323         (DefineNestedTypes): Create an emitcontext for each part.
1324         (MethodCore.DoDefineParameters): Use container's emitcontext.
1325         Pass type array to InternalParameters.
1326         (MemberBase.DoDefine): Use container's emitcontext.
1327         (FieldMember.Define): Likewise.
1328         (Event.Define): Likewise.
1329         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1330         Pass type array to InternalParameters.
1331         (SetIndexerMethod.GetParameterInfo): Likewise.
1332         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1333         * delegate.cs (Define): Pass emitcontext to
1334         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1335         array to InternalParameters.
1336         * expression.cs (ParameterReference.DoResolveBase): Pass
1337         emitcontext to GetParameterInfo.
1338         (ComposedCast.DoResolveAsTypeStep): Remove check on
1339         ec.ResolvingTypeTree.
1340         * parameter.cs (Parameter.Resolve): Change argument to
1341         EmitContext.  Use ResolveAsTypeTerminal.
1342         (Parameter.GetSignature): Change argument to EmitContext.
1343         (Parameters.ComputeSignature): Likewise.
1344         (Parameters.ComputeParameterTypes): Likewise.
1345         (Parameters.GetParameterInfo): Likewise.
1346         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1347         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1348         * support.cs (InternalParameters..ctor): Remove variant that takes
1349         a DeclSpace.
1350         * typemanager.cs (system_intptr_expr): New.
1351         (InitExpressionTypes): Initialize it.
1352
1353 2004-10-12  Chris Toshok  <toshok@ximian.com>
1354
1355         * cs-parser.jay: fix location for try_statement and catch_clause.
1356
1357 2004-10-11  Martin Baulig  <martin@ximian.com>
1358
1359         * report.cs: Don't make --fatal abort on warnings, we have
1360         -warnaserror for that.
1361
1362 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1363
1364         More DeclSpace.ResolveType avoidance.
1365         * decl.cs (MemberCore.InUnsafe): New property.
1366         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1367         with newly created EmitContext.
1368         (FieldMember.Define): Likewise.
1369         * delegate.cs (Delegate.Define): Likewise.
1370         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1371         only if normal name-lookup fails.
1372         (TypeExpr.DoResolve): Enable error-checking.
1373         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1374         (SizeOf.DoResolve): Likewise.
1375         (ComposedCast.DoResolveAsTypeStep): Likewise.
1376         (StackAlloc.DoResolve): Likewise.
1377         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1378         (Block.Unsafe): New property.
1379         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1380         (Unsafe): Set 'unsafe' flag of contained block.
1381         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1382         (Fixed.Resolve): Likewise.
1383         (Catch.Resolve): Likewise.
1384         (Using.ResolveLocalVariableDecls): Likewise.
1385         (Foreach.Resolve): Likewise.
1386
1387 2004-10-05  John Luke <john.luke@gmail.com>
1388
1389         * cs-parser.jay: add location to error CS0175
1390
1391 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1392
1393         * ecore.cs (Expression.Constantity): Add support for turning null
1394         into a constant.
1395
1396         * const.cs (Const.Define): Allow constants to be reference types
1397         as long as the value is Null.
1398
1399 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1400
1401         * namespace.cs (NamespaceEntry.Using): No matter which warning
1402         level is set, check if this namespace name has already been added.
1403
1404 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1405
1406         * expression.cs: reftype [!=]= null should always use br[true,false].
1407         # 67410
1408
1409 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1410
1411         Fix #67108
1412         * attribute.cs: Enum conversion moved to 
1413         GetAttributeArgumentExpression to be applied to the all
1414         expressions.
1415
1416 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1417
1418         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1419         * class.c (TypeContainer.DefineType): Flag error if
1420         base types aren't accessible due to access permissions.
1421         * decl.cs (DeclSpace.ResolveType): Move logic to
1422         Expression.ResolveAsTypeTerminal.
1423         (DeclSpace.ResolveTypeExpr): Thin layer over
1424         Expression.ResolveAsTypeTerminal.
1425         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1426         Refactor code into NestedAccess.  Use it.
1427         (DeclSpace.NestedAccess): New.
1428         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1429         argument to silence errors.  Check access permissions.
1430         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1431         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1432         (Cast.DoResolve): Likewise.
1433         (New.DoResolve): Likewise.
1434         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1435         (TypeOf.DoResolve): Likewise.
1436
1437         * expression.cs (Invocation.BetterConversion): Return the Type of
1438         the better conversion.  Implement section 14.4.2.3 more faithfully.
1439         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1440         section 14.4.2.2 explicit.
1441         (Invocation.OverloadResolve): Update.
1442         (Invocation): Remove is_base field.
1443         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1444         (Invocation.Emit): Likewise.
1445
1446 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1447
1448         * README: Update to changes.
1449
1450 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1451
1452         * cs-parser.jay: Reverted 642 warning fix.
1453
1454 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1455
1456         Fix bug #66615
1457         * decl.cs (FindMemberWithSameName): Indexer can have more than
1458         1 argument.
1459
1460 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1461
1462         * expression.cs (LocalVariableReference.DoResolveLValue):
1463         Do not report warning 219 for out values.
1464         (EmptyExpression.Null): New member to avoid extra allocations.
1465
1466 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1467
1468         * cs-parser.jay: Fix wrong warning 642 report.
1469
1470         * cs-tokenizer.cs (CheckNextToken): New helper;
1471         Inspect next character if is same as expected.
1472
1473 2004-09-23  Martin Baulig  <martin@ximian.com>
1474
1475         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1476         (Convert.ImplicitReferenceConversionExists): Likewise.
1477
1478 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1479
1480         * class.cs (Operator.Define): Add error 448 and 559 report.
1481
1482 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1483
1484         * class.cs (MemberBase.IsTypePermitted): New protected
1485         method for checking error CS0610.
1486
1487 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1488
1489         * class.cs (TypeContainer.HasExplicitLayout): New property
1490         Returns whether container has StructLayout attribute set Explicit.
1491         (FieldMember): New abstract class for consts and fields.
1492         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1493         (Field): Reuse FieldMember.
1494
1495         * const.cs (Const): Reuse FieldMember.
1496
1497         * rootcontext.cs: EmitConstants call moved to class.
1498
1499 2004-09-22  Martin Baulig  <martin@ximian.com>
1500
1501         Thanks to Peter Sestoft for this bug report.
1502
1503         * expression.cs (Conditional): If both the `trueExpr' and the
1504         `falseExpr' is a NullLiteral, return a NullLiteral.
1505
1506 2004-09-22  Martin Baulig  <martin@ximian.com>
1507
1508         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1509         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1510         for the "get_Current" call.
1511
1512 2004-09-22  Martin Baulig  <martin@ximian.com>
1513
1514         Marek and me just fixed one of our oldest bugs: #28562 :-)
1515
1516         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1517
1518         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1519         we're an EnumConstant, just return that.
1520         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1521         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1522         to get the value which'll actually be written into the attribute.
1523         However, we have to use GetValue() to access the attribute's value
1524         in the compiler.        
1525
1526 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1527
1528         * constant.cs (Constant.IsNegative): New abstract property
1529         IsNegative.
1530
1531         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1532         (StackAlloc.DoResolve): Reused IsNegative.
1533
1534 2004-09-21  Martin Baulig  <martin@ximian.com>
1535
1536         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1537         if we're used in an iterator, we may be called from different
1538         methods.
1539
1540         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1541         we actually have an exception block.
1542
1543 2004-09-20  John Luke <jluke@cfl.rr.com>
1544
1545         * class.cs, cs-parser.jay: Improve the error report for 1520:
1546         report the actual line where the error happens, not where the
1547         class was declared.
1548
1549         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1550         Pass location information that was available elsewhere.
1551
1552 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1553
1554         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1555         runtime to delay sign assemblies.
1556
1557 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1558
1559         * cs-parser.jay: Do not report the stack trace, this is barely
1560         used nowadays.
1561
1562 2004-08-22  John Luke  <john.luke@gmail.com>
1563  
1564         * driver.cs : check that a resource id is not already used
1565         before adding it, report CS1508 if it is, bug #63637
1566
1567 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1568
1569         * ecore.cs: Removed dead code.
1570
1571 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1572
1573         * class.cs: Do not report warning CS0067 on the interfaces.
1574
1575 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1576
1577         * cs-parser.jay: Add error 504 report.
1578
1579 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1580
1581         * rootcontext.cs: WarningLevel is 4 by default now.
1582
1583         * statement.cs (Fixed.Resolve): Do not null
1584         VariableInfo.
1585
1586 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1587
1588         Fixed bug #55780
1589         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1590         deep search when property is not virtual.
1591         (PropertyExpr.ResolveAccessors): Make one call for both
1592         accessors.
1593
1594 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1595
1596         Fixed bug #65766
1597         * statement.cs: Error 152 report constains also location.
1598
1599 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1600
1601         Fixed bug #65766
1602         * const.cs: Explicitly set constant as static.
1603
1604 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1605
1606         Fixed bug #64226
1607         * cs-parser.jay: Add error 1017 report.
1608
1609 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1610
1611         Fixed bug #59980, #64224
1612         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1613
1614         * typemanager.cs (IsSpecialMethod): Simplified
1615
1616 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1617
1618         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1619         condition with better params.
1620
1621 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1622
1623         Fixed bug #65238
1624         * attribute.cs (Resolve): Property has to have both
1625         accessors.
1626
1627 2004-09-14  Martin Baulig  <martin@ximian.com>
1628
1629         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1630
1631 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1632
1633         Fixed bug #61902
1634         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1635         called and is obsolete then this member suppress message
1636         when call is inside next [Obsolete] method or type.
1637
1638         * expression.cs: Use TestObsoleteMethodUsage member.
1639
1640 2004-09-14  Martin Baulig  <martin@ximian.com>
1641
1642         * cs-parser.jay: Sync a bit with the GMCS version.
1643
1644 2004-09-14  Martin Baulig  <martin@ximian.com>
1645
1646         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1647         (CSharpParser.yacc_verbose_flag): New public field.
1648
1649         * genericparser.cs: Removed.
1650
1651 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1652
1653         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1654
1655 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1656
1657         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1658
1659 2004-09-10  Martin Baulig  <martin@ximian.com>
1660
1661         Backported my MemberName changes from GMCS into MCS.
1662
1663         - we are now using a special `MemberName' class instead of using
1664         strings; in GMCS, the `MemberName' also contains the type
1665         arguments.
1666
1667         - changed the grammar rules a bit:
1668           * the old `member_name' is now a `namespace_or_type_name':
1669             The rule is that we use `namespace_or_type_name' everywhere
1670             where we expect either a "member name" (GetEnumerator) or a
1671             "member name" with an explicit interface name
1672             (IEnumerable.GetEnumerator).
1673             In GMCS, the explicit interface name may include type arguments
1674             (IEnumerable<T>.GetEnumerator).
1675           * we use `member_name' instead of just `IDENTIFIER' for
1676             "member names":
1677             The rule is that we use `member_name' wherever a member may
1678             have type parameters in GMCS.       
1679
1680         * decl.cs (MemberName): New public class.
1681         (MemberCore.MemberName): New public readonly field.
1682         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1683         (DeclSpace): Likewise.
1684
1685         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1686         * enum.cs (Enum.ctor): Likewise.
1687
1688         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1689         MemberName.     
1690         (AliasEntry.ctor): Take a MemberName, not an Expression.
1691         (AliasEntry.UsingAlias): Likewise.
1692
1693         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1694         (IMethodData.MemberName): Changed type from string to MemberName.
1695         (MemberBase.ExplicitInterfaceName): Likewise.
1696         (AbstractPropertyEventMethod.SetupName): Make this private.
1697         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1698         argument; compute the member name here.
1699         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1700         on the `member.MemberName' and the `prefix'.
1701
1702         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1703         not `type_name'.
1704         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1705         thus, we get a `MemberName' instead of a `string'.  These
1706         declarations may have type parameters in GMCS.
1707         (interface_method_declaration, delegate_declaration): Likewise.
1708         (class_declaration, interface_declaration): Likewise.
1709         (method_header): Use `namespace_or_type_name' instead of
1710         `member_name'.  We may be an explicit interface implementation.
1711         (property_declaration, event_declaration): Likewise.
1712         (member_name): This is now just an `IDENTIFIER', not a
1713         `namespace_or_type_name'.
1714         (type_name, interface_type): Removed.
1715         (namespace_or_type_name): Return a MemberName, not an Expression.
1716         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1717         call GetTypeExpression() on the MemberName to get an expression.
1718         (IndexerDeclaration.interface_type): Changed type from string to
1719         MemberName.
1720         (MakeName): Operate on MemberName's instead of string's.
1721
1722 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1723
1724         Fix bug #55770.
1725         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1726         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1727         lookup to avoid symbols introduced by 'using'.
1728         * rootcontext.cs (NamespaceLookup): Update.
1729
1730 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1731
1732         * class.cs (TypeContainer.DoDefineMembers): Do not call
1733         DefineDefaultConstructor for static classes.
1734
1735 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1736
1737         * attribute.cs (Attribute.Resolve): Add error 653 report.
1738
1739         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1740         report.
1741         (Method.ApplyAttributeBuilder): Add error 685 report.
1742         (Operator.Define): Add error 564 report.
1743
1744         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1745
1746         * expression.cs (Invocation.DoResolve): Add error
1747         245 and 250 report.
1748
1749         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1750         error 674 report.
1751
1752 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1753
1754         * class.cs (ConstructorInitializer.Resolve):
1755         Wrong error number (515->516).
1756
1757 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1758
1759         * class.cs (Indexer.Define): Add error 631 report.
1760
1761 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1762
1763         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1764
1765 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1766
1767         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1768
1769 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1770
1771         * cs-parser.jay: Added error CS0241 report.
1772
1773 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1774
1775         * cs-parser.jay (fixed_statement): Introduce a scope for the
1776         declaration in the 'fixed' statement.
1777
1778 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1779
1780         * cs-parser.jay: Added CS0230 error report.
1781
1782 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1783
1784         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1785
1786 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1787
1788         * expression.cs (Argument.Resolve): Added error CS0192 and
1789         CS0199 report.
1790
1791 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1792
1793         C# 2.0 #pragma warning feature
1794
1795         * cs-tokenizer.cs (PreProcessPragma): New method; 
1796         Handles #pragma directive.
1797
1798         * report.cs (WarningRegions): New class; Support
1799         class for #pragma warning directive. It tests whether
1800         warning is enabled for a given line.
1801
1802 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1803
1804         * const.cs: Add more descriptive error report, tahnks to
1805         Sebastien. 
1806
1807 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1808
1809         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1810
1811 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1812
1813         * expression.cs: Apply patch from Ben: Remove dead code from
1814         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1815         as that code just threw an exception anwyays.
1816
1817         * const.cs: Remove the call to the turnintoconstant, for details
1818         see bug: #63144
1819         
1820         * literal.cs: The type of the null-literal is the null type;  So
1821         we use a placeholder type (literal.cs:System.Null, defined here)
1822         for it.
1823
1824         * expression.cs (Conditional.DoResolve): Remove some old code that
1825         is no longer needed, conversions have been fixed.
1826
1827         (ArrayCreationExpression.DoResolve): Return false if we fail to
1828         resolve the inner expression.
1829
1830 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1831
1832         Fix test-290.cs.
1833         * cs-parser.jay (delegate_declaration): Record a delegate
1834         declaration as a type declaration.
1835         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1836
1837 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1838
1839         * parameter.cs: Do not crash if the type can not be resolved. 
1840
1841         * expression.cs: Report errors with unsafe pointers, fixes #64896
1842
1843 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1844
1845         * expression.cs: Pointer arith always needs to do a conv.i
1846         if the operand is a long. fix 65320
1847
1848 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1849
1850         Fixed cs0619-37.cs, cs0619-38.cs
1851
1852         * enum.cs (GetObsoleteAttribute): Removed.
1853
1854         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1855         on Enum member is double staged. The first is tested member
1856         and then enum.
1857
1858 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1859
1860         Fixed #56986, #63631, #65231
1861
1862         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1863         adds member to name container.
1864         (TypeContainer.AddToTypeContainer): New method, adds type to
1865         name container.
1866         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1867         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1868         AddOperator): Simplified by reusing AddToMemberContainer.
1869         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1870         instead of field.
1871         (Method.CheckForDuplications): Fixed implementation to test all
1872         possibilities.
1873         (MemberBase): Detection whether member is explicit interface
1874         implementation is now in constructor.
1875         (MemberBase.UpdateMemberName): Handles IndexerName.
1876         (Accessor): Changed to keep also location information.
1877         (AbstractPropertyEventMethod): Is derived from MemberCore.
1878         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1879         will be emited or not.
1880         (PropertyBase.AreAccessorsDuplicateImplementation):
1881         Tests whether accessors are not in collision with some method.
1882         (Operator): Is derived from MethodCore to simplify common
1883         operations.
1884
1885         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1886         must be performed.
1887         (DeclSpace.AddToContainer): Adds the member to defined_names
1888         table. It tests for duplications and enclosing name conflicts.
1889
1890         * enum.cs (EnumMember): Clean up to reuse the base structures
1891
1892 2004-09-03  Martin Baulig  <martin@ximian.com>
1893
1894         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1895         into TypeContainer, to make partial classes work again.
1896
1897 2004-09-03  Martin Baulig  <martin@ximian.com>
1898
1899         * rootcontext.cs (RootContext.V2): Removed.
1900
1901 2004-03-23  Martin Baulig  <martin@ximian.com>
1902
1903         * expression.cs (Invocation.OverloadResolve): Added `bool
1904         may_fail' argument and use it instead of the Location.IsNull() hack.
1905
1906 2004-09-03  Martin Baulig  <martin@ximian.com>
1907
1908         Merged latest changes into gmcs.  Please keep this comment in
1909         here, it makes it easier for me to see what changed in MCS since
1910         the last time I merged.
1911
1912 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1913
1914         Fix #61128.
1915         * expression.cs (BetterConversion): Don't allow either conversion 
1916         to be null.  Remove redundant implicit conversion test when 'q ==
1917         null' -- when this function is invoked, we already know that the
1918         implicit conversion exists.
1919         (BetterFunction): Assume that 'best' is non-null.  Remove
1920         redundant reimplementation of IsApplicable when 'best' is null.
1921         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1922         number of arguments.
1923         (IsAncestralType): Extract from OverloadResolve.
1924         (OverloadResolve): Make robust to the MethodGroupExpr being
1925         unsorted.  Implement all the logic of Section 14.5.5.1, and
1926         support overloading of methods from multiple applicable types.
1927         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1928
1929         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1930         (RealError, Warning): Append type of report to related symbol.
1931
1932 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1933
1934         * enum.cs: Fixed CLS-Compliance checks for enum members.
1935         Error tests cs3008-8.cs, cs3014-8.cs
1936
1937 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1938
1939         Fixed bug #62342, #63102
1940         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1941         like ImplementMethod.
1942
1943 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1944
1945         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1946         Fixed bug #65170.
1947
1948 2004-09-02  Martin Baulig  <martin@ximian.com>
1949
1950         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1951         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1952         on the MethodBase.
1953
1954 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1955
1956         C# 2.0 Static classes implemented
1957
1958         * class.cs (TypeContainer): instance_constructors,
1959         initialized_fields, initialized_static_fields,
1960         default_constructor, base_inteface_types are protected to be
1961         accessible from StaticClass.
1962         (TypeContainer.DefineDefaultConstructor): New virtual method
1963         for custom default constructor generating
1964         (StaticClass): New class to handle "Static classes" feature.
1965
1966         * cs-parser.jay: Handle static keyword on class like instance
1967         of StaticClass.
1968
1969         * driver.cs: Added "/langversion" command line switch with two
1970         options (iso-1, default).
1971
1972 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1973
1974         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1975
1976 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1977
1978         * delegate.cs: Style.
1979
1980 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1981
1982         * delegate.cs: Add seperate instance expr field for miguel.
1983
1984 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1985
1986         * PointerArithmetic (Resolve): make sure we are not doing
1987         pointer arith on void*. Also, make sure we are resolved
1988         by not setting eclass until resolve.
1989
1990         All callers: Make sure that PointerArithmetic gets resolved.
1991
1992 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1993
1994         * ArrayCreation (LookupType): If the type does not resolve 
1995         to an array, give an error.
1996
1997 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1998
1999         * statement.cs (Try.Resolve): Fixed bug #64222
2000
2001 2004-08-27  Martin Baulig  <martin@ximian.com>
2002
2003         * class.cs
2004         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2005         crash here.     
2006
2007 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2008
2009         * ecore.cs (Constantify): Get underlying type via
2010         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2011         Windows in special cases.
2012
2013 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2014
2015         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2016         for obtaining also private methods.
2017         (GetRemoveMethod): Used GetRemoveMethod (true)
2018         for obtaining also private methods.
2019
2020 2004-08-24  Martin Baulig  <martin@ximian.com>
2021
2022         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2023         MethodAttributes.HideBySig for operators.
2024
2025 2004-08-23  Martin Baulig  <martin@ximian.com>
2026
2027         Back to the old error reporting system :-)
2028
2029         * report.cs (Message): Removed.
2030         (Report.MessageData, ErrorData, WarningData): Removed.
2031         (Report.Error, Warning): Back to the old system.
2032
2033 2004-08-23  Martin Baulig  <martin@ximian.com>
2034
2035         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2036
2037         * class.cs (TypeContainer.ParentContainer): New public virtual
2038         method; replaces the explicit interface implementation.
2039         (ClassPart.ParentContainer): Override.
2040
2041 2004-08-23  Martin Baulig  <martin@ximian.com>
2042
2043         * statement.cs (Switch): Added support for constant switches; see
2044         #59428 or test-285.cs.
2045
2046 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2047
2048         Fixed bug #62740.
2049         * statement.cs (GetEnumeratorFilter): Removed useless
2050         logic because C# specs is strict. GetEnumerator must be
2051         public.
2052
2053 2004-08-22  Martin Baulig  <martin@ximian.com>
2054
2055         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2056         a switch and may break, reset the barrier.  Fixes #59867.
2057
2058 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2059
2060         CLS-Compliance speed up (~5% for corlib)
2061
2062         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2063         New method. Tests container for CLS-Compliant names
2064
2065         * class.cs (TypeContainer.VerifyClsName): New method.
2066         Checks whether container name is CLS Compliant.
2067         (Constructor): Implements IMethodData.
2068
2069         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2070         low-case table for CLS Compliance test.
2071         (MemberCache.VerifyClsParameterConflict): New method.
2072         Checks method parameters for CS3006 error.
2073
2074         * enum.cs (EnumMember): Is derived from MemberCore.
2075         (Enum.VerifyClsName): Optimized for better performance.
2076
2077 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2078
2079         * report.cs: Renamed Error_T to Error and changed all
2080         references.
2081
2082 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2083
2084         * class.cs (TypeContainer.IndexerArrayList): New inner class
2085         container for indexers.
2086         (TypeContainer.DefaultIndexerName): New constant for default
2087         indexer name. Replaced all "Item" with this constant.
2088         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2089
2090         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2091         DefaultMemberAttribute constructor.
2092
2093 2004-08-05  Martin Baulig  <martin@ximian.com>
2094
2095         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2096         Fix bug #59429.
2097
2098 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2099
2100         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2101         multi platforms problem.
2102
2103         * compiler.csproj: Included shared files.
2104
2105 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2106
2107         Fix bug 60333, 55971 in the more general way
2108         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2109         Added arg_type argument for constant conversion.
2110         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2111
2112 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2113
2114         Fix bug #59760
2115         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2116         OperatorArrayList, MethodCoreArrayList for typecontainer
2117         containers. Changed class member types to these new types.
2118         (MethodArrayList.DefineMembers): Added test for CS0659.
2119
2120 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2121
2122         * cfold.cs: Synchronize the folding with the code in expression.cs
2123         Binary.DoNumericPromotions for uint operands.
2124
2125         * attribute.cs: Revert patch from Raja, it introduced a regression
2126         while building Blam-1.2.1 (hard to isolate a test case).
2127
2128 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2129
2130         Fix for #55382
2131         * class.cs:
2132         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2133         name collision.
2134         (MethodCore.parent_method): New member. The method we're overriding
2135         if this is an override method.
2136         (MethodCore.CheckBase): Moved from Method class and made common.
2137         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2138         private.
2139         (MethodCore.CheckForDuplications): New abstract method. For custom
2140         member duplication search in a container
2141         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2142         method and its return type.
2143         (Event.conflict_symbol): New member. Symbol with same name in the
2144         parent class.
2145
2146         * decl.cs:
2147         (MemberCache.FindMemberWithSameName): New method. The method
2148         is looking for conflict with inherited symbols.
2149
2150 2004-08-04  Martin Baulig  <martin@ximian.com>
2151
2152         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2153
2154         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2155
2156 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2157
2158         * report.cs (Message): New enum for better error, warning reference in
2159         the code.
2160         (MessageData): New inner abstract class. It generally handles printing of
2161         error and warning messages.
2162         Removed unused Error, Warning, Message methods.
2163
2164 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2165
2166         Fix for cs0592-8.cs test
2167         * attribute.cs
2168         (Attributable.ValidAttributeTargets): Made public.
2169         (Attribute.ExplicitTarget): New member for explicit target value.
2170         (Attribute.CheckTargets): Now we translate explicit attribute
2171         target to Target here.
2172
2173 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2174
2175         * ecore.cs (MethodGroupExpr): new IsBase property.
2176
2177         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2178
2179         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2180         rather than an instance expr.
2181
2182         (DelegateCreation.Emit): Use the method group rather than
2183         the instance expression. Also, if you have base.Foo as the
2184         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2185
2186         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2187
2188         (NewDelegate.DoResolve): Only check for the existance of Invoke
2189         if the method is going to be needed. Use MethodGroupExpr.
2190
2191         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2192
2193         * expression.cs: For pointer arith., make sure to use
2194         the size of the type, not the size of the pointer to
2195         the type.
2196
2197 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2198
2199         Fix for #60722
2200         * class.cs (Class): Added error CS0502 test.
2201
2202 2004-08-03  John Luke  <jluke@cfl.rr.com>
2203             Raja R Harinath  <rharinath@novell.com>
2204
2205         Fix for #60997.
2206         * attribute.cs (Attribute.complained_before): New flag.
2207         (Attribute.ResolveType, Attribute.Resolve),
2208         (Attribute.DefinePInvokeMethod): Set it.
2209         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2210         
2211 2004-08-03  Martin Baulig  <martin@ximian.com>
2212
2213         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2214         use a user-defined operator; we still need to do numeric
2215         promotions in case one argument is a builtin type and the other
2216         one has an implicit conversion to that type.  Fixes #62322.
2217
2218 2004-08-02  Martin Baulig  <martin@ximian.com>
2219
2220         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2221         (LocalInfo.IsThis): New public property.
2222         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2223
2224 2004-08-01  Martin Baulig  <martin@ximian.com>
2225
2226         * class.cs (TypeContainer.GetClassBases): Don't set the default
2227         here since we may get called from GetPartialBases().
2228         (TypeContainer.DefineType): If GetClassBases() didn't return a
2229         parent, use the default one.
2230
2231 2004-07-30  Duncan Mak  <duncan@ximian.com>
2232
2233         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2234
2235 2004-07-30  Martin Baulig  <martin@ximian.com>
2236
2237         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2238
2239         * class.cs (SourceMethod): New public class, derive from the
2240         symbol writer's ISourceMethod.
2241         (Method): Use the new symbol writer API.
2242
2243         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2244         as argument and use the new symbol writer.
2245
2246         * location.cs
2247         (SourceFile): Implement the symbol writer's ISourceFile.
2248         (Location.SymbolDocument): Removed.
2249         (Location.SourceFile): New public property.
2250
2251         * symbolwriter.cs: Use the new symbol writer API.
2252
2253 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2254
2255         * Makefile (install-local): Remove.  Functionality moved to
2256         executable.make.
2257
2258 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2259
2260         * Makefile: Install mcs.exe.config file together with mcs.exe.
2261         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2262         correct runtime version.
2263         
2264 2004-07-25  Martin Baulig  <martin@ximian.com>
2265
2266         * class.cs
2267         (TypeContainer.RegisterOrder): Removed, this was unused.
2268         (TypeContainer, interface_order): Removed.
2269         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2270         TypeContainer as argument since we can also be called with a
2271         `PartialContainer' for a partial class/struct/interface.
2272         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2273         of checking whether we're an `Interface' - we could be a
2274         `PartialContainer'.
2275         (PartialContainer.Register): Override; call
2276         AddClass()/AddStruct()/AddInterface() on our parent.
2277
2278         * cs-parser.jay (interface_member_declaration): Add things to the
2279         `current_container', not the `current_class'.
2280
2281         * rootcontext.cs (RegisterOrder): The overloaded version which
2282         takes an `Interface' was unused, removed.
2283
2284         * typemanager.cs (TypeManager.LookupInterface): Return a
2285         `TypeContainer', not an `Interface'.
2286         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2287         contain a `PartialContainer' for an interface, so check it's
2288         `Kind' to figure out what it is.
2289
2290 2004-07-25  Martin Baulig  <martin@ximian.com>
2291
2292         * class.cs (Class.DefaultTypeAttributes): New public constant.
2293         (Struct.DefaultTypeAttributes): Likewise.
2294         (Interface.DefaultTypeAttributes): Likewise.
2295         (PartialContainer.TypeAttr): Override this and add the
2296         DefaultTypeAttributes.
2297
2298 2004-07-25  Martin Baulig  <martin@ximian.com>
2299
2300         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2301         we can just use the `Parent' field instead.
2302
2303 2004-07-25  Martin Baulig  <martin@ximian.com>
2304
2305         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2306
2307 2004-07-25  Martin Baulig  <martin@ximian.com>
2308
2309         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2310         our parts before defining any methods.
2311         (TypeContainer.VerifyImplements): Make this virtual.
2312         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2313         on our PartialContainer.
2314
2315 2004-07-25  Martin Baulig  <martin@ximian.com>
2316
2317         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2318
2319         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2320         argument, we can just use the `Parent' field instead.
2321
2322         * class.cs
2323         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2324         (MemberBase.DoDefine): Likewise.
2325
2326 2004-07-24  Martin Baulig  <martin@ximian.com>
2327
2328         * decl.cs (MemberCore.Parent): New public field.
2329         (DeclSpace.Parent): Moved to MemberCore.
2330
2331         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2332         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2333         parent's .ctor.
2334         (FieldBase, Field, Operator): Likewise.
2335         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2336         (EventField, Event): Likewise.
2337
2338 2004-07-23  Martin Baulig  <martin@ximian.com>
2339
2340         * class.cs (PartialContainer): New public class.
2341         (ClassPart): New public class.
2342         (TypeContainer): Added support for partial classes.
2343         (TypeContainer.GetClassBases): Splitted some of the functionality
2344         out into GetNormalBases() and GetPartialBases().
2345
2346         * cs-tokenizer.cs (Token.PARTIAL): New token.
2347         (Tokenizer.consume_identifier): Added some hacks to recognize
2348         `partial', but only if it's immediately followed by `class',
2349         `struct' or `interface'.
2350
2351         * cs-parser.jay: Added support for partial clases.
2352
2353 2004-07-23  Martin Baulig  <martin@ximian.com>
2354
2355         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2356         a `DeclSpace' and also made it readonly.
2357         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2358         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2359         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2360
2361         * cs-parser.jay: Pass the `current_class', not the
2362         `current_container' (at the moment, this is still the same thing)
2363         to a new Method, Property, Event, Indexer or Constructor.
2364
2365 2004-07-23  Martin Baulig  <martin@ximian.com>
2366
2367         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2368         and removed the `current_interface' one.
2369         (struct_declaration, class_declaration, interface_declaration):
2370         Set `current_class' to the newly created class/struct/interface;
2371         set their `Bases' and call Register() before parsing their body.
2372
2373 2004-07-23  Martin Baulig  <martin@ximian.com>
2374
2375         * class.cs (Kind): New public enum.
2376         (TypeContainer): Made this class abstract.
2377         (TypeContainer.Kind): New public readonly field.
2378         (TypeContainer.CheckDef): New public method; moved here from
2379         cs-parser.jay.
2380         (TypeContainer.Register): New public abstract method.
2381         (TypeContainer.GetPendingImplementations): New public abstract
2382         method.
2383         (TypeContainer.GetClassBases): Removed the `is_class' and
2384         `is_iface' parameters.
2385         (TypeContainer.DefineNestedTypes): Formerly known as
2386         DoDefineType().
2387         (ClassOrStruct): Made this class abstract.
2388
2389         * tree.cs (RootTypes): New public type. 
2390
2391 2004-07-20  Martin Baulig  <martin@ximian.com>
2392
2393         * tree.cs (Tree.RecordNamespace): Removed.
2394         (Tree.Namespaces): Removed.
2395
2396         * rootcontext.cs (RootContext.IsNamespace): Removed.
2397
2398         * cs-parser.jay (namespace_declaration): Just create a new
2399         NamespaceEntry here.
2400
2401 2004-07-20  Martin Baulig  <martin@ximian.com>
2402
2403         * statement.cs (ExceptionStatement): New abstract class.  This is
2404         now used as a base class for everyone who's using `finally'.
2405         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2406         our local variables before using them.
2407
2408         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2409         virtual method.  This is used by Yield.Resolve() to "steal" an
2410         outer block's `finally' clauses.
2411         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2412         argument.
2413
2414         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2415         version which takes an ExceptionStatement.  This version must be
2416         used to create exception branchings.
2417
2418         * iterator.cs
2419         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2420         (Iterator.EmitMoveNext): Added exception support; protect the
2421         block with a `fault' clause, properly handle 'finally' clauses.
2422         (Iterator.EmitDispose): Run all the `finally' clauses here.
2423
2424 2004-07-20  Martin Baulig  <martin@ximian.com>
2425
2426         * iterator.cs: This is the first of a set of changes in the
2427         iterator code.  Match the spec more closely: if we're an
2428         IEnumerable, then GetEnumerator() must be called.  The first time
2429         GetEnumerator() is called, it returns the current instance; all
2430         subsequent invocations (if any) must create a copy.
2431
2432 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2433
2434         * expression.cs: Resolve the constant expression before returning
2435         it. 
2436
2437 2004-07-19  Martin Baulig  <martin@ximian.com>
2438
2439         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2440         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2441         the return type of the new EmitContext.
2442
2443 2004-07-18  Martin Baulig  <martin@ximian.com>
2444
2445         * class.cs (Property.Define): Fix iterators.
2446
2447         * iterators.cs (Iterator.Define): Moved the
2448         `container.AddInterator (this)' call here from the .ctor; only do
2449         it if we resolved successfully.
2450
2451 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2452
2453         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2454         `true' for preprocessing directives that we parse.  The return
2455         value indicates whether we should return to regular tokenizing or
2456         not, not whether it was parsed successfully.
2457
2458         In the past if we were in: #if false ... #line #endif, we would
2459         resume parsing after `#line'.  See bug 61604.
2460
2461         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2462         building: IsEnumType should return true only for enums, not for
2463         enums or System.Enum itself.  This fixes #61593.
2464
2465         Likely what happened is that corlib was wrong: mcs depended on
2466         this bug in some places.  The bug got fixed, we had to add the
2467         hack, which caused bug 61593.
2468
2469         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2470         that was a workaround for the older conditions.
2471
2472 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2473
2474         * assign.cs: IAssignMethod has a new interface, as documented
2475         inline. All assignment code now uses this new api.
2476
2477         * ecore.cs, expression.cs: All classes which implement
2478         IAssignMethod now use the new interface.
2479
2480         * expression.cs (Invocation): add a hack to EmitCall so that
2481         IndexerAccess can be the target of a compound assignment without
2482         evaluating its arguments twice.
2483
2484         * statement.cs: Handle changes in Invocation api.
2485
2486 2004-07-16  Martin Baulig  <martin@ximian.com>
2487
2488         * iterators.cs: Rewrote this.  We're now using one single Proxy
2489         class for both the IEnumerable and the IEnumerator interface and
2490         `Iterator' derives from Class so we can use the high-level API.
2491
2492         * class.cs (TypeContainer.AddIterator): New method.
2493         (TypeContainer.DoDefineType): New protected virtual method, which
2494         is called from DefineType().
2495         (TypeContainer.DoDefineMembers): Call DefineType() and
2496         DefineMembers() on all our iterators.
2497         (TypeContainer.Emit): Call Emit() on all our iterators.
2498         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2499
2500         * codegen.cs (EmitContext.CurrentIterator): New public field.
2501
2502 2004-07-15  Martin Baulig  <martin@ximian.com>
2503
2504         * typemanager.cs
2505         (TypeManager.not_supported_exception_type): New type.   
2506
2507 2004-07-14  Martin Baulig  <martin@ximian.com>
2508
2509         * iterators.cs: Use real error numbers.
2510
2511 2004-07-14  Martin Baulig  <martin@ximian.com>
2512
2513         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2514         requires this to be a System.Collection.IEnumerable and not a
2515         class implementing that interface.
2516         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2517
2518 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2519
2520         * class.cs: Fixed previous fix, it broke some error tests.
2521
2522 2004-07-12  Martin Baulig  <martin@ximian.com>
2523
2524         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2525         Fixes #61293.
2526
2527 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2528
2529         * assign.cs (LocalTemporary): Add new argument: is_address,If
2530         `is_address' is true, then the value that we store is the address
2531         to the real value, and not the value itself.
2532         
2533         * ecore.cs (PropertyExpr): use the new local temporary
2534         stuff to allow us to handle X.Y += z (where X is a struct)
2535
2536 2004-07-08  Martin Baulig  <martin@ximian.com>
2537
2538         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2539         not always return, just like we're doing in Using.Resolve().
2540
2541 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2542
2543         * cs-parser.jay (fixed_statement): flag this as Pinned.
2544
2545 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2546
2547         * typemanager.cs (TypeManager): Removed MakePinned method, this
2548         mechanism is replaced with the .NET 2.x compatible mechanism of
2549         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2550
2551         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2552         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2553         `IsFixed' property which has a different meaning.
2554
2555 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2556
2557         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2558         visible from inside a nested class, not just the names of the
2559         immediately enclosing class.
2560         Fix for bug #60730.
2561
2562 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2563
2564         * expression.cs (BetterConversion): Remove buggy special-case
2565         handling of "implicit constant expression conversions".  At this
2566         point, we already know that the conversion is possible -- we're
2567         only checking to see which is better.
2568
2569 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2570
2571         * cs-parser.jay: Added error CS0210 test.
2572
2573 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2574
2575         * cs-parser.jay: Added error CS0134 test.
2576
2577 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2578
2579         Fix bug #52507
2580         * cs-parser.jay: Added error CS0145 test.
2581
2582 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2583
2584         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2585
2586 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2587         
2588         * expression.cs (StackAlloc.Resolve): The argument may not
2589         be a constant; deal with this case.
2590         
2591 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2592
2593         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2594         GetIndexerAttributeValue.
2595         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2596
2597         * class.cs (Indexer.Define): Added error tests for CS0415,
2598         CS0609.
2599
2600 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2601
2602         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2603         property code.
2604
2605 2004-06-23  Martin Baulig  <martin@ximian.com>
2606
2607         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2608         neither return nor throw, reset the barrier as well.  Fixes #60457.
2609
2610 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2611
2612         * class.cs : EventAttributes is now set to None by default.
2613           This fixes bug #60459.
2614
2615 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2616
2617         Fix bug #60219
2618         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2619         Don't throw exception but return null (it's sufficient now).
2620
2621 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2622
2623         * typemanager.cs (GetArgumentTypes): Faster implementation.
2624
2625 2004-06-18  Martin Baulig  <martin@ximian.com>
2626
2627         * attribute.cs (Attribute.Resolve): Check whether we're an
2628         EmptyCast which a Constant child.  Fixes #60333.
2629
2630 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2631
2632         * statement.cs (EmitCollectionForeach): Account for the fact that
2633         not all valuetypes are in areas which we can take the address of.
2634         For these variables, we store to a temporary variable. Also, make
2635         sure that we dont emit a `callvirt' on a valuetype method.
2636
2637 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2638
2639         * expression.cs (StackAlloc.DoReSolve): Added test for
2640         negative parameter (CS0247).
2641
2642 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2643
2644         Fix bug #59792
2645         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2646
2647 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2648
2649         Fix bug #59781
2650         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2651         ulong.
2652
2653 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2654
2655         Fix bug #58254 & cs1555.cs, cs1556.cs
2656         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2657
2658 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2659
2660         * cs-parser.jay: Added error CS1669 test for indexers.
2661
2662 2004-06-11  Martin Baulig  <martin@ximian.com>
2663
2664         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2665         call this twice: for params and varargs methods.
2666
2667 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2668
2669         * class.cs:
2670         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2671
2672 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2673
2674         * attribute.cs (Attribute.GetValidTargets): Made public.
2675
2676         * class.cs: 
2677         (AbstractPropertyEventMethod): New class for better code sharing.
2678         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2679         CS1667 report.
2680         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2681
2682 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2683
2684         Fix bug #59477.
2685         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2686         that the call to Resolve is part of a MemberAccess.
2687         (Expression.Resolve): Use it for SimpleName resolution.
2688         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2689         Add 'intermediate' boolean argument.
2690         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2691         error message when the SimpleName can be resolved ambiguously
2692         between an expression and a type.
2693         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2694         public.
2695         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2696         call on the left-side.
2697
2698 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2699
2700         * class.cs:
2701         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2702
2703 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2704
2705         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2706
2707 2004-06-11  Martin Baulig  <martin@ximian.com>
2708
2709         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2710         varargs methods if applicable.
2711
2712 2004-06-11  Martin Baulig  <martin@ximian.com>
2713
2714         * expression.cs (Invocation.EmitCall): Don't use
2715         `method.CallingConvention == CallingConventions.VarArgs' since the
2716         method could also have `CallingConventions.HasThis'.
2717
2718 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2719
2720         * class.cs (Event.GetSignatureForError): Implemented.
2721         Fixed crash in error test cs3010.cs
2722
2723 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2724
2725         * cs-tokenizer.cs: Change the way we track __arglist to be
2726         consistent with the other keywords.
2727
2728 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2729
2730         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2731         tomorrow.
2732
2733 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2734
2735         * codegen.cs: Check that all referenced assemblies have a strongname
2736         before strongnaming the compiled assembly. If not report error CS1577.
2737         Fix bug #56563. Patch by Jackson Harper.
2738         * typemanager.cs: Added a method to return all referenced assemblies.
2739         Fix bug #56563. Patch by Jackson Harper.
2740
2741 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2742
2743         * class.cs:
2744         (Method.ApplyAttributeBuilder): Moved and added conditional
2745         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2746
2747         * delegate.cs:
2748         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2749
2750 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2751
2752         Fixed #59640
2753         * class.cs: (EventField.attribute_targets): Changed default target.
2754
2755 2004-06-08  Martin Baulig  <martin@ximian.com>
2756
2757         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2758
2759 2004-06-08  Martin Baulig  <martin@ximian.com>
2760
2761         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2762
2763 2004-06-07  Martin Baulig  <martin@ximian.com>
2764
2765         Added support for varargs methods.
2766
2767         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2768         keyword.
2769
2770         * cs-parser.jay: Added support for `__arglist'.
2771
2772         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2773
2774         * expression.cs (Argument.AType): Added `ArgList'.
2775         (Invocation): Added support for varargs methods.
2776         (ArglistAccess): New public class.
2777         (Arglist): New public class.
2778
2779         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2780
2781         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2782         a method's top-level block if the method has varargs.
2783
2784         * support.cs (ReflectionParameters, InternalParameters): Added
2785         support for varargs methods.    
2786
2787 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2788
2789         * class.cs: Provide location in indexer error report.
2790
2791         * driver.cs: Use standard names.
2792
2793         * namespace.cs: Catch the use of using after a namespace has been
2794         declared also on using aliases.
2795
2796 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2797
2798         Bug #50820.
2799         * typemanager.cs (closure_private_ok, closure_invocation_type)
2800         (closure_qualifier_type, closure_invocation_assembly)
2801         (FilterWithClosure): Move to ...
2802         (Closure): New internal nested class.
2803         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2804         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2805         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2806         (MemberLookup, MemberLookupFailed): Use it.
2807         * expression.cs (New.DoResolve): Treat the lookup for the
2808         constructor as being qualified by the 'new'ed type.
2809         (Indexers.GetIndexersForTypeOrInterface): Update.
2810
2811 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2812
2813         * attribute.cs
2814         (GetConditionalAttributeValue): New method. Returns
2815         condition of ConditionalAttribute.
2816         (SearchMulti): New method.  Returns all attributes of type 't'.
2817         Use it when attribute is AllowMultiple = true.
2818         (IsConditionalMethodExcluded): New method.
2819
2820         * class.cs
2821         (Method.IsExcluded): Implemented. Returns true if method has conditional
2822         attribute and the conditions is not defined (method is excluded).
2823         (IMethodData): Extended interface for ConditionalAttribute support.
2824         (PropertyMethod.IsExcluded): Implemented.
2825
2826         * decl.cs
2827         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2828
2829         * expression.cs
2830         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2831         on the method.
2832
2833 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2834
2835         * expression.cs (ArrayCreationExpression): Make this just an
2836         `expression'. It can't be a statement, so the code here was
2837         dead.
2838
2839 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2840
2841         Fixed #59072
2842         * typemanager.cs (GetFullNameSignature): New method for
2843         MethodBase types.
2844
2845 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2846
2847         Fixed #56452
2848         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2849         Use this method when MethodBuilder is null.
2850         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2851         Added test for error CS0626 (MONO reports error for this situation).
2852         (IMethodData.GetSignatureForError): Extended interface.
2853
2854 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2855
2856         * attribute.cs
2857         (AttributeTester.GetObsoleteAttribute): Returns instance of
2858         ObsoleteAttribute when type is obsolete.
2859
2860         * class.cs
2861         (TypeContainer.VerifyObsoleteAttribute): Override.
2862         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2863         (MethodCode.VerifyObsoleteAttribute): Override.
2864         (MemberBase.VerifyObsoleteAttribute): Override.
2865
2866         * decl.cs
2867         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2868         and report proper error.
2869
2870         *delegate.cs
2871         Delegate.VerifyObsoleteAttribute): Override.
2872
2873         * ecore.cs
2874         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2875         and report proper error.
2876         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2877
2878         * enum.cs
2879         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2880         and enum member.
2881
2882         * expression.cs
2883         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2884         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2885         Added test for ObsoleteAttribute.
2886
2887         * statement.cs
2888         (Catch): Derived from Statement.
2889
2890 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2891  
2892         Fixed bug #59071 & cs0160.cs
2893  
2894         * statement.cs (Try.Resolve): Check here whether order of catch
2895         clauses matches their dependencies.
2896
2897 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2898
2899         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2900         caused a regression: #59343.  Referencing nested classes from an
2901         assembly stopped working.
2902
2903 2004-05-31  Martin Baulig  <martin@ximian.com>
2904
2905         MCS is now frozen for beta 2.
2906
2907 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2908
2909         * convert.cs: add a trivial cache for overload operator resolution.
2910
2911 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2912
2913         * decl.cs: If possible, use lookuptypedirect here. We can only do
2914         this if there is no `.' after the namespace. Avoids using
2915         LookupType, which does lots of slow processing.
2916         (FindNestedType) New method, does what it says :-).
2917         * namespace.cs: use LookupTypeDirect.
2918         * rootcontext.cs: use membercache, if possible.
2919         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2920
2921 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2922
2923         * expression.cs:
2924         According to the spec, 
2925
2926         In a member access of the form E.I, if E is a single identifier,
2927         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2928         field, property, localvariable, or parameter with the same type as
2929         the meaning of E as a type-name (§3.8), then both possible
2930         meanings of E are permitted.
2931
2932         We did not check that E as a simple-name had the same type as E as
2933         a type name.
2934
2935         This trivial check gives us 5-7% on bootstrap time.
2936
2937 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2938
2939         * expression.cs (Invocation.OverloadResolve): Avoid the
2940         use of hashtables and boxing here by allocating on demand.
2941
2942 2004-05-30  Martin Baulig  <martin@ximian.com>
2943
2944         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2945         we're doing a silent lookup.  Don't try to lookup nested types in
2946         TypeManager.object_type (thanks to Ben Maurer).
2947
2948 2004-05-30  Martin Baulig  <martin@ximian.com>
2949
2950         Committing a patch from Ben Maurer.
2951
2952         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2953
2954 2004-05-29  Martin Baulig  <martin@ximian.com>
2955
2956         * class.cs (IMethodData.ShouldIgnore): New method.
2957
2958         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2959         `Location' argument, we don't need it anywhere.  Use
2960         `IMethodData.ShouldIgnore ()' instead of
2961         `MethodData.GetMethodFlags ()'.
2962         (TypeManager.AddMethod): Removed.
2963         (TypeManager.AddMethod2): Renamed to AddMethod.
2964
2965 2004-05-29  Martin Baulig  <martin@ximian.com>
2966
2967         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2968
2969         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2970         converting from a class type S to an interface type and we already
2971         have an object on the stack, don't box it again.  Fixes #52578.
2972
2973 2004-05-29  Martin Baulig  <martin@ximian.com>
2974
2975         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2976         Added support for `params' parameters.  Fixes #59267.
2977
2978 2004-05-29  Martin Baulig  <martin@ximian.com>
2979
2980         * literal.cs (NullPointer): Provide a private .ctor which sets
2981         `type' to TypeManager.object_type.  Fixes #59048.
2982
2983 2004-05-29  Martin Baulig  <martin@ximian.com>
2984
2985         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2986         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2987
2988         * ecore.cs (EventExpr.instance_expr): Make the field private.
2989
2990 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2991
2992         Fixed bug #50080 & cs0214-2.cs
2993         * expression.cs (Cast.DoResolve): Check unsafe context here.
2994         
2995         * statement.cs (Resolve.DoResolve): Likewise.
2996
2997 2004-05-26  Martin Baulig  <martin@ximian.com>
2998
2999         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3000
3001         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3002         (RootContext.LookupType): Pass down the `silent' flag.
3003
3004 2004-05-25  Martin Baulig  <martin@ximian.com>
3005
3006         * expression.cs
3007         (MethodGroupExpr.IdenticalTypeName): New public property.
3008         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3009         expression actually refers to a type.
3010
3011 2004-05-25  Martin Baulig  <martin@ximian.com>
3012
3013         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3014         for #56176 and made it actually work.
3015
3016 2004-05-25  Martin Baulig  <martin@ximian.com>
3017
3018         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3019         (FieldExpr, PropertyExpr): Override and implement
3020         CacheTemporaries.  Fixes #52279.
3021
3022 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3023
3024         * location.cs: In the new compiler listing a file twice is a
3025         warning, not an error.
3026
3027 2004-05-24  Martin Baulig  <martin@ximian.com>
3028
3029         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3030         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3031
3032 2004-05-24  Martin Baulig  <martin@ximian.com>
3033
3034         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3035         walking the `using' list.  Fixes #53921.
3036
3037 2004-05-24  Martin Baulig  <martin@ximian.com>
3038
3039         * const.cs (Const.LookupConstantValue): Added support for
3040         EmptyCast's; fixes #55251.
3041
3042 2004-05-24  Martin Baulig  <martin@ximian.com>
3043
3044         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3045         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3046         which does the CS0135 check.  The reason is that we first need to
3047         check whether the variable actually exists.
3048
3049 2004-05-24  Martin Baulig  <martin@ximian.com>
3050
3051         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3052         than RootContext.LookupType() to find the explicit interface
3053         type.  Fixes #58584.
3054
3055 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3056
3057         * Makefile: Simplify.  Use executable.make.
3058         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3059
3060 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3061
3062         * decl.cs:
3063         * enum.cs:
3064         Use the invariant culture when doing String.Compare for CLS case
3065         sensitivity.
3066         
3067 2004-05-23  Martin Baulig  <martin@ximian.com>
3068
3069         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3070         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3071
3072         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3073         
3074 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3075
3076         * class.cs (MemberBase.Define): Reuse MemberType member for 
3077         resolved type. Other methods can use it too.
3078
3079 2004-05-23  Martin Baulig  <martin@ximian.com>
3080
3081         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3082         the variable also exists in the current block (otherwise, we need
3083         to report a CS0103).  Fixes #58670.
3084
3085 2004-05-23  Martin Baulig  <martin@ximian.com>
3086
3087         * flowanalysis.cs (Reachability.Reachable): Compute this
3088         on-the-fly rather than storing it as a field.
3089
3090 2004-05-23  Martin Baulig  <martin@ximian.com>
3091
3092         * flowanalysis.cs (Reachability.And): Manually compute the
3093         resulting `barrier' from the reachability.      
3094        
3095 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3096
3097         Fix bug #57835
3098         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3099         instance of ObsoleteAttribute when symbol is obsolete.
3100
3101         * class.cs
3102         (IMethodData): Extended interface for ObsoleteAttribute support.
3103
3104 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3105
3106         * attribute.cs: Fix bug #55970
3107
3108 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3109
3110         Fix bug #52705
3111         * attribute.cs
3112         (GetObsoleteAttribute): New method. Creates the instance of
3113         ObsoleteAttribute.
3114         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3115         ObsoleteAttribute when member is obsolete.
3116         (AttributeTester.Report_ObsoleteMessage): Common method for
3117         Obsolete error/warning reporting.
3118
3119         * class.cs
3120         (TypeContainer.base_classs_type): New member for storing parent type.
3121
3122         * decl.cs
3123         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3124         for this MemberCore.
3125
3126 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3127
3128         * attribute.cs, const.cs: Fix bug #58590
3129
3130 2004-05-21  Martin Baulig  <martin@ximian.com>
3131
3132         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3133         out parameters if the end of the method is unreachable.  Fixes
3134         #58098. 
3135
3136 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3137
3138         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3139         Hari was right, why extra method.
3140
3141 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3142
3143         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3144
3145 2004-05-20  Martin Baulig  <martin@ximian.com>
3146
3147         Merged this back from gmcs to keep the differences to a minumum.
3148
3149         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3150         instead of a Declspace.
3151         (Attribute.ResolveType): Likewise.
3152         (Attributes.Search): Likewise.
3153         (Attributes.Contains): Likewise.
3154         (Attributes.GetClsCompliantAttribute): Likewise.
3155
3156         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3157         argument.
3158         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3159         DeclSpace.
3160
3161 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3162
3163         Fix bug #58688 (MCS does not report error when the same attribute
3164         is assigned twice)
3165
3166         * attribute.cs (Attribute.Emit): Distinction between null and default.
3167
3168 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3169
3170         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3171         of a top-level attribute without an attribute target.
3172         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3173         Make non-static.
3174         (Attribute.Conditional_GetConditionName), 
3175         (Attribute.Obsolete_GetObsoleteMessage): Update.
3176         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3177         part of ScanForIndexerName.
3178         (Attribute.CanIgnoreInvalidAttribute): New function.
3179         (Attribute.ScanForIndexerName): Move to ...
3180         (Attributes.ScanForIndexerName): ... here.
3181         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3182         (Attributes.Search): New internal variant that can choose not to
3183         complain if types aren't resolved.  The original signature now
3184         complains.
3185         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3186         complaints suppressed.
3187         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3188         only if it not useful.
3189         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3190         top-level for attributes that are shared between the assembly
3191         and a top-level class.
3192         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3193         * class.cs: Update to reflect changes.
3194         (DefineIndexers): Fuse loops.
3195         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3196         a couple more variants of attribute names.
3197
3198 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3199
3200         Fix bug #52585 (Implemented explicit attribute declaration)
3201
3202         * attribute.cs:
3203         (Attributable.ValidAttributeTargets): New abstract method. It gets
3204         list of valid attribute targets for explicit target declaration.
3205         (Attribute.Target): It holds target itself.
3206         (AttributeSection): Removed.
3207         (Attribute.CheckTargets): New method. It checks whether attribute
3208         target is valid for the current element.
3209
3210         * class.cs:
3211         (EventProperty): New class. For events that are declared like
3212         property (with add and remove accessors).
3213         (EventField): New class. For events that are declared like field.
3214         class.cs
3215
3216         * cs-parser.jay: Implemented explicit attribute target declaration.
3217
3218         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3219         Override ValidAttributeTargets.
3220
3221         * parameter.cs:
3222         (ReturnParameter): Class for applying custom attributes on 
3223         the return type.
3224         (ParameterAtribute): New class. Class for applying custom
3225         attributes on the parameter type.
3226
3227 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3228
3229         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3230         definitions. 
3231
3232         (Method): Allow UNSAFE here.
3233
3234         * modifiers.cs: Support unsafe reporting.
3235
3236 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3237
3238         * decl.cs: Fix bug #58478.
3239
3240 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3241
3242         * statement.cs: When checking for unreachable code on an EmptyStatement,
3243         set the location. Fixes bug #58488.
3244
3245 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3246
3247         * driver.cs: Add -pkg handling.
3248
3249         From Gonzalo: UseShelLExecute=false
3250
3251 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3252
3253         * attribute.cs:
3254         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3255         for attribute.
3256         (Attribute.IsClsCompliaceRequired): Moved to base for better
3257         accesibility.
3258         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3259         when attribute is AttributeUsageAttribute.
3260         (Attribute.GetValidTargets): Simplified.
3261         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3262         attribute for this type.
3263         (Attribute.ApplyAttributes): Method renamed to Emit and make
3264         non-static.
3265         (GlobalAttributeSection): New class for special handling of global
3266         attributes (assembly, module).
3267         (AttributeSection.Emit): New method.
3268
3269         * class.cs: Implemented Attributable abstract methods.
3270         (MethodCore.LabelParameters): Moved to Parameter class.
3271         (Accessor): Is back simple class.
3272         (PropertyMethod): Implemented Attributable abstract class.
3273         (DelegateMethod): Implemented Attributable abstract class.
3274         (Event): New constructor for disctintion between normal Event
3275         and Event with accessors.
3276
3277         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3278
3279         * codegen.cs, const.cs, decl.cs, delegate.cs:
3280         (CommonAssemblyModulClass): Implemented Attributable abstract class
3281         and simplified.
3282
3283         * enum.cs: Implement IAttributeSupport interface.
3284         (EnumMember): New class for emum members. Implemented Attributable
3285         abstract class
3286
3287         * parameter.cs:
3288         (ParameterBase): Is abstract.
3289         (ReturnParameter): New class for easier [return:] attribute handling.
3290
3291         * typemanager.cs: Removed builder_to_attr.
3292
3293 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3294
3295         Fix bug #57151.
3296         * attribute.cs (Attribute.GetPositionalValue): New function.
3297         * class.cs (TypeContainer.VerifyMembers): New function.
3298         (TypeContainer.Emit): Use it.
3299         (ClassOrStruct): New base class for Class and Struct.
3300         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3301         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3302         class.
3303         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3304         then each non-static field should have a FieldOffset attribute.
3305         Otherwise, none of the fields should have a FieldOffset attribute.
3306         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3307         and FieldOffset attributes.
3308         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3309         (TypeManager.field_offset_attribute_type): New core types.
3310         (TypeManager.InitCoreTypes): Initialize them.
3311
3312 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3313
3314         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3315         Return correct type.
3316         From bug #58270.
3317
3318 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3319
3320         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3321         be implicitly converted to ulong.
3322         
3323         * expression.cs: The logic for allowing operator &, | and ^ worked
3324         was wrong, it worked before because we did not report an error in
3325         an else branch.  Fixes 57895.
3326
3327         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3328         allow volatile fields to be reference types.
3329
3330 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3331
3332         * driver.cs: Add support for /debug-
3333
3334 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3335
3336         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3337         Add a 'complain' parameter to silence errors.
3338         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3339         silently overlooked type-resolutions.
3340         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3341         to reflect changes.
3342         (Attributes.Search): New function.
3343         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3344         (Attributes.GetAttributeFullName): Remove hack.
3345         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3346         Update to reflect changes.
3347         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3348         Use Attributes.Search instead of nested loops.
3349
3350 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3351
3352         * decl.cs:
3353         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3354         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3355         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3356
3357         * report.cs: (Report.Warning): Renamed to Warning_T because of
3358         parameter collision.
3359
3360 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3361
3362         * expression.cs (MemberAccess.ResolveMemberAccess):
3363         Exit with non-zero status after Report.Error.
3364         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3365         Likewise.
3366         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3367
3368 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3369
3370         * support.cs: Don't hang when the file is empty.
3371
3372 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3373
3374         * support.cs: In SeekableStreamReader, compute the preamble size of the
3375           underlying stream. Position changes should take into account that initial
3376           count of bytes.
3377
3378 2004-05-03  Todd Berman  <tberman@sevenl.net>
3379
3380         * driver.cs: remove unused GetSysVersion function.
3381
3382 2004-05-03  Todd Berman  <tberman@sevenl.net>
3383
3384         * driver.cs: Remove the hack from saturday, as well as the hack
3385         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3386         link_paths to get that bit proper.
3387
3388 2004-05-01  Todd Berman  <tberman@sevenl.net>
3389
3390         * driver.cs: Try a LoadFrom before a Load, this checks the current
3391         path. This is currently a bug in mono that is be fixed, however, this
3392         provides a workaround for now. This will be removed when the bug
3393         is fixed.
3394
3395 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3396
3397         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3398         incomplete key pairs (#57941).
3399
3400 2004-05-01  Todd Berman  <tberman@sevenl.net>
3401
3402         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3403         from the GAC
3404
3405 2004-04-30  Jackson Harper  <jackson@ximian.com>
3406
3407         * codegen.cs: Open keys readonly.
3408         
3409 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3410
3411         * typemanager.cs: don't report cyclic struct layout when a struct
3412         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3413         which has 2 Pango.Rectangle fields.
3414
3415 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3416
3417         * expression.cs: Handle IntPtr comparisons with IL code
3418         rather than a method call.
3419
3420 2004-04-29  Martin Baulig  <martin@ximian.com>
3421
3422         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3423         the list of PropertyInfo's in class hierarchy and find the
3424         accessor.  Fixes #56013.
3425
3426 2004-04-29  Martin Baulig  <martin@ximian.com>
3427
3428         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3429
3430 2004-04-29  Martin Baulig  <martin@ximian.com>
3431
3432         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3433
3434         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3435
3436 2004-04-29  Martin Baulig  <martin@ximian.com>
3437
3438         * class.cs (ConstructorInitializer.Resolve): Check whether the
3439         parent .ctor is accessible.  Fixes #52146.
3440
3441 2004-04-29  Martin Baulig  <martin@ximian.com>
3442
3443         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3444
3445         * statement.cs (Using.EmitLocalVariableDecls): Use
3446         TypeManager.idisposable_type, not typeof (IDisposable).
3447         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3448
3449 2004-04-29  Martin Baulig  <martin@ximian.com>
3450
3451         * class.cs (Event.Define): Don't emit the field and don't set
3452         RTSpecialName and SpecialName for events on interfaces.  Fixes
3453         #57703. 
3454
3455 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3456
3457         Refactor Attribute.ApplyAttributes.
3458         * attribute.cs (Attributable): New base class for objects that can
3459         have Attributes applied on them.
3460         (Attribute): Make AttributeUsage fields public.
3461         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3462         (Attribute.IsInternalCall): New property.
3463         (Attribute.UsageAttr): Convert to a public read-only property.
3464         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3465         (Attribute.ResolveType, Attribute.Resolve)
3466         (Attribute.ScanForIndexerName): Update to reflect changes.
3467         (Attribute.CheckAttributeTarget): Re-format.
3468         (Attribute.ApplyAttributes): Refactor, to various
3469         Attributable.ApplyAttributeBuilder methods.
3470         * decl.cs (MemberCore): Make Attributable.
3471         * class.cs (Accessor): Make Attributable.
3472         (MethodData.ApplyAttributes): Use proper attribute types, not
3473         attribute names.
3474         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3475         (TypeContainer.ApplyAttributeBuilder)
3476         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3477         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3478         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3479         (Operator.ApplyAttributeBuilder): New factored-out methods.
3480         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3481         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3482         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3483         * parameter.cs (ParameterBase): New Attributable base class
3484         that can also represent Return types.
3485         (Parameter): Update to the changes.
3486
3487 2004-04-29  Jackson Harper  <jackson@ximian.com>
3488
3489         * driver.cs: Prefer the corlib system version when looking for
3490         assemblies in the GAC. This is still a hack, but its a better hack
3491         now.
3492         
3493 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3494
3495         * decl.cs, enum.cs: Improved error 3005 reporting.
3496   
3497         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3498         (related_symbols): New private member for list of symbols
3499         related to reported error/warning.
3500         
3501         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3502
3503 2004-04-29  Martin Baulig  <martin@ximian.com>
3504
3505         * ecore.cs (Expression.Constantify): If we're an enum and
3506         TypeManager.TypeToCoreType() doesn't give us another type, use
3507         t.UnderlyingSystemType.  Fixes #56178.  
3508
3509 2004-04-29  Martin Baulig  <martin@ximian.com>
3510
3511         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3512         interfaces and for each interface, only add members directly
3513         declared in that interface.  Fixes #53255.
3514
3515 2004-04-28  Martin Baulig  <martin@ximian.com>
3516
3517         * expression.cs (ConditionalLogicalOperator): Use a temporary
3518         variable for `left' to avoid that we evaluate it more than once;
3519         bug #52588.
3520
3521 2004-04-28  Martin Baulig  <martin@ximian.com>
3522
3523         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3524         `void[]' (CS1547).
3525
3526 2004-04-28  Martin Baulig  <martin@ximian.com>
3527
3528         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3529         void (CS1547).
3530
3531         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3532         whether the type is not void (CS1547).
3533
3534 2004-04-28  Martin Baulig  <martin@ximian.com>
3535
3536         * expression.cs (Unary.DoResolveLValue): Override this and report
3537         CS0131 for anything but Operator.Indirection.
3538
3539 2004-04-28  Martin Baulig  <martin@ximian.com>
3540
3541         Committing a patch from Ben Maurer; see bug #50820.
3542
3543         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3544         check for classes.
3545
3546         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3547         classes.        
3548
3549 2004-04-28  Martin Baulig  <martin@ximian.com>
3550
3551         Committing a patch from Ben Maurer; see bug #50820.
3552
3553         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3554         check for classes.
3555
3556         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3557         classes.        
3558
3559 2004-04-28  Martin Baulig  <martin@ximian.com>
3560
3561         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3562         (Block.AddLabel): Call DoLookupLabel() to only search in the
3563         current block.
3564
3565 2004-04-28  Martin Baulig  <martin@ximian.com>
3566
3567         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3568         comparing StringConstants and NullLiterals in Equality and Inequality.
3569
3570 2004-04-28  Jackson Harper  <jackson@ximian.com>
3571
3572         * driver.cs: Attempt to load referenced assemblies from the
3573         GAC. This is the quick and dirty version of this method that
3574         doesnt take into account versions and just takes the first
3575         canidate found. Will be good enough for now as we will not have more
3576         then one version installed into the GAC until I update this method.
3577
3578 2004-04-28  Martin Baulig  <martin@ximian.com>
3579
3580         * typemanager.cs (TypeManager.CheckStructCycles): New public
3581         static method to check for cycles in the struct layout.
3582
3583         * rootcontext.cs (RootContext.PopulateTypes): Call
3584         TypeManager.CheckStructCycles() for each TypeContainer.
3585         [Note: We only need to visit each type once.]
3586
3587 2004-04-28  Martin Baulig  <martin@ximian.com>
3588
3589         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3590
3591         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3592         success and added `out object value'.  Use a `bool resolved' field
3593         to check whether we've already been called rather than
3594         `ConstantValue != null' since this breaks for NullLiterals.
3595
3596 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3597
3598         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3599         setting of this flag, since the 'set' method may be non-public.
3600
3601 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3602
3603         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3604         check on current_vector.Block.
3605
3606 2004-04-27  Martin Baulig  <martin@ximian.com>
3607
3608         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3609         a field initializer.  Fixes #56459.
3610
3611 2004-04-27  Martin Baulig  <martin@ximian.com>
3612
3613         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3614         we're not attempting to use an indexer.  Fixes #52154.
3615
3616 2004-04-27  Martin Baulig  <martin@ximian.com>
3617
3618         * statement.cs (Return): Don't create a return label if we don't
3619         need it; reverts my change from January 20th.  Thanks to Ben
3620         Maurer for this.
3621
3622 2004-04-27  Martin Baulig  <martin@ximian.com>
3623
3624         According to the spec, `goto' can only leave a nested scope, but
3625         never enter it.
3626
3627         * statement.cs (Block.LookupLabel): Only lookup in the current
3628         block, don't recurse into parent or child blocks.
3629         (Block.AddLabel): Check in parent and child blocks, report
3630         CS0140/CS0158 if we find a duplicate.
3631         (Block): Removed this indexer for label lookups.
3632         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3633         this already does the error reporting for us.
3634
3635         * flowanalysis.cs
3636         (FlowBranching.UsageVector.Block): New public variable; may be null.
3637         (FlowBranching.CreateSibling): Added `Block' argument.
3638         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3639         label for the target of a `goto' and check whether we're not
3640         leaving a `finally'.
3641
3642 2004-04-27  Martin Baulig  <martin@ximian.com>
3643
3644         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3645         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3646         just for returns).
3647
3648 2004-04-27  Martin Baulig  <martin@ximian.com>
3649
3650         * statement.cs (Block.AddLabel): Also check for implicit blocks
3651         and added a CS0158 check.
3652
3653 2004-04-27  Martin Baulig  <martin@ximian.com>
3654
3655         * flowanalysis.cs (FlowBranchingLoop): New class.
3656         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3657         UsageVector's instead of an ArrayList.
3658         (FlowBranching.Label): Likewise.
3659         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3660         (FlowBranching.AddBreakVector): New method.
3661
3662 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3663
3664         * attribute.cs: Small regression fix: only convert the type if we
3665         the type is different, fixes System.Drawing build.
3666
3667 2004-04-27  Martin Baulig  <martin@ximian.com>
3668
3669         * attribute.cs (Attribute.Resolve): If we have a constant value
3670         for a named field or property, implicity convert it to the correct
3671         type.
3672
3673 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3674
3675         * statement.cs (Block.Block): Implicit blocks share
3676         'child_variable_names' fields with parent blocks.
3677         (Block.AddChildVariableNames): Remove.
3678         (Block.AddVariable): Mark variable as "used by a child block" in
3679         every surrounding block.
3680         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3681         been used in a child block, complain about violation of "Invariant
3682         meaning in blocks" rule.
3683         * cs-parser.jay (declare_local_variables): Don't use
3684         AddChildVariableNames.
3685         (foreach_statement): Don't create an implicit block: 'foreach'
3686         introduces a scope.
3687
3688 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3689
3690         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3691         converting from 0L to ulong.  Fixes 57522.
3692
3693 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3694
3695         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3696         derived class hides via 'new' keyword field from base class (test-242.cs).
3697         TODO: Handle this in the more general way.
3698         
3699         * class.cs (CheckBase): Ditto.
3700
3701 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3702
3703         * decl.cs (caching_flags): New member for storing cached values
3704         as bit flags.
3705         (MemberCore.Flags): New enum where bit flags for caching_flags
3706         are defined.
3707         (MemberCore.cls_compliance): Moved to caching_flags.
3708         (DeclSpace.Created): Moved to caching_flags.
3709
3710         * class.cs: Use caching_flags instead of DeclSpace.Created
3711         
3712 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3713
3714         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3715         if we are only a derived class, not a nested class.
3716
3717         * typemanager.cs: Same as above, but do this at the MemberLookup
3718         level (used by field and methods, properties are handled in
3719         PropertyExpr).   Allow for the qualified access if we are a nested
3720         method. 
3721
3722 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3723
3724         * class.cs: Refactoring.
3725         (IMethodData): New inteface; Holds links to parent members
3726         to avoid member duplication (reduced memory allocation).
3727         (Method): Implemented IMethodData interface.
3728         (PropertyBase): New inner classes for get/set methods.
3729         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3730         (Event): New inner classes for add/remove methods.
3731         (Event.DelegateMethod): Implemented IMethodData interface.
3732
3733         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3734         EmitContext (related to class.cs refactoring).
3735
3736 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3737
3738         * delegate.cs (Delegate.VerifyApplicability): If the number of
3739         arguments are the same as the number of parameters, first try to
3740         verify applicability ignoring  any 'params' modifier on the last
3741         parameter.
3742         Fixes #56442.
3743
3744 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3745
3746         * class.cs (TypeContainer.AddIndexer): Use
3747         'ExplicitInterfaceName' to determine if interface name was
3748         explicitly specified.  'InterfaceType' is not initialized at this time.
3749         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3750         Indexers array is already in the required order.  Initialize
3751         'IndexerName' only if there are normal indexers.
3752         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3753         (TypeContainer.Emit): Emit DefaultMember attribute only if
3754         IndexerName is initialized.
3755         Fixes #56300.
3756
3757 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3758
3759         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3760         Fixes #57007
3761
3762 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3763
3764         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3765         attributes.
3766         Fix for #56456.
3767
3768         * attribute.cs (Attribute.Resolve): Check for duplicate named
3769         attributes.
3770         Fix for #56463.
3771
3772 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3773
3774         * iterators.cs (MarkYield): track whether we are in an exception,
3775         and generate code accordingly.  Use a temporary value to store the
3776         result for our state.
3777
3778         I had ignored a bit the interaction of try/catch with iterators
3779         since their behavior was not entirely obvious, but now it is
3780         possible to verify that our behavior is the same as MS .NET 2.0
3781
3782         Fixes 54814
3783
3784 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3785
3786         * iterators.cs: Avoid creating temporaries if there is no work to
3787         do. 
3788
3789         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3790         Enumerations, use TypeManager.EnumToUnderlying and call
3791         recursively. 
3792
3793         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3794         bug #57013
3795
3796         (This.Emit): Use EmitContext.EmitThis to emit our
3797         instance variable.
3798
3799         (This.EmitAssign): Ditto.
3800
3801         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3802         codepaths, we will move all the functionality into
3803         Mono.CSharp.This 
3804
3805         (FieldExpr.EmitAssign): Ditto.
3806
3807         This fixes several hidden bugs that I uncovered while doing a code
3808         review of this today.
3809
3810         * codegen.cs (EmitThis): reworked so the semantics are more clear
3811         and also support value types "this" instances.
3812
3813         * iterators.cs: Changed so that for iterators in value types, we
3814         do not pass the value type as a parameter.  
3815
3816         Initialization of the enumerator helpers is now done in the caller
3817         instead of passing the parameters to the constructors and having
3818         the constructor set the fields.
3819
3820         The fields have now `assembly' visibility instead of private.
3821
3822 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3823
3824         * expression.cs (Argument.Resolve): Check if fields passed as ref
3825         or out are contained in a MarshalByRefObject.
3826
3827         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3828         another compiler type.
3829
3830 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3831
3832         * class.cs (Indexer.Define): use the new name checking method.
3833         Also, return false on an error.
3834         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3835         (is_identifier_[start/part]_character): make static.
3836
3837 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3838
3839         * expression.cs (Binary.ResolveOperator): Do no append strings
3840         twice: since we can be invoked more than once (array evaluation)
3841         on the same concatenation, take care of this here.  Based on a fix
3842         from Ben (bug #56454)
3843
3844 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3845
3846         * codegen.cs: Fix another case where CS1548 must be reported (when 
3847         delay-sign isn't specified and no private is available #56564). Fix
3848         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3849         error when MCS is used on the MS runtime and we need to delay-sign 
3850         (which seems unsupported by AssemblyBuilder - see #56621).
3851
3852 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3853
3854         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3855         (TypeManager.ComputeNamespaces): Faster implementation for
3856         Microsoft runtime.
3857
3858         * compiler.csproj: Updated AssemblyName to mcs.
3859
3860 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3861
3862         * rootcontext.cs: Add new types to the boot resolution.
3863
3864         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3865         MulticastDelegate is not allowed.
3866
3867         * typemanager.cs: Add new types to lookup: System.TypedReference
3868         and ArgIterator.
3869
3870         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3871         check for TypedReference or ArgIterator, they are not allowed. 
3872
3873         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3874         makes us properly catch 1510 in some conditions (see bug 56016 for
3875         details). 
3876
3877 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3878
3879         * CryptoConvert.cs: update from corlib version
3880         with endian fixes.
3881
3882 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3883
3884         * class.cs (Indexer.Define): Check indexername declaration
3885
3886 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3887
3888         * attribute.cs (IsClsCompliant): Fixed problem with handling
3889         all three states (compliant, not-compliant, undetected).
3890
3891 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3892
3893         * attribute.cs (Attribute): Location is now public.
3894         (Resolve): Store resolved arguments (pos_values) in attribute class.
3895         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3896         (GetClsCompliantAttributeValue): New method that gets
3897         CLSCompliantAttribute value.
3898         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3899         if exists else null.
3900         (AttributeTester): New class for CLS-Compliant verification routines.
3901
3902         * class.cs (Emit): Add CLS-Compliant verification.
3903         (Method.GetSignatureForError): Implemented.
3904         (Constructor.GetSignatureForError): Implemented
3905         (Constructor.HasCompliantArgs): Returns if constructor has
3906         CLS-Compliant arguments.
3907         (Constructor.Emit): Override.
3908         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3909         is needed to test only parameters.
3910         (FieldBase.GetSignatureForError): Implemented.
3911         (TypeContainer): New member for storing base interfaces.
3912         (TypeContainer.FindMembers): Search in base interfaces too.
3913
3914         * codegen.cs (GetClsComplianceAttribute): New method that gets
3915         assembly or module CLSCompliantAttribute value.
3916         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3917         for assembly.
3918         (ModuleClass.Emit): Add error 3012 test.
3919
3920         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3921
3922         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3923         state for all decl types.
3924         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3925         if CLS-Compliant tests are required.
3926         (IsClsCompliaceRequired): New method. Analyze whether code
3927         must be CLS-Compliant.
3928         (IsExposedFromAssembly): New method. Returns true when MemberCore
3929         is exposed from assembly.
3930         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3931         value or gets cached value.
3932         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3933         is explicitly marked with CLSCompliantAttribute.
3934         (IsIdentifierClsCompliant): New abstract method. This method is
3935         used to testing error 3005.
3936         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3937         for identifier and parameters CLS-Compliant testing.
3938         (VerifyClsCompliance): New method. The main virtual method for
3939         CLS-Compliant verifications.
3940         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3941         null. I don't know why is null (too many public members !).
3942         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3943         and get value of first CLSCompliantAttribute that found.
3944
3945         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3946         (VerifyClsCompliance): Override and add extra tests.
3947
3948         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3949         clscheck- disable CLS-Compliant verification event if assembly is has
3950         CLSCompliantAttribute(true).
3951
3952         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3953         ApllyAttribute is now called in emit section as in the other cases.
3954         Possible future Emit integration.
3955         (IsIdentifierClsCompliant): New override.
3956         (VerifyClsCompliance): New override.
3957         (GetEnumeratorName): Returns full enum name.
3958
3959         * parameter.cs (GetSignatureForError): Implemented.
3960
3961         * report.cs (WarningData): New struct for Warning message information.
3962         (LocationOfPreviousError): New method.
3963         (Warning): New method. Reports warning based on the warning table.
3964         (Error_T): New method. Reports error based on the error table.
3965
3966         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3967         verifications are done here.
3968
3969         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3970
3971         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3972         CLSCompliantAttribute.
3973         (all_imported_types): New member holds all imported types from other
3974         assemblies.
3975         (LoadAllImportedTypes): New method fills static table with exported types
3976         from all referenced assemblies.
3977         (Modules): New property returns all assembly modules.
3978
3979 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3980
3981         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3982         throwing a parser error.
3983
3984         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3985         which removes the hardcoded get_/set_ prefixes for properties, as
3986         IL allows for the properties to be named something else.  
3987
3988         Bug #56013
3989
3990         * expression.cs: Do not override operand before we know if it is
3991         non-null.  Fix 56207
3992
3993 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3994
3995         * typemanager.cs: support for pinned variables.
3996
3997 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3998
3999         * decl.cs, typemanager.cs: Avoid using an arraylist
4000         as a buffer if there is only one result set.
4001
4002 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4003
4004         * expression.cs: Make sure you cant call a static method
4005         with an instance expression, bug #56174.
4006
4007 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4008
4009         * class.cs (IsDuplicateImplementation): Improve error reporting to
4010         flag 663 (method only differs in parameter modifier).
4011
4012         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4013         in preprocessor directives.
4014
4015         * location.cs (LookupFile): Allow for the empty path.
4016
4017         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4018         better approach for some of that patch, but its failing with the
4019         CharSet enumeration.  For now try/catch will do.
4020
4021         * typemanager.cs: Do not crash if a struct does not have fields.
4022         Fixes 56150.
4023
4024 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4025
4026         * expression.cs: cs0213, cant fix a fixed expression.
4027         fixes 50231.
4028
4029 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4030
4031         * cs-parser.jay: detect invalid embeded statements gracefully.
4032         bug #51113.
4033
4034 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4035
4036         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4037         As a regex:
4038         s/
4039         the invocation type may not be a subclass of the tye of the item/
4040         The type of the item must be a subclass of the invocation item.
4041         /g
4042
4043         Fixes bug #50820.
4044
4045 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4046
4047         * attribute.cs: Added methods to get a string and a bool from an
4048         attribute. Required to information from AssemblyKeyFileAttribute,
4049         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4050         * codegen.cs: Modified AssemblyName creation to include support for
4051         strongnames. Catch additional exceptions to report them as CS1548.
4052         * compiler.csproj: Updated include CryptoConvert.cs.
4053         * compiler.csproj.user: Removed file - user specific configuration.
4054         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4055         Mono.Security assembly. The original class is maintained and tested in
4056         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4057         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4058         like CSC 8.0 (C# v2) supports.
4059         * Makefile: Added CryptoConvert.cs to mcs sources.
4060         * rootcontext.cs: Added new options for strongnames.
4061
4062 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4063
4064         * driver.cs: For --expect-error, report error code `2'
4065         if the program compiled with no errors, error code `1' if
4066         it compiled with an error other than the one expected.
4067
4068 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4069
4070         * compiler.csproj: Updated for Visual Studio .NET 2003.
4071         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4072         * compiler.sln: Updated for Visual Studio .NET 2003.
4073
4074 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4075
4076         * expression.cs: Fix bug #47234. We basically need to apply the
4077         rule that we prefer the conversion of null to a reference type
4078         when faced with a conversion to 'object' (csc behaviour).
4079
4080 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4081
4082         * statement.cs: Shorter form for foreach, eliminates
4083         a local variable. r=Martin.
4084
4085 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4086
4087         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4088         checks if we can use brtrue/brfalse to test for 0.
4089         * expression.cs: use the above in the test for using brtrue/brfalse.
4090         cleanup code a bit.
4091
4092 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4093
4094         * expression.cs: Rewrite string concat stuff. Benefits:
4095
4096         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4097         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4098         rather than a concat chain.
4099
4100         * typemanager.cs: Add lookups for more concat overloads.
4101
4102 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4103
4104         * expression.cs: Emit shorter il code for array init.
4105
4106         newarr
4107         dup
4108         // set 1
4109
4110         // set 2
4111
4112         newarr
4113         stloc.x
4114
4115         ldloc.x
4116         // set 1
4117
4118         ldloc.x
4119         // set 2
4120
4121 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4122
4123         * statement.cs: Before, two switch blocks would be merged if the
4124         total size of the blocks (end_item - begin_item + 1) was less than
4125         two times the combined sizes of the blocks.
4126
4127         Now, it will only merge if after the merge at least half of the
4128         slots are filled.
4129
4130         fixes 55885.
4131
4132 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4133
4134         * class.cs : csc build fix for GetMethods(). See bug #52503.
4135
4136 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4137
4138         * expression.cs: Make sure fp comparisons work with NaN.
4139         This fixes bug #54303. Mig approved this patch a long
4140         time ago, but we were not able to test b/c the runtime
4141         had a related bug.
4142
4143 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4144
4145         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4146
4147 2004-03-19  Martin Baulig  <martin@ximian.com>
4148
4149         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4150         error here and not in our caller.
4151
4152 2004-03-19  Martin Baulig  <martin@ximian.com>
4153
4154         * interface.cs: Completely killed this file.
4155         (Interface): We're now a TypeContainer and live in class.cs.
4156
4157         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4158         argument; we're now also called for interfaces.
4159         (TypeContainer.DefineMembers): Allow this method being called
4160         multiple times.
4161         (TypeContainer.GetMethods): New public method; formerly known as
4162         Interface.GetMethod().  This is used by PendingImplementation.
4163         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4164         it's now private and non-static.
4165         (Interface): Moved this here; it's now implemented similar to
4166         Class and Struct.
4167         (Method, Property, Event, Indexer): Added `bool is_interface'
4168         argument to their .ctor's.
4169         (MemberBase.IsInterface): New public field.
4170
4171         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4172         instances instead of InterfaceMethod, InterfaceProperty, etc.
4173         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4174         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4175
4176 2004-03-19  Martin Baulig  <martin@ximian.com>
4177
4178         * class.cs (MethodCore.IsDuplicateImplementation): New private
4179         method which does the CS0111 checking.
4180         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4181         Use IsDuplicateImplementation().
4182
4183 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4184
4185         * decl.cs (FindMemberToOverride): New method to find the correct
4186         method or property to override in the base class.
4187         * class.cs
4188             - Make Method/Property use the above method to find the
4189               version in the base class.
4190             - Remove the InheritableMemberSignatureCompare as it is now
4191               dead code.
4192
4193         This patch makes large code bases much faster to compile, as it is
4194         O(n) rather than O(n^2) to do this validation.
4195
4196         Also, it fixes bug 52458 which is that nested classes are not
4197         taken into account when finding the base class member.
4198
4199         Reviewed/Approved by Martin.
4200
4201 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4202
4203         * interface.cs: In all interface classes removed redundant
4204         member initialization.
4205
4206 2004-03-16  Martin Baulig  <martin@ximian.com>
4207
4208         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4209
4210 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4211
4212         * decl.cs (DefineTypeAndParents): New helper method to define a
4213         type's containers before the type itself is defined;  This is a
4214         bug exposed by the recent changes to Windows.Forms when an
4215         implemented interface was defined inside a class that had not been
4216         built yet.   
4217
4218         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4219
4220         (Check): Loop correctly to report errors modifiers
4221         (UNSAFE was not in the loop, since it was the same as TOP).
4222
4223         * interface.cs: Every interface member now takes a ModFlags,
4224         instead of a "is_new" bool, which we set on the base MemberCore. 
4225
4226         Every place where we called "UnsafeOk" in the interface, now we
4227         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4228         the unsafe settings from the member declaration instead of the
4229         container interface. 
4230
4231         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4232
4233         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4234         `set_indexer_name' to the pending bits (one per type).
4235
4236         We fixed a bug today that was picking the wrong method to
4237         override, since for properties the existing InterfaceMethod code
4238         basically ignored the method name.  Now we make sure that the
4239         method name is one of the valid indexer names.
4240
4241 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4242  
4243         * support.cs (SeekableStreamReader): Keep track of stream byte
4244         positions and don't mix them with character offsets to the buffer.
4245
4246         Patch from Gustavo Giráldez
4247
4248 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4249
4250         * interface.cs (InterfaceSetGetBase): Removed double member
4251         initialization, base class does it as well.
4252
4253 2004-03-13  Martin Baulig  <martin@ximian.com>
4254
4255         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4256         when compiling corlib.
4257
4258 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4259
4260         * convert.cs (ExplicitConversion): We were reporting an error on
4261         certain conversions (object_type source to a value type, when the
4262         expression was `null') before we had a chance to pass it through
4263         the user defined conversions.
4264
4265         * driver.cs: Replace / and \ in resource specifications to dots.
4266         Fixes 50752
4267
4268         * class.cs: Add check for duplicate operators.  Fixes 52477
4269
4270 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4271
4272         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4273         that are in the middle of the statements, not only at the end.
4274         Fixes #54987
4275
4276         * class.cs (TypeContainer.AddField): No longer set the
4277         `HaveStaticConstructor' flag, now we call it
4278         `UserDefineStaticConstructor' to diferentiate the slightly
4279         semantic difference.
4280
4281         The situation is that we were not adding BeforeFieldInit (from
4282         Modifiers.TypeAttr) to classes that could have it.
4283         BeforeFieldInit should be set to classes that have no static
4284         constructor. 
4285
4286         See:
4287
4288         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4289
4290         And most importantly Zoltan's comment:
4291
4292         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4293
4294         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4295          before its static fields are used', i.e. initialization does not need
4296          to be triggered by the first access to the type. Setting this flag
4297          helps the JIT to compile better code, since it can run the static
4298          constructor at JIT time, and does not need to generate code to call it
4299          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4300          this flag for lots of classes like String. 
4301          
4302          csc sets this flag if the type does not have an explicit static 
4303          constructor. The reasoning seems to be that if there are only static
4304          initalizers for a type, and no static constructor, then the programmer
4305          does not care when this initialization happens, so beforefieldinit
4306          can be used.
4307          
4308          This bug prevents the AOT compiler from being usable, since it 
4309          generates so many calls to mono_runtime_class_init that the AOT code
4310          is much slower than the JITted code. The JITted code is faster, 
4311          because it does not generate these calls if the vtable is type is
4312          already initialized, which is true in the majority of cases. But the
4313          AOT compiler can't do this."
4314
4315 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4316
4317         * class.cs (MethodData.Emit): Refactor the code so symbolic
4318         information is generated for destructors;  For some reasons we
4319         were taking a code path that did not generate symbolic information
4320         before. 
4321
4322 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4323
4324         * class.cs: Create a Constructor.CheckBase method that
4325         takes care of all validation type code. The method
4326         contains some code that was moved from Define.
4327
4328         It also includes new code that checks for duplicate ctors.
4329         This fixes bug #55148.
4330
4331 2004-03-09  Joshua Tauberer <tauberer@for.net>
4332
4333         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4334         a { ... }-style array creation invokes EmitStaticInitializers
4335         which is not good for reference-type arrays.  String, decimal
4336         and now null constants (NullCast) are not counted toward
4337         static initializers.
4338
4339 2004-03-05  Martin Baulig  <martin@ximian.com>
4340
4341         * location.cs (SourceFile.HasLineDirective): New public field;
4342         specifies whether the file contains or is referenced by a "#line"
4343         directive.
4344         (Location.DefineSymbolDocuments): Ignore source files which
4345         either contain or are referenced by a "#line" directive.        
4346
4347 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4348
4349         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4350         direct access to our parent, so check the method inline there.
4351
4352 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4353
4354         * expression.cs (Invocation.EmitCall): Miguel's last commit
4355         caused a regression. If you had:
4356
4357             T t = null;
4358             t.Foo ();
4359
4360         In Foo the implict this would be null.
4361
4362 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4363
4364         * expression.cs (Invocation.EmitCall): If the method is not
4365         virtual, do not emit a CallVirt to it, use Call.
4366
4367         * typemanager.cs (GetFullNameSignature): Improve the method to
4368         cope with ".ctor" and replace it with the type name.
4369
4370         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4371         as an argument the ConstructorBuilder where it is being defined,
4372         to catch the recursive constructor invocations.
4373
4374 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4375
4376         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4377         routines to check if a type is an enumerable/enumerator allow
4378         classes that implement the IEnumerable or IEnumerator interfaces.
4379
4380         * class.cs (Property, Operator): Implement IIteratorContainer, and
4381         implement SetYields.
4382
4383         (Property.Define): Do the block swapping for get_methods in the
4384         context of iterators.   We need to check if Properties also
4385         include indexers or not.
4386
4387         (Operator): Assign the Block before invoking the
4388         OperatorMethod.Define, so we can trigger the Iterator code
4389         replacement. 
4390
4391         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4392         Property and Operator classes are not created when we parse the
4393         declarator but until we have the block completed, so we use a
4394         singleton SimpleIteratorContainer.Simple to flag whether the
4395         SetYields has been invoked.
4396
4397         We propagate this setting then to the Property or the Operator to
4398         allow the `yield' to function.
4399
4400 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4401
4402         * codegen.cs: Implemented attribute support for modules.
4403         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4404         Assembly/Module functionality.
4405
4406         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4407         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4408         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4409
4410 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4411
4412         * interface.cs (FindMembers): The operation is performed on all base
4413         interfaces and not only on the first. It is required for future CLS Compliance patch.
4414
4415 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4416
4417         * statement.cs, codegen.cs:
4418         This patch deals with patterns such as:
4419
4420         public class List : IEnumerable {
4421
4422                 public MyEnumerator GetEnumerator () {
4423                         return new MyEnumerator(this);
4424                 }
4425
4426                 IEnumerator IEnumerable.GetEnumerator () {
4427                         ...
4428                 }
4429                 
4430                 public struct MyEnumerator : IEnumerator {
4431                         ...
4432                 }
4433         }
4434
4435         Before, there were a few things we did wrong:
4436         1) we would emit callvirt on a struct, which is illegal
4437         2) we emited ldarg when we needed to emit ldarga
4438         3) we would mistakenly call the interface methods on an enumerator
4439         type that derived from IEnumerator and was in another assembly. For example:
4440
4441         public class MyEnumerator : IEnumerator
4442
4443         Would have the interface methods called, even if there were public impls of the
4444         method. In a struct, this lead to invalid IL code.
4445
4446 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4447
4448         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4449           renamed to Emit.
4450
4451         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4452
4453 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4454
4455         * cs-parser.jay: Fix small regression: we were not testing V2
4456         compiler features correctly.
4457
4458         * interface.cs: If the emit context is null, then create one
4459
4460 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4461
4462         * decl.cs (GetSignatureForError): New virtual method to get full name
4463           for error messages.
4464
4465         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4466           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4467
4468         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4469           Duplicated members and code in these classes has been removed.
4470           Better encapsulation in these classes.
4471
4472 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4473
4474         * assign.cs (Assign.DoResolve): When dealing with compound
4475         assignments, there is a new rule in ECMA C# 2.4 (might have been
4476         there before, but it is documented here) that states that in:
4477
4478         a op= b;
4479
4480         If b is of type int, and the `op' is a shift-operator, then the
4481         above is evaluated as:
4482
4483         a = (int) a op b 
4484
4485         * expression.cs (Binary.ResolveOperator): Instead of testing for
4486         int/uint/long/ulong, try to implicitly convert to any of those
4487         types and use that in pointer arithmetic.
4488
4489         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4490         method to print information for from the type, not from the
4491         null-method we were given.
4492
4493 2004-02-01  Duncan Mak  <duncan@ximian.com>
4494
4495         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4496         parsing for cmd, fixes bug #53694.
4497
4498 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4499
4500         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4501         in the member name duplication tests. Property and operator name duplication
4502         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4503
4504 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4505
4506         * interface.cs (PopulateMethod): Fixed crash when interface method
4507         returns not existing type (error test cs0246-3.cs).
4508
4509 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4510
4511         * cs-parser.jay (interface_accessors): Re-write actions to also
4512         store attributes attached to get and set methods. Fix spelling
4513         while at it.
4514
4515         (inteface_property_declaration): Modify accordingly.
4516
4517         (InterfaceAccessorInfo): New helper class to store information to pass
4518         around between rules that use interface_accessors.
4519
4520         * interface.cs (Emit): Apply attributes on the get and set
4521         accessors of properties and indexers too.
4522
4523         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4524         right MethodBuilder when applying attributes to the get and set accessors.
4525
4526 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4527
4528         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4529
4530 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4531
4532         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4533
4534 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4535
4536         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4537         changes that treat `yield' specially when present before `break'
4538         or `return' tokens.
4539
4540         * cs-tokenizer.cs: yield is no longer a keyword.
4541
4542 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4543
4544         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4545         setting for default constructors.
4546         For default constructors are almost every time set wrong Modifier. The
4547         generated IL code has been alright. But inside mcs this values was
4548         wrong and this was reason why several of my CLS Compliance tests
4549         failed.
4550
4551 2004-01-22  Martin Baulig  <martin@ximian.com>
4552
4553         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4554         not a QualifiedIdentifier.  This is what `type_name_expression'
4555         was previously doing.
4556         (type_name_expression): Removed; the code is now in
4557         `namespace_or_type_name'.
4558         (qualified_identifier): Removed, use `namespace_or_type_name'
4559         instead.
4560         (QualifiedIdentifier): Removed this class.      
4561
4562 2004-01-22  Martin Baulig  <martin@ximian.com>
4563
4564         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4565         not a string as alias name.
4566
4567 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4568
4569         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4570         #52730 bug, and instead compute correctly the need to use a
4571         temporary variable when requesting an address based on the
4572         static/instace modified of the field and the constructor.
4573  
4574 2004-01-21  Martin Baulig  <martin@ximian.com>
4575
4576         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4577         class and namespace before looking up aliases.  Fixes #52517.
4578
4579 2004-01-21  Martin Baulig  <martin@ximian.com>
4580
4581         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4582         assinged in a 'try'; fixes exception4.cs.
4583
4584 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4585         * class.cs : Implemented parameter-less constructor for TypeContainer
4586
4587         * decl.cs: Attributes are now stored here. New property OptAttributes
4588
4589         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4590
4591         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4592
4593 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4594
4595         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4596           (CSharpSignature): New method for indexer and property signature.
4597
4598 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4599
4600         * pending.cs (IsVirtualFilter): Faster implementation.
4601
4602 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4603
4604         * typemanager.cs: Avoid inclusion of same assembly more than once.
4605
4606 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4607
4608         * cs-parser.jay: Fixed problem where the last assembly attribute
4609           has been applied also to following declaration (class, struct, etc.)
4610           
4611 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4612
4613         * class.cs: Added error CS0538, CS0539 reporting.
4614         Fixed crash on Microsoft runtime when field type is void.
4615
4616         * cs-parser.jay: Added error CS0537 reporting.
4617
4618         * pending.cs: Added error CS0535 reporting.
4619         Improved error report for errors CS0536, CS0534.
4620
4621 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4622
4623         Merge a few bits from the Anonymous Method MCS tree.
4624
4625         * statement.cs (ToplevelBlock): New class for toplevel methods,
4626         will hold anonymous methods, lifted variables.
4627
4628         * cs-parser.jay: Create toplevel blocks for delegates and for
4629         regular blocks of code. 
4630
4631 2004-01-20  Martin Baulig  <martin@ximian.com>
4632
4633         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4634         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4635         and `NeedExplicitReturn'; added `IsLastStatement'.
4636         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4637         have a `ReturnLabel' or we're not unreachable.
4638
4639         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4640         child's reachability; don't just override ours with it.  Fixes
4641         #58058 (lluis's example).
4642         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4643         InFinally(), InLoop(), InSwitch() and
4644         BreakCrossesTryCatchBoundary() methods.
4645
4646         * statement.cs (Return): Do all error checking in Resolve().
4647         Unless we are the last statement in a top-level block, always
4648         create a return label and jump to it.
4649         (Break, Continue): Do all error checking in Resolve(); also make
4650         sure we aren't leaving a `finally'.
4651         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4652         statement in a top-level block.
4653         (Block.Flags): Added `IsDestructor'.
4654         (Block.IsDestructor): New public property.
4655
4656 2004-01-20  Martin Baulig  <martin@ximian.com>
4657
4658         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4659
4660 2004-01-20  Martin Baulig  <martin@ximian.com>
4661
4662         * statement.cs (Statement.ResolveUnreachable): New public method.
4663         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4664         (Block.Resolve): Resolve unreachable statements.
4665
4666 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4667
4668         * expression.cs: We need to fix the case where we do
4669         not have a temp variable here.
4670
4671         * assign.cs: Only expression compound assignments need
4672         temporary variables.
4673
4674 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4675
4676         * flowanalysis.cs: Reduce memory allocation in a few ways:
4677           - A block with no variables should not allocate a bit
4678             vector for itself.
4679           - A method with no out parameters does not need any tracking
4680             for assignment of the parameters, so we need not allocate
4681             any data for it.
4682           - The arrays:
4683                 public readonly Type[] VariableTypes;
4684                 public readonly string[] VariableNames;
4685             Are redundant. The data is already stored in the variable
4686             map, so we need not allocate another array for it.
4687           - We need to add alot of checks for if (params | locals) == null
4688             due to the first two changes.
4689
4690 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4691
4692         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4693         implement IMemoryLocation, we store a copy on a local variable and
4694         take the address of it.  Patch from Benjamin Jemlich
4695
4696         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4697         to use a special "type_name_expression" rule which reduces the
4698         number of "QualifiedIdentifier" classes created, and instead
4699         directly creates MemberAccess expressions.
4700
4701 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4702
4703         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4704         that fixes #52853.  Null literal assignment to ValueType
4705
4706         * class.cs (MethodData.Emit): Instead of checking the name of the
4707         method to determine if its a destructor, create a new derived
4708         class from Method called Destructor, and test for that.  
4709
4710         * cs-parser.jay: Create a Destructor object instead of a Method.  
4711
4712         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4713
4714         Fixes: 52933
4715
4716 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4717
4718         * expression.cs (Binary.ResolveOperator): Perform an implicit
4719         conversion from MethodGroups to their delegate types on the
4720         Addition operation.
4721
4722         * delegate.cs: Introduce a new class DelegateCreation that is the
4723         base class for `NewDelegate' and `ImplicitDelegateCreation',
4724         factor some code in here.
4725
4726         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4727         conversion from MethodGroups to compatible delegate types. 
4728
4729         * ecore.cs (Expression.Resolve): Do not flag error 654
4730         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4731         we allow conversions from MethodGroups to delegate types now.
4732
4733         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4734         assignments in v2 either.
4735
4736 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4737
4738         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4739         static read-only fields in ctors.
4740
4741         Applied patch from Benjamin Jemlich 
4742
4743         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4744
4745 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4746
4747         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4748         here to return true, as they can be used like this:
4749
4750                 (XXX) int.MEMBER ()
4751
4752         Fixed 49836 and all the other dups
4753
4754 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4755
4756         * driver.cs: Implement /win32res and /win32icon.
4757
4758 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4759
4760         * cs-parser.jay: Add a rule to improve error handling for the
4761         common mistake of placing modifiers after the type.
4762
4763 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4764
4765         * cs-parser.jay (interface_event_declaration): Catch
4766         initialization of events on interfaces, and report cs0068
4767
4768         * cs-parser.jay (interface_event_declaration): Catch
4769         initialization of events. 
4770
4771         * ecore.cs: Better report missing constructors.
4772
4773         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4774         the error reporting done in the wrong place.  Fix.
4775
4776         * expression.cs (Binary.ResolveOperator): Catch the 
4777         operator + (E x, E y) error earlier, and later allow for implicit
4778         conversions in operator +/- (E e, U x) from U to the underlying
4779         type of E.
4780
4781         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4782         52596, if the container class is abstract, the default constructor
4783         is protected otherwise its public (before, we were always public).
4784
4785         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4786         fixed statement.
4787
4788         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4789         Jemlich that fixes bug #52597, MCS was generating invalid code for
4790         idisposable structs.   Thanks to Ben for following up with this
4791         bug as well.
4792
4793 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4794
4795         * driver.cs: Allow assemblies without code to be generated, fixes
4796         52230.
4797
4798 2004-01-07  Nick Drochak <ndrochak@gol.com>
4799
4800         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4801
4802 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4803
4804         * cs-parser.jay: Add rules to improve error reporting if fields or
4805         methods are declared at the namespace level (error 116)
4806
4807         * Add rules to catch event add/remove
4808
4809 2004-01-04  David Sheldon <dave-mono@earth.li>
4810
4811   * expression.cs: Added matching ")" to error message for 
4812   CS0077
4813
4814 2004-01-03 Todd Berman <tberman@gentoo.org>
4815
4816         * ecore.cs, attribute.cs:
4817         Applying fix from #52429.
4818
4819 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4820
4821         * ecore.cs, expression.cs, statement.cs:
4822         Total rewrite of how we handle branching. We
4823         now handle complex boolean expressions with fewer
4824         jumps. As well if (x == 0) no longer emits a ceq.
4825
4826         if (x is Foo) is much faster now, because we generate
4827         better code.
4828
4829         Overall, we get a pretty big improvement on our benchmark
4830         tests. The code we generate is smaller and more readable.
4831
4832         I did a full two-stage bootstrap. The patch was reviewed
4833         by Martin and Miguel.
4834
4835 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4836
4837         * cs-parser.jay: Make primary_expression not take a QI.
4838         we dont need this because the member_access rule covers
4839         us here. So we replace the rule with just IDENTIFIER.
4840
4841         This has two good effects. First, we remove a s/r conflict.
4842         Second, we allocate many fewer QualifiedIdentifier objects.
4843
4844 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4845
4846         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4847         set the correct information via SRE. This prevents
4848         hanging on the MS runtime. Fixes #29374.
4849
4850 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4851
4852         * convert.cs: correctly handle conversions to value types
4853         from Enum and ValueType as unboxing conversions.
4854
4855         Fixes bug #52569. Patch by Benjamin Jemlich.
4856
4857 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4858
4859         * expression.cs (BetterConversion): Prefer int -> uint
4860         over int -> ulong (csc's behaviour). This fixed bug #52046.
4861
4862 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4863
4864         * decl.cs (MemberCache.FindMembers): now returns a
4865         MemberInfo [].
4866
4867         * typemanager.cs: In general, go with with ^^.
4868         (CopyNewMethods): take an IList.
4869         (RealMemberLookup): Only allocate an arraylist
4870         if we copy from two sets of methods.
4871
4872         This change basically does two things:
4873         1) Fewer array lists allocated due to CopyNewMethods.
4874         2) the explicit cast in MemberList costed ALOT.
4875
4876 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4877
4878         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4879         a hashtable to avoid needless string allocations when an identifier is
4880         used more than once (the common case).
4881
4882 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4883
4884         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4885         is broken, it will not return anything. So, we
4886         have to use the information we have in mcs to
4887         do the task.
4888
4889         * typemanager.cs: Add a cache for GetInterfaces,
4890         since this will now be used more often (due to ^^)
4891
4892         (GetExplicitInterfaces) New method that gets the
4893         declared, not effective, interfaces on a type
4894         builder (eg, if you have interface IFoo, interface
4895         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4896         { IBar }.
4897
4898         This patch makes MCS able to bootstrap itself on
4899         Windows again.
4900
4901 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4902
4903         * expression.cs: Remove the Nop's that Miguel put
4904         in by mistake.
4905
4906 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4907
4908         * report.cs, codegen.cs: Give the real stack trace to
4909         the error when an exception is thrown.
4910
4911 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4912
4913         * decl.cs: only allocate hashtables for ifaces if 
4914         it is an iface!
4915
4916 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4917
4918         * expression.cs: fix the error from cs0121-2.cs
4919         (a parent interface has two child interfaces that
4920         have a function with the same name and 0 params
4921         and the function is called through the parent).
4922
4923 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4924
4925         * class.cs, rootcontext.cs, typmanager.cs: do not
4926         leak pointers.
4927
4928 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4929
4930         * codegen.cs: remove stack for the ec flow branching.
4931         It is already a linked list, so no need.
4932
4933 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4934
4935         * Makefile: Allow custom profiler here.
4936
4937 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4938
4939         * typemanager.cs (LookupType):
4940           - Use a static char [], because split takes
4941             a param array for args, so it was allocating
4942             every time.
4943           - Do not store true in a hashtable, it boxes.
4944
4945 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4946
4947         * flowanalysis.cs: bytify common enums.
4948
4949 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4950
4951         * modifiers.cs: Add a new set of flags for the
4952         flags allowed on explicit interface impls.
4953         * cs-parser.jay: catch the use of modifiers in
4954         interfaces correctly.
4955         * class.cs: catch private void IFoo.Blah ().
4956
4957         All related to bug #50572.
4958
4959 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4960
4961         * decl.cs: Rewrite the consistant accessability checking.
4962         Accessability is not linear, it must be implemented in
4963         a tableish way. Fixes #49704.
4964
4965 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4966
4967         * expression.cs: Handle negation in a checked context.
4968         We must use subtraction from zero. Fixes #38674.
4969
4970 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4971
4972         * class.cs: Ignore static void main in DLLs.
4973         * rootcontext.cs: Handle the target type here,
4974         since we are have to access it from class.cs
4975         * driver.cs: account for the above.
4976
4977 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4978
4979         * report.cs: Give line numbers and files if available.
4980
4981 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4982
4983         * driver.cs: Implement /addmodule.
4984
4985         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4986         ModuleBuilders.
4987
4988 2003-12-20  Martin Baulig  <martin@ximian.com>
4989
4990         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4991         (FieldBase.IsAssigned): Removed this field.
4992         (FieldBase.SetAssigned): New public method.
4993         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4994
4995 2003-12-20  Martin Baulig  <martin@ximian.com>
4996
4997         * expression.cs (LocalVariableReference.DoResolve): Don't set
4998         `vi.Used' if we're called from DoResolveLValue().
4999
5000         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5001         returns the usage vector it just merged into the current one -
5002         pass this one to UsageWarning().
5003         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5004         of the `EmitContext', don't call this recursively on our children.
5005
5006 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5007
5008         * driver.cs: Implement /target:module.
5009
5010 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5011
5012         * support.cs (CharArrayHashtable): New helper class.
5013
5014         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5015         char arrays, not strings, so we can avoid creating a string in
5016         consume_identifier if the identifier is a keyword.
5017
5018 2003-12-16  Martin Baulig  <martin@ximian.com>
5019
5020         * statement.cs (LocalInfo.Assigned): Removed this property.
5021         (LocalInfo.Flags): Removed `Assigned'.
5022         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5023         and uses flow analysis.
5024         (Block.UsageWarning): Made this method private.
5025         (Block.Resolve): Call UsageWarning() if appropriate.
5026
5027         * expression.cs (LocalVariableReference.DoResolve): Always set
5028         LocalInfo.Used here.
5029
5030 2003-12-13  Martin Baulig  <martin@ximian.com>
5031
5032         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5033         any value here; we're now using flow analysis to figure out
5034         whether a statement/block returns a value.
5035
5036 2003-12-13  Martin Baulig  <martin@ximian.com>
5037
5038         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5039         working again.
5040         (FlowBranching.MergeFinally): Don't call
5041         `branching.CheckOutParameters()' here, this is called in
5042         MergeTopBlock().
5043         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5044         when adding the `finally' vector.       
5045
5046 2003-12-13  Martin Baulig  <martin@ximian.com>
5047
5048         * flowanalysis.cs
5049         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5050         actually work and also fix #48962.
5051
5052 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5053
5054         * decl.cs: Do not check System.Object for nested types,
5055         since we know it does not have any. Big bang for buck:
5056
5057         BEFORE:
5058            Run 1:   8.35 seconds
5059            Run 2:   8.32 seconds
5060            corlib:  17.99 seconds
5061         AFTER:
5062            Run 1:   8.17 seconds
5063            Run 2:   8.17 seconds
5064            corlib:  17.39 seconds
5065
5066 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5067
5068         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5069         time we are returning 0 members, so we save alot here.
5070
5071 2003-12-11  Martin Baulig  <martin@ximian.com>
5072
5073         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5074         `MergeChild()', also just take the `FlowBranching' as argument;
5075         call Merge() on it and return the result.
5076         (FlowBranching.Merge): We don't need to do anything if we just
5077         have one sibling.
5078
5079 2003-12-11  Martin Baulig  <martin@ximian.com>
5080
5081         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5082         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5083         Maurer for this idea.
5084
5085 2003-12-11  Martin Baulig  <martin@ximian.com>
5086
5087         * flowanalysis.cs (MergeResult): This class is now gone; we now
5088         use the `UsageVector' for this.  The reason for this is that if a
5089         branching just has one sibling, we don't need to "merge" them at
5090         all - that's the next step to do.
5091         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5092         `MergeResult'.
5093
5094 2003-12-11  Martin Baulig  <martin@ximian.com>
5095
5096         Reworked flow analyis and made it more precise and bug-free.  The
5097         most important change is that we're now using a special `Reachability'
5098         class instead of having "magic" meanings of `FlowReturns'.  I'll
5099         do some more cleanups and optimizations and also add some more
5100         documentation this week.
5101
5102         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5103         largely reworked this class.
5104         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5105         the new `Reachability' class instead of having "magic" values here.
5106         (FlowBranching): We're now using an instance of `Reachability'
5107         instead of having separate `Returns', `Breaks' etc. fields.
5108
5109         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5110         based on flow analysis; ignore the return value of block.Emit ().
5111
5112 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5113
5114         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5115         if they are private.
5116
5117 2003-12-09  Martin Baulig  <martin@ximian.com>
5118
5119         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5120         call them directly on the UsageVector.
5121
5122 2003-12-09  Martin Baulig  <martin@ximian.com>
5123
5124         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5125         Changed return type from `FlowReturns' to `Reachability'.
5126
5127 2003-12-09  Martin Baulig  <martin@ximian.com>
5128
5129         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5130         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5131         `Reachable' fields with a single `Reachability' one.
5132
5133 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5134
5135         * class.cs (FindMembers): Remove foreach's.
5136
5137         Bootstrap times:
5138
5139         BEFORE
5140                 Run 1:   8.74 seconds
5141                 Run 2:   8.71 seconds
5142
5143         AFTER
5144                 Run 1:   8.64 seconds
5145                 Run 2:   8.58 seconds
5146
5147
5148 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5149
5150         * cs-parser.jay:
5151         * gen-treedump.cs:
5152         * statement.cs:
5153         This patch does a few things:
5154                 1. EmptyStatement is now a singleton, so it is never reallocated.
5155                 2. All blah is EmptyStatement constructs have been changed to
5156                    blah == EmptyStatement.Value, which is much faster and valid
5157                    now that EmptyStatement is a singleton.
5158                 3. When resolving a block, rather than allocating a new array for
5159                    the non-empty statements, empty statements are replaced with
5160                    EmptyStatement.Value
5161                 4. Some recursive functions have been made non-recursive.
5162         Mainly the performance impact is from (3), however (1) and (2) are needed for
5163         this to work. (4) does not make a big difference in normal situations, however
5164         it makes the profile look saner.
5165
5166         Bootstrap times:
5167
5168         BEFORE
5169         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5170         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5171         Total memory allocated: 56397 KB
5172
5173         AFTER
5174         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5175         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5176         Total memory allocated: 55666 KB
5177
5178 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5179
5180         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5181         than the hashtable in a hashtable version
5182
5183         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5184         we always end up concating a string. This results in a huge perf
5185         loss, because many strings have to be tracked by the GC. In this
5186         patch, we first use a hashtable that works with two keys, so that
5187         the strings do not need to be concat'ed.
5188
5189         Bootstrap times:
5190         BEFORE
5191                 Run 1:   8.74 seconds
5192                 Run 2:   8.71 seconds
5193
5194         AFTER
5195                 Run 1:   8.65 seconds
5196                 Run 2:   8.56 seconds
5197
5198 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5199
5200         * Makefile: Add a new target `do-time' that does a quick and simple
5201         profile, leaving easy to parse output.
5202
5203 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5204
5205         * codegen.cs (Init): Create the dynamic assembly with 
5206         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5207
5208 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5209
5210         * support.cs: Make the PtrHashtable use only one
5211         instance of its comparer.
5212
5213 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5214
5215         * typemanager.cs: Fix lookup of GetNamespaces.
5216
5217 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5218
5219         * expression.cs: Removed redundant line.
5220
5221         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5222         ArrayLists, use for loops with bounds.  
5223
5224         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5225         arraylist.
5226
5227         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5228         arraylists, use for loop with bounds.
5229
5230         The above three changes give us a 0.071 second performance
5231         improvement out of 3.294 seconds down to 3.223.  On my machine
5232         the above changes reduced the memory usage by 1,387 KB during
5233         compiler bootstrap.
5234
5235         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5236         QualifiedIdentifiers.  Before we created a new string through
5237         concatenation, and mostly later on, the result would be
5238         manipulated by DecomposeQI through string manipulation.
5239
5240         This reduced the compiler memory usage for bootstrapping from
5241         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5242         compile times in 0.05 seconds.
5243
5244 2003-11-28  Dick Porter  <dick@ximian.com>
5245
5246         * support.cs: Do string compares with the Invariant culture.
5247
5248         * rootcontext.cs: 
5249         * gen-treedump.cs: 
5250         * expression.cs: 
5251         * driver.cs: 
5252         * decl.cs: 
5253         * codegen.cs: 
5254         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5255         the comparison is done with the Invariant culture.
5256
5257 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5258
5259         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5260         GetEnumerator method.
5261
5262         (ProbeCollectionType): Iterate starting at the most specific type
5263         upwards looking for a GetEnumerator
5264
5265         * expression.cs: Shift count can be up to 31 for int/uint and 63
5266         for long/ulong.
5267
5268 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5269
5270         * statement.cs (Block.LookupLabel): Also look for the label on the
5271         children blocks.  Use a hash table to keep track of visited
5272         nodes. 
5273
5274         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5275         we actually did transform the other operand, otherwise fall back
5276         to the common codepath that casts to long.
5277
5278         * cs-tokenizer.cs: Use the same code pattern as the int case.
5279         Maybe I should do the parsing myself, and avoid depending on the
5280         Parse routines to get this done.
5281
5282 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5283
5284         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5285         which fixes bug 51347.  This time test it.
5286
5287         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5288         attributes for example can not tell the difference between these.
5289         The difference was only a syntax feature of the language. 
5290
5291         * attribute.cs: Apply attributes to delegates.
5292
5293         * delegate.cs: Call the apply attributes method.
5294
5295 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5296
5297         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5298         comparing 0 vs Byte.MinValue, not the value
5299
5300         (ImplicitConversionRequired): When reporting a conversion error,
5301         use error 31 to print out the constant error instead of the
5302         simpler 29.
5303
5304         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5305         which fixes bug 51347.
5306
5307 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5308
5309         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5310         which fixes the -warnaserror command line option.
5311
5312 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5313
5314         * cfold.cs (DoNumericPromotions): During constant folding of
5315         additions on UIntConstant, special case intconstants with
5316         IntConstants like we do on the expression binary operator. 
5317
5318 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5319
5320         * convert.cs (ImplicitReferenceConversion): We were missing a case
5321         (System.Enum are not value types or class types, so we need to
5322         classify them separatedly).
5323
5324         * driver.cs: We do not support error 2007.
5325
5326 2003-11-12 Jackson Harper <jackson@ximian.com>
5327
5328         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5329         system directory. Also use the full file name so users can
5330         libraries names mscorlib-o-tron.dll in a non system dir.
5331
5332 2003-11-10  Martin Baulig  <martin@ximian.com>
5333
5334         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5335         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5336         calling `ResolveType()' on them, directly assign their `Type'.
5337
5338 2003-11-08  Martin Baulig  <martin@ximian.com>
5339
5340         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5341         return value and the `out parent' parameter.
5342         (TypeContainer.DefineType): Moved the CS0644 check into
5343         GetClassBases().  Don't pass the interface types to the
5344         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5345         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5346
5347         * ecore.cs (TypeExpr.IsAttribute): New property.
5348         (TypeExpr.GetInterfaces): New method.
5349
5350         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5351         TypeExpr instead of a Type.
5352         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5353         (Interface.DefineType): Don't pass the interface types to the
5354         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5355         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5356
5357         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5358         instead of a `Type[]'.
5359         (TypeManager.RegisterBuilder): Likewise.
5360         (TypeManager.AddUserInterface): Likewise.
5361         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5362         `Type[]' and also return a `TypeExpr[]'.
5363         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5364
5365 2003-11-08  Martin Baulig  <martin@ximian.com>
5366
5367         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5368         Expression.     
5369
5370 2003-11-08  Martin Baulig  <martin@ximian.com>
5371
5372         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5373         TypeManager.ResolveExpressionTypes().
5374
5375         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5376         instead of an Expression.
5377         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5378         (TypeExpression): New public class; formerly known as `TypeExpr'.
5379
5380         * expression.cs (ComposedCast): Derive from TypeExpr.
5381
5382         * typemanager.cs (TypeManager.system_*_expr): These are now
5383         TypExpr's instead of Expression's.
5384         (TypeManager.ResolveExpressionTypes): New public static function;
5385         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5386         of them.        
5387
5388 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5389
5390         * expression.cs (New.DoResolve): Do not dereference value that
5391         might be a null return.
5392
5393         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5394         sure that the constant value has the right type.  Fixes an
5395         unreported bug, similar to 50425.
5396
5397         * const.cs (Const.LookupConstantValue): Call
5398         ImplicitStandardConversionExists before doing a conversion to
5399         avoid havng the TypeManager.ChangeType do conversions.
5400
5401         Reduced the number of casts used
5402
5403         (Const.ChangeType): New routine to enable reuse of the constant
5404         type changing code from statement.
5405
5406         * typemanager.cs (ChangeType): Move common initialization to
5407         static global variables.
5408
5409         Fixes #50425.
5410
5411         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5412         every value type to go through, even if it was void.  Fix that. 
5413
5414         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5415         character of the define, and the is_identifier_part_character for
5416         the rest of the string.
5417
5418 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5419
5420         * expression.cs (UnaryMutator.EmitCode): When I updated
5421         LocalVariableReference.DoResolve, I overdid it, and dropped an
5422         optimization done on local variable references.
5423
5424 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5425
5426         * ecore.cs: Convert the return from Ldlen into an int.
5427
5428 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5429
5430         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5431         the accessibility, this is a special case for toplevel non-public
5432         classes (internal for instance).
5433
5434 2003-10-20  Nick Drochak <ndrochak@gol.com>
5435
5436         * ecore.cs: Fix typo and build.  Needed another right paren.
5437
5438 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5439
5440         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5441         `internal' case regular and protected, but not allowing protected
5442         to be evaluated later.  Bug 49840
5443
5444 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5445
5446         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5447         to kb.Nlast, and not the kb.nFirst to isolate the switch
5448         statement.
5449
5450         Extract the underlying type, so enumerations of long/ulong are
5451         treated like long/ulong.
5452
5453 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5454
5455         * expression.cs (New): Overload the meaning of RequestedType to
5456         track the possible creation of the NewDelegate type, since
5457         DoResolve is invoked more than once for new constructors on field
5458         initialization.
5459
5460         See bugs: #48800 and #37014
5461
5462         * cs-parser.jay (declare_local_constants): Take an arraylist
5463         instead of a single constant.
5464
5465         (local_constant_declaration): It should take a
5466         constant_declarators, not a constant_declarator.  Fixes 49487
5467
5468         * convert.cs: Fix error report.
5469
5470 2003-10-13 Jackson Harper <jackson@ximian.com>
5471
5472         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5473         bug #49611
5474
5475 2003-10-09  Martin Baulig  <martin@ximian.com>
5476
5477         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5478         to the .ctor.
5479         (MethodCore.DoDefineParameters): Removed the TypeContainer
5480         argument; use the DeclSpace which was passed to the .ctor instead.
5481         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5482         TypeContainer; we only need a DeclSpace here.
5483
5484 2003-10-09  Martin Baulig  <martin@ximian.com>
5485
5486         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5487         to the .ctor.
5488         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5489         EmitContext's .ctor.    
5490
5491 2003-10-09  Martin Baulig  <martin@ximian.com>
5492
5493         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5494         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5495         AsAccessible(), moved them as well.
5496
5497         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5498
5499 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5500
5501         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5502
5503 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5504
5505         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5506         generation for >=, as spotted by Paolo, bug 48679.  
5507         Patch from David Waite.
5508
5509         * cs-tokenizer.cs: Add handling for #pragma.
5510
5511         * cs-parser.jay: Allow for both yield and yield return in the
5512         syntax.  The anti-cobolization of C# fight will go on!
5513
5514         * class.cs (TypeBuilder.DefineType): Catch error condition here
5515         (Parent.DefineType erroring out and returning null).
5516
5517         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5518         coping with enumerations variables, we were mistakenly processing
5519         them as a regular value type instead of built-in types.  Fixes the
5520         bug #48063
5521
5522         * typemanager.cs (IsBuiltinOrEnum): New method.
5523
5524 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5525
5526         * cs-parser.jay: Upgrade: yield now needs the return clause.
5527
5528 2003-09-19  Martin Baulig  <martin@ximian.com>
5529
5530         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5531         `MemberCache parent' argument.  Normally, an interface doesn't
5532         have a parent type except System.Object, but we use this in gmcs
5533         for generic type parameters.
5534
5535 2003-09-18  Martin Baulig  <martin@ximian.com>
5536
5537         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5538         on `type.IsInterface'; don't check whether the type has a parent
5539         to determine whether it's an interface.
5540
5541 2003-09-15  Martin Baulig  <martin@ximian.com>
5542
5543         * class.cs (TypeContainer.DefineType): Added an error flag to
5544         avoid reporting duplicate CS0146's ("class definition is
5545         circular.").
5546
5547         * driver.cs (Driver.MainDriver): Abort if
5548         RootContext.ResolveTree() reported any errors.
5549
5550 2003-09-07  Martin Baulig  <martin@ximian.com>
5551
5552         * report.cs (Error, Warning): Added overloaded versions which take
5553         a `params object[] args' and call String.Format().
5554
5555 2003-09-07  Martin Baulig  <martin@ximian.com>
5556
5557         * decl.cs (DeclSpace..ctor): Don't call
5558         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5559         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5560         (DeclSpace.RecordDecl): New method.
5561
5562         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5563
5564 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5565
5566         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5567         value attributes to be applied to ParameterBuilders.
5568
5569         * class.cs (MethodCore.LabelParameters): Make static and more
5570         generic so that it can be used from other places - like interface
5571         methods, for instance.
5572
5573         * interface.cs (Interface.Emit): Call LabelParameters before
5574         emitting attributes on the InterfaceMethod.
5575
5576 2003-08-26  Martin Baulig  <martin@ximian.com>
5577
5578         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5579         resolving aliases; fixes #47927.
5580
5581 2003-08-26  Martin Baulig  <martin@ximian.com>
5582
5583         * statement.cs (Using.DoResolve): This is internally emitting a
5584         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5585         do not always return.  Fixes #47681.
5586
5587 2003-08-26  Martin Baulig  <martin@ximian.com>
5588
5589         * decl.cs (MemberCore): Moved WarningNotHiding(),
5590         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5591         into MemberBase.
5592         (AdditionResult): Make this nested in DeclSpace.
5593         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5594         argument; call NamespaceEntry.Define() unless we're nested in a
5595         class or struct.
5596
5597         * namespace.cs (Namespace.DefineName): New public function.  This
5598         is called from DeclSpace's .ctor to add 
5599         (Namespace.Lookup): Include DeclSpaces in the lookup.
5600
5601         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5602
5603         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5604
5605 2003-08-25  Martin Baulig  <martin@ximian.com>
5606
5607         * convert.cs (Convert.ExplicitReferenceConversion): When
5608         converting from an interface type to a class, unbox if the target
5609         type is a struct type.  Fixes #47822.
5610
5611 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5612
5613         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5614         #47854.
5615
5616 2003-08-22  Martin Baulig  <martin@ximian.com>
5617
5618         * class.cs (TypeManager.DefineType): When defining a nested type,
5619         call DefineType() on our parent; fixes #47801.
5620
5621 2003-08-22  Martin Baulig  <martin@ximian.com>
5622
5623         * class.cs (MethodData.Define): While checking if a method is an
5624         interface implementation, improve the test a bit more to fix #47654.
5625
5626 2003-08-22  Martin Baulig  <martin@ximian.com>
5627
5628         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5629         correctly; fixes #47722.
5630
5631 2003-08-22  Martin Baulig  <martin@ximian.com>
5632
5633         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5634         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5635
5636         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5637
5638 2003-08-22  Martin Baulig  <martin@ximian.com>
5639
5640         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5641         can only be assigned in static constructors.  Fixes #47161.
5642
5643 2003-08-22  Martin Baulig  <martin@ximian.com>
5644
5645         Rewrote and improved the flow analysis code.
5646
5647         * flowbranching.cs (FlowBranching): Make this class abstract.
5648         (FlowBranching.CreateBranching): New static function to create a
5649         new flow branching.
5650         (FlowBranchingBlock, FlowBranchingException): New classes.
5651         (FlowBranching.UsageVector.Type): New public readonly field.
5652         (FlowBranching.UsageVector.Breaks): Removed the setter.
5653         (FlowBranching.UsageVector.Returns): Removed the setter.
5654         (FlowBranching.UsageVector): Added Break(), Return(),
5655         NeverReachable() and Throw() methods to modify the reachability.
5656         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5657         done by FlowBranching.Merge().
5658         (FlowBranching.UsageVector.MergeChild): New method; merges the
5659         merge result into the current vector.
5660         (FlowBranching.Merge): New abstract method to merge a branching.
5661
5662 2003-08-12  Martin Baulig  <martin@ximian.com>
5663
5664         * expression.cs (Indirection.CacheTemporaries): Create the
5665         LocalTemporary with the pointer type, not its element type.
5666
5667 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5668
5669         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5670         token was a keyword or not.
5671
5672         Add `error' options where an IDENTIFIER was expected;  Provide
5673         CheckToken and CheckIdentifierToken convenience error reporting
5674         functions. 
5675
5676         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5677
5678         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5679         NameSpaceEntry NameSpaceEntry.
5680
5681         (LookupInterfaceOrClass): Avoid creating a full qualified name
5682         from namespace and name: avoid doing lookups when we know the
5683         namespace is non-existant.   Use new Tree.LookupByNamespace which
5684         looks up DeclSpaces based on their namespace, name pair.
5685
5686         * driver.cs: Provide a new `parser verbose' to display the
5687         exception thrown during parsing.  This is turned off by default
5688         now, so the output of a failure from mcs is more graceful.
5689
5690         * namespace.cs: Track all the namespaces defined in a hashtable
5691         for quick lookup.
5692
5693         (IsNamespace): New method
5694
5695 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5696
5697         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5698         we know that we need to concatenate (full typename can never be
5699         null). 
5700
5701         * class.cs: ditto.
5702
5703         * statement.cs: Use a bitfield;  Do not initialize to null things
5704         which are done by the constructor by default.
5705
5706         * cs-parser.jay: bug fix, parameter was 4, not 3.
5707
5708         * expression.cs: Just use the property;
5709
5710         * statement.cs: No need for GetVariableInfo method.
5711
5712 2003-08-08  Martin Baulig  <martin@ximian.com>
5713
5714         * flowanalysis.cs (FlowReturns): This is now nested in the
5715         `FlowBranching' class.
5716         (MyBitVector): Moved this here from statement.cs.
5717         (FlowBranching.SiblingType): New enum type.
5718         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5719
5720 2003-08-07  Martin Baulig  <martin@ximian.com>
5721
5722         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5723         `FlowBranching' class and called `BranchingType'.
5724
5725 2003-08-07  Martin Baulig  <martin@ximian.com>
5726
5727         * flowanalysis.cs: Moved all the control flow analysis code into
5728         its own file.
5729
5730 2003-08-07  Martin Baulig  <martin@ximian.com>
5731
5732         * assign.cs (Assign.DoResolve): `target' must either be an
5733         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5734         #37319.
5735
5736 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5737
5738         * expression.cs (BinaryMethod): This kind of expression is created by the
5739         Binary class if it determines that the operator has to be handled
5740         by a method.
5741
5742         (BinaryDelegate): This kind of expression is created if we are
5743         dealing with a + or - operator on delegates.
5744
5745         (Binary): remove method, argumetns, and DelegateOperator: when
5746         dealing with methods, 
5747
5748         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5749
5750         * statement.cs (Block): use bitfields for the three extra booleans
5751         we had in use.   Remove unused topblock parameter.
5752
5753         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5754
5755         * assign.cs: Drop extra unneeded tests.
5756
5757 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5758
5759         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5760
5761         * statement.cs (Foreach): Use VariableStorage instead of
5762         LocalBuilders.   
5763
5764         * codegen.cs (VariableStorage): New class used by clients that
5765         require a variable stored: locals or fields for variables that
5766         need to live across yield.
5767
5768         Maybe provide a convenience api for EmitThis+EmitLoad?
5769
5770         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5771         these bad boys.
5772
5773 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5774
5775         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5776         RemapParameterLValue): New methods that are used to turn a
5777         precomputed FieldInfo into an expression like this:
5778
5779                 instance.FieldInfo
5780
5781         The idea is to use this instead of making LocalVariableReference
5782         have more than one meaning.
5783
5784         * cs-parser.jay: Add error production to BASE.
5785
5786         * ecore.cs: Deal with TypeManager.GetField returning null, which
5787         is now a valid return value.
5788
5789         (FieldExprNoAddress): New expression for Fields whose address can
5790         not be taken.
5791
5792         * expression.cs (LocalVariableReference): During the resolve
5793         phases, create new expressions if we are in a remapping context.
5794         Remove code that dealt with remapping here.
5795
5796         (ParameterReference): same.
5797
5798         (ProxyInstance): New expression, like the `This' expression, but
5799         it is born fully resolved.  We know what we are doing, so remove
5800         the errors that are targeted to user-provided uses of `this'.
5801
5802         * statement.cs (Foreach): our variable is now stored as an
5803         Expression;  During resolution, follow the protocol, dont just
5804         assume it will return this.
5805
5806 2003-08-06  Martin Baulig  <martin@ximian.com>
5807
5808         * support.cs (SeekableStreamReader.cs): New public class.
5809
5810         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5811         SeekableStreamReader instead of the normal StreamReader.
5812
5813 2003-08-04  Martin Baulig  <martin@ximian.com>
5814
5815         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5816         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5817         deambiguate casts and delegate invocations.
5818         (parenthesized_expression): Use the new tokens to ensure this is
5819         not a cast of method invocation.
5820
5821         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5822         when reading a `)' and Deambiguate_CloseParens () was previously
5823         called.
5824
5825         * expression.cs (ParenthesizedExpression): New class.  This is
5826         just used for the CS0075 test.
5827         (Binary.DoResolve): Check for CS0075.   
5828
5829 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5830
5831         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5832         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5833         reference comparison.
5834
5835         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5836         examine the ReturnType for equality - this is necessary in the
5837         cases of implicit and explicit operators whose signature also
5838         includes the return type.
5839
5840 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5841
5842         * namespace.cs: Cache the result of the namespace computation,
5843         instead of computing it every time.
5844
5845 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5846
5847         * decl.cs: Use a global arraylist that we reuse over invocations
5848         to avoid excesive memory consumption.  Reduces memory usage on an
5849         mcs compile by one meg (45 average).
5850
5851         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5852         private, work around that.
5853
5854 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5855
5856         * literal.cs (IntLiteral): Define Zero and One static literals. 
5857
5858         * cs-parser.jay (integer_literal): use static literals to reduce
5859         memory usage for the most used literals (0, 1 and -1).  211kb
5860         reduced in memory usage.
5861
5862         Replace all calls to `new ArrayList' with `new
5863         ArrayList(4)' which is a good average number for most allocations,
5864         and also requires only 16 bytes of memory for its buffer by
5865         default. 
5866
5867         This reduced MCS memory usage in seven megabytes for the RSS after
5868         bootstrapping.
5869
5870 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5871
5872         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5873         handle params methods the correct way by forming only one
5874         applicable set with params and normal methods in them. Earlier we
5875         were looking at params methods only if we found no normal methods
5876         which was not the correct thing to do.
5877
5878         (Invocation.BetterFunction): Take separate arguments indicating
5879         when candidate and the best method are params methods in their
5880         expanded form.
5881
5882         This fixes bugs #43367 and #46199.
5883
5884         * attribute.cs: Documentation updates.
5885
5886         (CheckAttribute): Rename to CheckAttributeTarget.
5887         (GetValidPlaces): Rename to GetValidTargets.
5888
5889         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5890         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5891
5892         Fixes bug #44468.
5893
5894 2003-07-28  Martin Baulig  <martin@ximian.com>
5895
5896         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5897         name when looking up the base class of a nested class.  Fixes #46977.
5898
5899 2003-07-26  Martin Baulig  <martin@ximian.com>
5900
5901         * expression.cs (Indexers.Indexer): New nested struct; contains
5902         getter, setter and the indexer's type.
5903         (Indexers.Properties): This is now an ArrayList of
5904         Indexers.Indexer's.
5905         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5906         indexer doesn't have any getters.
5907
5908         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5909         for embedded property and indexer assignments.
5910
5911 2003-07-26  Martin Baulig  <martin@ximian.com>
5912
5913         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5914         preprocessor directive is not the first non-whitespace character
5915         on a line.
5916
5917 2003-07-26  Martin Baulig  <martin@ximian.com>
5918
5919         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5920         namespace parsing, follow the spec more closely.
5921
5922         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5923         NamespaceEntry.Lookup().
5924
5925 2003-07-25  Martin Baulig  <martin@ximian.com>
5926
5927         * MethodCore.cs (OverridesSomething): New public field; it's set
5928         from TypeContainer.DefineMembers if this method overrides
5929         something (which doesn't need to be a method).  Fix #39462.
5930
5931 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5932
5933         * typemanager.cs (GetMembers): Ensure that the list of members is
5934         reversed. This keeps things in sync.
5935
5936         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5937         find an AttributeUsage attribute.
5938
5939         * expression.cs (Invocation.OverloadResolve): Perform the check
5940         which disallows Invoke to be directly called on a Delegate.
5941
5942         (Error_InvokeOnDelegate): Report error cs1533.
5943
5944 2003-07-25  Martin Baulig  <martin@ximian.com>
5945
5946         * expression.cs (Indexers.GetIndexersForType): Only look in the
5947         interface hierarchy if the requested type is already an
5948         interface.  Fixes #46788 while keeping #46502 fixed.
5949
5950 2003-07-25  Martin Baulig  <martin@ximian.com>
5951
5952         * class.cs (TypeContainer.DefineMembers): Check whether all
5953         readonly fields have been assigned and report warning CS0649 if
5954         not.
5955
5956         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5957         a valuetype.
5958
5959 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5960
5961         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5962         returned from GetMethods to make things consistent with the
5963         assumptions MCS makes about ordering of methods.
5964
5965         This should comprehensively fix bug #45127 and it does :-)
5966
5967         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5968         ordering is actually reverse.
5969
5970         * Clean up some debug messages I left lying around.
5971
5972         * interface.cs (Populate*): Get rid of code which emits attributes
5973         since the stage in which we emit attributes is the 'Emit' stage,
5974         not the define stage.
5975
5976         (Emit): Move attribute emission for interface members here.
5977
5978 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5979
5980         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5981         closely: we eliminate methods in base types when we have an
5982         applicable method in a top-level type.
5983
5984         Please see section 14.5.5.1 for an exact description of what goes
5985         on. 
5986
5987         This fixes bug #45127 and a host of other related to corlib compilation.
5988
5989         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5990         array is the method corresponding to the top-level type (this is
5991         because of the changes made to icall.c) so we change this
5992         accordingly.
5993
5994         (MethodGroupExpr.Name): This too.
5995
5996         * typemanager.cs (GetElementType): New method which does the right
5997         thing when compiling corlib. 
5998
5999         * everywhere: Make use of the above in the relevant places.
6000
6001 2003-07-22  Martin Baulig  <martin@ximian.com>
6002
6003         * cs-parser.jay (invocation_expression): Moved
6004         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6005         `cast_expression', but create a InvocationOrCast which later
6006         resolves to either an Invocation or a Cast.
6007
6008         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6009         method; call this before EmitStatement() to make sure that this
6010         expression can be used as a statement.
6011
6012         * expression.cs (InvocationOrCast): New class; resolves to either
6013         an Invocation or a Cast.
6014
6015         * statement.cs (StatementExpression): Call ResolveStatement() on
6016         the ExpressionStatement before emitting it.
6017
6018 2003-07-21  Martin Baulig  <martin@ximian.com>
6019
6020         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6021         `ref' and `out' attributes match; fixes #46220.
6022         (MemberAccess.ResolveMemberAccess): You can't reference a type
6023         through an expression; fixes #33180.
6024         (Indexers.GetIndexersForType): Don't return the indexers from
6025         interfaces the class implements; fixes #46502.
6026
6027 2003-07-21  Martin Baulig  <martin@ximian.com>
6028
6029         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6030         CS0661 checks; fixes bug #30442.
6031
6032 2003-07-21  Martin Baulig  <martin@ximian.com>
6033
6034         * decl.cs (AdditionResult): Added `Error'.
6035
6036         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6037
6038         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
6039         makes cs0031.cs actually work.
6040
6041 2003-07-20  Martin Baulig  <martin@ximian.com>
6042
6043         * namespace.cs: Fixed that bug which caused a crash when compiling
6044         the debugger's GUI.
6045
6046 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6047
6048         * typemanager.cs (LookupTypeReflection): Never expose types which
6049         are NotPublic, NestedPrivate, NestedAssembly, or
6050         NestedFamANDAssem.  We used to return these, and later do a check
6051         that would report a meaningful error, but the problem is that we
6052         would not get the real match, if there was a name override.
6053
6054 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6055
6056         * namespace.cs (Namespace, Name): Do not compute the namespace
6057         name dynamically, compute it in the constructor.  This reduced
6058         memory usage by 1697 KB.
6059
6060         * driver.cs: Use --pause to pause at the end.
6061
6062 2003-07-17  Peter Williams  <peter@newton.cx>
6063
6064         * Makefile: Change the name of the test target so that it doesn't
6065         conflict with the recursive test target.
6066
6067 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6068
6069         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6070         AddressOf): Do not use EmitThis, that was wrong, use the actual
6071         this pointer.
6072
6073 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6074
6075         * class.cs (MethodData.Define): While checking if a method is an
6076         interface implementation, improve the test: If we are not public
6077         (use new test here: use the computed MethodAttributes directly,
6078         instead of the parsed modifier flags) check if the `implementing'
6079         method comes from an interface or not.
6080
6081         * pending.cs (VerifyPendingMethods): Slightly better error
6082         message.
6083
6084         * makefile: add test target that does the mcs bootstrap.
6085
6086 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6087
6088         * interface.cs (Define): Do nothing here since there are no
6089         members to populate etc. Move the attribute emission out of here
6090         since this was just totally the wrong place to put it. Attribute
6091         application happens during the 'Emit' phase, not in the 'Define'
6092         phase.
6093
6094         (Emit): Add this method and move the attribute emission here
6095
6096         * rootcontext.cs (EmitCode): Call the Emit method on interface
6097         types too.
6098
6099 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6100
6101         * expression.cs (OverloadResolve): Report error only if Location
6102         is not 'Null' which means that there was a probe going on.
6103
6104 2003-07-14  Martin Baulig  <martin@ximian.com>
6105
6106         * expression.cs (ConditionalLogicalOperator): New public class to
6107         implement user defined conditional logical operators.
6108         This is section 14.11.2 in the spec and bug #40505.
6109
6110 2003-07-14  Martin Baulig  <martin@ximian.com>
6111
6112         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6113
6114 2003-07-14  Martin Baulig  <martin@ximian.com>
6115
6116         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6117
6118         * ecore.cs (IVariable.VerifyFixed): New interface method.
6119
6120         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6121         operator, check whether the variable is actually fixed.  Fixes bug
6122         #36055.  Set a variable definitely assigned when taking its
6123         address as required by the spec.
6124
6125         * statement.cs (LocalInfo.IsFixed): New field.
6126         (LocalInfo.MakePinned): Set `IsFixed' to true.
6127
6128 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6129
6130         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6131         for .ctors, ensure that we only ask for members declared in the
6132         attribute type (BindingFlags.DeclaredOnly).
6133
6134         Fixes bug #43632.
6135
6136         * expression.cs (Error_WrongNumArguments): Report error 1501
6137         correctly the way CSC does.
6138
6139 2003-07-13  Martin Baulig  <martin@ximian.com>
6140
6141         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6142         lookup on the fully qualified name, to make things like "X.X" work
6143         where "X.X" is a fully qualified type name, but we also have a
6144         namespace "X" in the using list.  Fixes #41975.
6145
6146 2003-07-13  Martin Baulig  <martin@ximian.com>
6147
6148         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6149         function. If we're a CompoundAssign, we need to create an embedded
6150         CompoundAssign, not an embedded Assign.
6151         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6152         Fixes #45854.
6153
6154 2003-07-13  Martin Baulig  <martin@ximian.com>
6155
6156         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6157         work to fix bug #46088.
6158
6159 2003-07-13  Ravi Pratap <ravi@ximian.com>
6160
6161         * class.cs (Operator.Emit): Do not emit attributes here - it is
6162         taken care of by the Method class that we delegate too. This takes
6163         care of bug #45876.
6164
6165 2003-07-10  Martin Baulig  <martin@ximian.com>
6166
6167         * expression.cs (TypeOfVoid): New class.
6168         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6169
6170 2003-07-10  Martin Baulig  <martin@ximian.com>
6171
6172         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6173         bug #35957.
6174
6175 2003-07-10  Martin Baulig  <martin@ximian.com>
6176
6177         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6178         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6179
6180         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6181
6182         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6183
6184 2003-07-10  Martin Baulig  <martin@ximian.com>
6185
6186         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6187         of decimal.  Fixes #42850.
6188
6189         NOTE: I also fixed the created byte blob, but this doesn't work on
6190         the MS runtime and csc never produces any byte blobs for decimal
6191         arrays.
6192
6193 2003-07-10  Martin Baulig  <martin@ximian.com>
6194
6195         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6196         structs; fixes #32068.
6197         (Block.AddChildVariableNames): Fixed #44302.
6198
6199 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6200
6201         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6202
6203 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6204
6205         * attribute.cs: And this test is onger needed.
6206
6207 2003-07-08  Martin Baulig  <martin@ximian.com>
6208
6209         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6210         inaccessible types.  Fixes #36313.
6211
6212         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6213
6214         * namespace.cs (NamespaceEntry): Create implicit entries for all
6215         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6216         implicit entries for N1.N2 and N1.
6217
6218 2003-07-08  Martin Baulig  <martin@ximian.com>
6219
6220         Rewrote the handling of namespaces to fix a lot of the issues
6221         wrt. `using' aliases etc.
6222
6223         * namespace.cs (Namespace): Splitted this class into a
6224         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6225
6226         * typemanager.cs (TypeManager.IsNamespace): Removed.
6227         (TypeManager.ComputeNamespaces): Only compute namespaces from
6228         loaded assemblies here, not the namespaces from the assembly we're
6229         currently compiling.
6230
6231 2003-07-08  Martin Baulig  <martin@ximian.com>
6232
6233         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6234
6235 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6236
6237         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6238         already fixed it.  
6239
6240         I thought about the memory savings here, but LookupTypeReflection
6241         is used under already very constrained scenarios.  Compiling
6242         corlib or mcs only exposes one hit, so it would not really reduce
6243         any memory consumption.
6244
6245 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6246
6247         * typemanager.cs: fixes bug #45889 by only adding public types from
6248         other assemblies to the list of known types.
6249
6250 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6251
6252         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6253         on the type we resolved.
6254
6255 2003-07-05  Martin Baulig  <martin@ximian.com>
6256
6257         * pending.cs (PendingImplementation.ParentImplements): Don't
6258         create the proxy if the parent is abstract.
6259
6260         * class.cs (TypeContainer.DefineIndexers): Process explicit
6261         interface implementations first.  Fixes #37714.
6262
6263 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6264
6265         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6266         defined recursively;  but since we modify the input parameters
6267         (left is set to `this' temporarily), we reset this value if the
6268         left_is_explicit is false, which gives the original semantics to
6269         the code.  
6270
6271         * literal.cs (NullPointer): new class used to represent a null
6272         literal in a pointer context.
6273
6274         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6275         type is a pointer, use a NullPointer object instead of a
6276         NullLiteral.   Closes 43687
6277
6278         (ExplicitConversion): Convert pointer values using
6279         the conv opcode to the proper type.
6280
6281         * ecore.cs (New): change ValueTypeVariable property into a method,
6282         that returns whether the valuetype is suitable for being used.
6283
6284         * expression.cs (Binary.DoNumericPromotions): Only return if we
6285         the int constant was a valid uint, and we can return both left and
6286         right as uints.  If not, we continue processing, to trigger the
6287         type conversion.  This fixes 39018.
6288
6289         * statement.cs (Block.EmitMeta): During constant resolution, set
6290         the CurrentBlock property on the emitcontext, so that we resolve
6291         constants propertly.
6292
6293 2003-07-02  Martin Baulig  <martin@ximian.com>
6294
6295         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6296         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6297
6298         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6299         than emitting it here.
6300
6301         * statement.cs: Fixed some more flow analysis bugs.
6302
6303 2003-07-02  Martin Baulig  <martin@ximian.com>
6304
6305         * class.cs (MethodData.Define): When implementing interface
6306         methods, set Final unless we're Virtual.
6307
6308         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6309         check work for interface methods.
6310
6311 2003-07-01  Martin Baulig  <martin@ximian.com>
6312
6313         * ecore.cs (EmitContext.This): Replaced this property with a
6314         GetThis() method which takes a Location argument.  This ensures
6315         that we get the correct error location for a CS0188.
6316
6317 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6318
6319         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6320         ImplicitStandardConversion.
6321
6322         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6323
6324 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6325
6326         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6327         optimization.
6328
6329 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6330
6331         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6332         constructors.
6333
6334         (MethodData.Define): Turn off initlocals for unsafe methods.
6335
6336 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6337
6338         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6339         complete;  Fixes #37521.
6340
6341         * delegate.cs: Use Modifiers.TypeAttr to compute the
6342         TypeAttributes, instead of rolling our own.  This makes the flags
6343         correct for the delegates.
6344
6345 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6346
6347         * class.cs (Constructor.Define): Set the private flag for static
6348         constructors as well.
6349
6350         * cs-parser.jay (statement_expression): Set the return value to
6351         null, to avoid a crash when we catch an error.
6352
6353 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6354
6355         * cs-parser.jay: Applied patch from Jackson that adds support for
6356         extern and unsafe modifiers to destructor declarations.
6357
6358         * expression.cs: Report error 21 if the user is trying to index a
6359         System.Array.
6360
6361         * driver.cs: Add an error message, suggested by the bug report.
6362
6363         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6364         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6365
6366 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6367
6368         * namespace.cs: Add some information to reduce FAQs.
6369
6370 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6371
6372         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6373         underlying enumeration types.  Fixes #43915.
6374
6375         * expression.cs: Treat ushort/short as legal values to be used in
6376         bitwise operations.
6377
6378 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6379
6380         * delegate.cs: transfer custom attributes for paramenters from
6381         the delegate declaration to Invoke and BeginInvoke.
6382
6383 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6384
6385         * attribute.cs: handle custom marshalers and emit marshal info
6386         for fields, too.
6387
6388 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6389
6390         * makefile.gnu: Added anonymous.cs to the compiler sources.
6391
6392 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6393
6394         * iterators.cs: Change the name of the proxy class to include two
6395         underscores.
6396
6397         * cs-parser.jay: Update grammar to include anonymous methods.
6398
6399         * anonymous.cs: new file.
6400
6401 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6402
6403         * class.cs (Field.Define): Add missing test for pointers and
6404         safety. 
6405
6406 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6407
6408         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6409         we use the stobj opcode.
6410
6411         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6412         since it wasn't the correct fix. 
6413
6414         It still is puzzling that we are required to use stobj for IntPtr
6415         which seems to be a ValueType.
6416
6417 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6418
6419         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6420         during regular simple name resolution.   Now, the trick is that
6421         instead of returning for processing the simplename, we do a
6422         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6423         contextual lookup type).   If a match is found, return that, if
6424         not, return for further composition.
6425
6426         This fixes long-standing 30485.
6427
6428         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6429         using the address to initialize an object, do an Stobj instead of
6430         using the regular Stelem.
6431
6432         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6433         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6434         Because if we are a BaseIndexerAccess that value will be true.
6435         Fixes 43643.
6436
6437         * statement.cs (GotoCase.Resolve): Return after reporting an
6438         error, do not attempt to continue. 
6439
6440         * expression.cs (PointerArithmetic.Emit): If our operand is a
6441         long, convert our constants to match the operand before
6442         multiplying.  Convert to I type before adding.   Fixes 43670.
6443
6444 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6445
6446         * enum.cs (ImplicitConversionExists) : Rename to
6447         ImplicitEnumConversionExists to remove ambiguity. 
6448
6449         * ecore.cs (NullCast): New type of cast expression class which
6450         basically is very similar to EmptyCast with the difference being
6451         it still is a constant since it is used only to cast a null to
6452         something else
6453         (eg. (string) null)
6454
6455         * convert.cs (ImplicitReferenceConversion): When casting a null
6456         literal, we return a NullCast.
6457
6458         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6459         should be around anymore.
6460
6461         The renaming (reported was slightly wrong). Corrections:
6462
6463         ConvertImplicitStandard -> ImplicitConversionStandard
6464         ConvertExplicitStandard -> ExplicitConversionStandard
6465
6466         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6467         before passing them in !
6468
6469         * convert.cs (ImplicitConversionStandard): When comparing for
6470         equal expr and target types, ensure that expr is not a
6471         NullLiteral.
6472
6473         In general, we must not be checking (expr_type ==
6474         target_type) in the top level conversion methods
6475         (ImplicitConversion, ExplicitConversion etc). This checking is
6476         done in the methods that they delegate to.
6477
6478 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6479
6480         * convert.cs: Move Error_CannotConvertType,
6481         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6482         ImplicitNumericConversion, ImplicitConversionExists,
6483         ImplicitUserConversionExists, StandardConversionExists,
6484         FindMostEncompassedType, FindMostSpecificSource,
6485         FindMostSpecificTarget, ImplicitUserConversion,
6486         ExplicitUserConversion, GetConversionOperators,
6487         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6488         TryImplicitIntConversion, Error_CannotConvertImplicit,
6489         ConvertImplicitRequired, ConvertNumericExplicit,
6490         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6491         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6492         its own file.
6493
6494         Perform the following renames:
6495
6496         StandardConversionExists -> ImplicitStandardConversionExists
6497         ConvertImplicit -> ImplicitConversion
6498         ConvertImplicitStandard -> ImplicitStandardConversion
6499         TryImplicitIntConversion -> ImplicitIntConversion
6500         ConvertImplicitRequired -> ImplicitConversionRequired
6501         ConvertNumericExplicit -> ExplicitNumericConversion
6502         ConvertReferenceExplicit -> ExplicitReferenceConversion
6503         ConvertExplicit -> ExplicitConversion
6504         ConvertExplicitStandard -> ExplicitStandardConversion
6505
6506 2003-05-19  Martin Baulig  <martin@ximian.com>
6507
6508         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6509         (TypeInfo): Added support for structs having structs as fields.
6510
6511         * ecore.cs (FieldExpr): Implement IVariable.
6512         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6513         VariableInfo for the field.
6514
6515 2003-05-18  Martin Baulig  <martin@ximian.com>
6516
6517         * expression.cs (This.DoResolve): Report a CS0027 if we're
6518         emitting a field initializer.
6519
6520 2003-05-18  Martin Baulig  <martin@ximian.com>
6521
6522         * expression.cs (This.ResolveBase): New public function.
6523         (This.DoResolve): Check for CS0188.
6524
6525         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6526         This.Resolve().
6527
6528         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6529         `instance_expression' to null if we don't have any non-static
6530         methods.
6531
6532 2003-05-18  Martin Baulig  <martin@ximian.com>
6533
6534         Reworked the way how local variables and parameters are handled by
6535         the flow analysis code.
6536
6537         * statement.cs (TypeInfo, VariableMap): New public classes.
6538         (VariableInfo): New public class.  This is now responsible for
6539         checking whether a variable has been assigned.  It is used for
6540         parameters and local variables.
6541         (Block.EmitMeta): Take the InternalParameters as argument; compute
6542         the layout of the flow vectors here.
6543         (Block.LocalMap, Block.ParameterMap): New public properties.
6544         (FlowBranching): The .ctor doesn't get the InternalParameters
6545         anymore since Block.EmitMeta() now computes the layout of the flow
6546         vector.
6547         (MyStructInfo): This class is now known as `StructInfo' and nested
6548         in `TypeInfo'; we don't access this directly anymore.
6549
6550         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6551         property and removed IsAssigned(), IsFieldAssigned(),
6552         SetAssigned() and SetFieldAssigned(); we now call them on the
6553         VariableInfo so we don't need to duplicate this code everywhere.
6554
6555         * expression.cs (ParameterReference): Added `Block block' argument
6556         to the .ctor.
6557         (LocalVariableReference, ParameterReference, This): The new
6558         VariableInfo class is now responsible for all the definite
6559         assignment stuff.
6560
6561         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6562         IsParameterAssigned, SetParameterAssigned): Removed.
6563
6564 2003-05-18  Martin Baulig  <martin@ximian.com>
6565
6566         * typemanager.cs (InitCoreTypes): Try calling
6567         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6568         the 3-args-version.  Corlib now also needs our `void_type'.
6569         (GetMethod): Added overloaded version which takes an optional
6570         `bool report_errors' to allow lookups of optional methods.
6571
6572 2003-05-12  Martin Baulig  <martin@ximian.com>
6573
6574         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6575         only used for locals and not for parameters.
6576
6577 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6578
6579         * support.cs (InternalParameters.ParameterType): Return the
6580         ExternalType of the parameter.
6581
6582         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6583         they were unused.
6584
6585 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6586
6587         * class.cs (MethodData.Define): Do not set the `newslot' on
6588         interface members, if they are also flagged as "override".
6589
6590         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6591         better code for ++i and i++.  This only works for static fields
6592         and local variables.
6593
6594         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6595         want to pull the DeclSpace out of the builder_to_declspace instead
6596         of the TypeBuilder (like in TypeContainer.FindMembers).
6597
6598         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6599         instead of LookupTypeContainer.  Fixes the crash on .NET for
6600         looking up interface members.
6601
6602         * const.cs: Create our own emit context during the Definition
6603         stage, so that constants are evaluated in the proper context, when
6604         a recursive definition happens.
6605
6606 2003-05-11  Martin Baulig  <martin@ximian.com>
6607
6608         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6609         new block for a switch section.
6610         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6611         the adding/lookup in the switch block.  Fixes #39828.
6612
6613 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6614
6615         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6616         functionality: I needed to convert the data after I had performed
6617         the add/sub operation into the operands type size.
6618
6619         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6620         pass the type for the box operation, otherwise the resulting
6621         object would have been of type object.
6622
6623         (BoxedCast): Add constructor to specify the type to box as.
6624
6625 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6626
6627         * iterators.cs: I was reusing the `count' variable inadvertently,
6628         take steps to not allow this to happen.
6629
6630 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6631
6632         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6633         by creating an array at the point where the params starts and
6634         putting all those arguments there, then adjusting the size of the
6635         array.
6636
6637 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6638
6639         * expression.cs (New.AddressOf): Implement interface
6640         IMemoryLocation.  This is used when the `new' operator is used in
6641         the context of an invocation to a method on a value type.
6642
6643         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6644         example. 
6645
6646         * namespace.cs: Also check the using aliases here.
6647
6648         * driver.cs: Move the test for using validity after the types have
6649         been entered, so we do a single pass that also includes the using
6650         aliases. 
6651
6652         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6653         in the regular case.   CreateSiblingForFinally is doing extra
6654         error checking.
6655
6656         * attribute.cs (GetAttributeArgumentExpression): Store the result
6657         on an out value, and use the return value to indicate failure
6658         instead of using null (which is a valid return for Constant.GetValue).
6659
6660         * statement.cs: Perform the analysis flow for the increment
6661         portion after the statement, because this will be the real flow of
6662         execution.  Fixes #42385
6663
6664         * codegen.cs (EmitContext.EmitArgument,
6665         EmitContext.EmitStoreArgument): New helper functions when the
6666         RemapToProxy flag is set.
6667
6668         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6669         function.
6670
6671         Add support for remapping parameters. 
6672
6673         * iterators.cs: Propagate parameter values;  Store parameter
6674         values in the proxy classes.
6675
6676 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6677
6678         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6679         need a proxy reference;  I do not know what I was thinking
6680
6681         * cs-parser.jay (constructor_initializer): catch another error,
6682         and display nice message.
6683
6684         (field_declaration): catch void field declaration
6685         to flag a better error. 
6686
6687         * class.cs (MemberBase.CheckBase): Report an error instead of a
6688         warning if a new protected member is declared in a struct. 
6689         (Field.Define): catch the error of readonly/volatile.
6690
6691         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6692
6693         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6694         volatile variable is taken
6695
6696 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6697
6698         * statement.cs (Fixed.Resolve): Report an error if we are not in
6699         an unsafe context.
6700
6701 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6702
6703         * typemanager.cs: reuse the code that handles type clashes for
6704         delegates and enumerations.
6705
6706         * class.cs (Report28): Always report.
6707
6708         * expression.cs (EncodeAsAttribute): Allow nulls here.
6709
6710 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6711
6712         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6713         the functionality for testing whether an expression is valid for
6714         an attribute here.  Also handle the case of arrays of elements
6715         being stored. 
6716
6717         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6718         encoding a linear array into an array of objects that are suitable
6719         to be passed to an CustomAttributeBuilder.
6720
6721         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6722
6723         * ecore.cs: (FieldExpr): Handle field remapping here.
6724
6725         * iteratators.cs: Pass the instance variable (if the method is an
6726         instance method) to the constructors, so we can access the field
6727         variables on the class.
6728
6729         TODO: Test this with structs.  I think the THIS variable on
6730         structs might have to be a pointer, and not a refenrece
6731
6732 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6733
6734         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6735         local variables to fields in a proxy class.
6736
6737         * iterators.cs (PopulateProxy): Rename our internal fields to
6738         <XXX>.  
6739         Create a <THIS> field if we are an instance method, so we can
6740         reference our parent container variables.
6741         (MapVariable): Called back from the EmitContext code to enter a
6742         new variable to field mapping into the proxy class (we just create
6743         a FieldBuilder).
6744
6745         * expression.cs
6746         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6747         for using the remapped locals to fields.
6748
6749         I placed the code here, because that gives the same semantics to
6750         local variables, and only changes the Emit code.
6751
6752         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6753         statements inside iterators.
6754         (VariableInfo): Add a FieldBuilder for the cases when we are
6755         remapping local variables to fields in a proxy class
6756
6757         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6758         current_block != null.
6759
6760         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6761         not cope with strings, as it has been moved to the
6762         TableSwitchEmit.  Fixed bug in switch generation.
6763
6764         * expression.cs (New.DoResolve): Provide more context for the user
6765         when reporting an error.
6766
6767         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6768         pointers. 
6769
6770         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6771         check the permissions for it.  Note than in a type-resolution
6772         context the check was already present in DeclSpace.ResolveType,
6773         but was missing from the MemberAccess.
6774
6775         (ArrayCreation.CheckIndices): warn if the user has
6776         more nested levels of expressions, but there are no more
6777         dimensions specified.  Avoids crash on bug 41906.
6778
6779 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6780
6781         * statement.cs (Block): replace Implicit bool, for a generic
6782         flags.   
6783         New flag: `Unchecked'.  This is used during the EmitMeta phase
6784         (which is out-of-line with the regular Resolve/Emit process for a
6785         statement, as this is done ahead of time, but still gets a chance
6786         to call constant resolve).
6787
6788         (Block.Flags): new enum for adding a new flag.
6789
6790         (Block.EmitMeta): track the state of unchecked.
6791
6792         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6793         to enable constant resolution to work there as well.
6794
6795 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6796
6797         * typemanager.cs (ienumerable_type): Also look up
6798         System.Collections.IEnumerable. 
6799
6800 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6801
6802         TODO: Test more than one conditional per method.
6803
6804         * class.cs (Indexer.Define): Report the location where the user is
6805         referencing the unsupported feature.
6806
6807         (MethodData): Overload the use of `conditionals' to
6808         minimize the creation of needless ArrayLists.   This saves roughly
6809         212kb on my machine.
6810
6811         (Method): Implement the new IIteratorContainer interface.
6812         (Method.SetYields): Implement the method by setting the ModFlags
6813         to contain METHOD_YIELDS.
6814
6815         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6816         which just got set to null.
6817
6818         * iterators.cs: New file.
6819
6820         (Yield, YieldBreak): New statements.
6821
6822         * statement.cs (Return.Resolve): Flag an error if we are used in
6823         an iterator method.
6824
6825         * codegen.cs (InIterator): New flag set if the code is being
6826         compiled in an iterator method.
6827
6828         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6829         internal modifier, and we just use it to avoid adding extra
6830         fields, as this is seldom used.  
6831
6832         * cs-parser.jay: Add yield_statement (yield and yield break).
6833
6834         * driver.cs: New flag -v2 to turn on version 2 features. 
6835
6836         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6837         hashtable when v2 is enabled.
6838
6839 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6840
6841         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6842         there is already a namespace defined with this name.
6843
6844         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6845         people upgraded their corlibs.
6846
6847         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6848         always use fully qualified types, no need to use the compiler
6849         front end.
6850
6851         (TypeManager.IsNamespace): Use binarysearch.
6852
6853         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6854         AddDelegate): I did not quite use the new IsValid API properly: I
6855         have to pass the short-name and the fullname.  I was passing only
6856         the basename instead of the fullname sometimes. 
6857
6858         (TypeContainer.DefineType): call NamespaceClash.
6859
6860         * interface.cs (Interface.DefineType): use NamespaceClash before
6861         defining the type.
6862
6863         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6864         defining the type.
6865
6866         * enum.cs: (Enum.DefineType): use NamespaceClash before
6867         defining the type.
6868
6869         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6870         speed increase.  First, use the negative_hits cache when we get a
6871         negative.  Second, add the type with its full original name
6872         instead of the new . and + encoded name (reflection uses + to
6873         separate type from a nested type).  Use LookupTypeReflection
6874         directly which bypasses the type->name hashtable (that we already
6875         know does not contain the type.
6876
6877         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6878         location/container type. 
6879
6880         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6881
6882 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6883
6884         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6885
6886         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6887         method is being referenced in the method group from a static
6888         context, and report error 120 if so.
6889
6890         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6891         Error118. 
6892
6893         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6894         is created, we create the A namespace).
6895
6896         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6897         Fixes #41591
6898
6899 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6900
6901         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6902         invocation to ModuleBuilder.GetType with the same values will
6903         return a new type instance, so we need to cache its return
6904         values. 
6905
6906         * expression.cs (Binary.ResolveOperator): Only allow the compare
6907         operators on enums if they are of the same type.
6908
6909         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6910         types of ValueType on their own case.  Before we were giving them
6911         the same treatment as objects.
6912
6913         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6914         fullname.  Short name is used to compare against container name.
6915         Fullname is used to check against defined namespace names.
6916
6917         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6918         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6919
6920         (Method.CheckBase): Call parent.
6921         (MemberBase.CheckBase): Check for protected members on sealed
6922         classes.
6923         (PropertyBase.CheckBase): Call parent.
6924         (Field.Define): Call parent.
6925
6926         * report.cs: Negative error codes are now mapped to 8000 - code,
6927         so that the display is render more nicely.
6928
6929         * typemanager.cs: Do not use try/catch, instead report a regular
6930         error. 
6931
6932         (GetPointerType, GetReferenceType): These methods provide
6933         mechanisms to obtain the T* and T& from a T.  We had the code
6934         previously scattered around the code base, and it also used
6935         TypeManager.LookupType that would go through plenty of caches.
6936         This one goes directly to the type source.
6937
6938         In some places we did the Type.GetType followed by
6939         ModuleBuilder.GetType, but not in others, so this unifies the
6940         processing as well.
6941
6942         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6943         statements now that we have namespace information.
6944
6945         * typemanager.cs (IsNamespace): New method, returns whether the
6946         string presented is a namespace or not.
6947
6948         (ComputeNamespaces): New public entry point, computes the list of
6949         available namespaces, using the GetNamespaces API call in Mono, or
6950         the slower version in MS.NET.   
6951
6952         Now before we start the semantic analysis phase, we have a
6953         complete list of namespaces including everything that the user has
6954         provided.
6955
6956         Deleted old code to cache namespaces in .nsc files.
6957
6958 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6959
6960         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6961         class/struct location definition Location for the implicit
6962         constructor location.
6963
6964         (Operator.Define): Use the location of the operator for the
6965         implicit Method definition.
6966
6967         (Constructor.Emit): use the constructor location for the implicit
6968         base initializer constructor.
6969
6970         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6971         and the Expression class now contains two new methods:
6972
6973         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6974         isolate type lookup from the rest of the resolution process.
6975
6976         Since we use Expressions to hold type definitions due to the way
6977         we parse the input we have historically overloaded Resolve to
6978         perform the Type lookups if a special flag is passed.  Now this is
6979         eliminated and two methods take their place. 
6980
6981         The differences in the two methods between xStep and xTerminal is
6982         that xStep is involved in our current lookup system that uses
6983         SimpleNames to compose a name, while xTerminal is used just to
6984         catch the case where the simplename lookup failed.
6985
6986 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6987
6988         * expression.cs (ResolveMemberAccess): Remove redundant code.
6989         TypeExpr expressions are always born fully resolved.
6990
6991         * interface.cs (PopulateMethod): Do not lookup the types twice.
6992         We were doing it once during SemanticAnalysis and once during
6993         PopulateMethod.
6994
6995         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6996         in local variable type definitions, were being returned as a
6997         SimpleName (we decomposed everything into a string), that is
6998         because primary_expression was being used instead of a type in the
6999         grammar (reduce/reduce conflicts).
7000
7001         The part that was wrong is that we converted the expression into a
7002         string (an oversimplification in one hand, compounded with primary
7003         expressions doing string concatenation).
7004
7005         So things like:
7006
7007         A.B.C [] x;
7008
7009         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7010         using clauses from working on this particular context.  And a type
7011         was being matched directly against "A.B.C[]".
7012
7013         We now use the correct approach, and allow for ComposedCast to be
7014         part of the unary expression.  So the "A.B.C []" become a composed
7015         cast of "A.B.C" (as a nested group of MemberAccess with a
7016         SimpleName at the end) plus the rank composition "[]". 
7017
7018         Also fixes 35567
7019
7020 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7021
7022         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7023         for the access level checking.
7024
7025         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7026         `TypeContainer container', because I kept getting confused when I
7027         was debugging this code.
7028
7029         * expression.cs (Indexers): Instead of tracking getters/setters,
7030         we now track them in parallel.  We create one arraylist less, but
7031         most importantly it is possible now for the LValue code to find a
7032         matching get for a set.
7033
7034         (IndexerAccess.DoResolveLValue): Update the code.
7035         GetIndexersForType has been modified already to extract all the
7036         indexers from a type.  The code assumed it did not.
7037
7038         Also make the code set the correct return type for the indexer.
7039         This was fixed a long time ago for properties, but was missing for
7040         indexers.  It used to be void_type.
7041
7042         (Binary.Emit): Test first for doubles instead of
7043         floats, as they are more common.
7044
7045         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7046         when dealing with floats and the <=, >= operators.  This fixes bug
7047         #39314 
7048
7049         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7050         to load the array value by emitting a load on the foreach variable
7051         type.  This was incorrect.  
7052
7053         We now emit the code to load an element using the the array
7054         variable type, and then we emit the conversion operator.
7055
7056         Fixed #40176
7057
7058 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7059
7060         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7061
7062 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7063
7064         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7065         test for protection before we test for signatures. 
7066
7067         (MethodSignature.ToString): implement.
7068
7069         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7070         to the case where we reduced into a LongConstant.
7071
7072         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7073         depend on whether the information is acurrate, because the
7074         Microsoft runtime will always claim that the array type is public,
7075         regardless of the real state.
7076
7077         If the type is a pointer, another problem happens: the type is
7078         reported as non-public in Microsoft.  
7079
7080         In both cases we have to call CheckAccessLevel recursively with
7081         the underlying type as the argument to be tested.
7082
7083 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7084
7085         * assign.cs (Assign.Emit): If we are dealing with a compound
7086         assignment expression, we should use the code path that stores the
7087         intermediate result in a temporary value.  This fixes #40903.
7088
7089         *expression.cs (Indirection.ToString): Provide ToString method for
7090         debugging. 
7091
7092 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7093
7094         * class.cs: Null out fields holding references to Block objects so
7095         they can be garbage collected.
7096
7097         * expression.cs (OverloadResolve): Remove unused local.
7098
7099 2003-04-07  Martin Baulig  <martin@ximian.com>
7100
7101         * codegen.cs (EmitContext.CurrentFile): New public field.
7102         (EmitContext.Mark): Use the CurrentFile to check whether the
7103         location is in the correct file.
7104         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7105
7106 2003-04-07  Martin Baulig  <martin@ximian.com>
7107
7108         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7109
7110         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7111         location.  [FIXME: The location argument which gets passed to this
7112         method is sometimes wrong!]
7113
7114 2003-04-07  Nick Drochak <ndrochak@gol.com>
7115
7116         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7117
7118 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7119
7120         * expression.cs (Indirection.EmitAssign): We were using the
7121         temporary, but returning immediately instead of continuing the
7122         EmitAssing flow.
7123
7124 2003-04-06  Martin Baulig  <martin@ximian.com>
7125
7126         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7127         if it's a nested child, but also deriving from the outer class.
7128         See test 190.cs.
7129
7130         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7131         nested child, but also deriving from the outer class.  See
7132         test-190.cs.
7133         (FilterWithClosure): We may access private members of the outer
7134         class if we're a nested child and deriving from the outer class.
7135         (RealMemberLookup): Only set `closure_private_ok' if the
7136         `original_bf' contained BindingFlags.NonPublic.
7137
7138 2003-04-05  Martin Baulig  <martin@ximian.com>
7139
7140         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7141
7142 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7143
7144         * class.cs (Event.Define): Do not allow abstract events to have
7145         initializers. 
7146
7147 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7148
7149         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7150         block in event declarations.
7151
7152         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7153         value type, get its address.
7154
7155         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7156         leaving a class on the stack instead of a boolean value (int
7157         0/1).  Change the code so we compare against null, and then the
7158         result against zero.
7159
7160         * class.cs (TypeContainer.GetClassBases): We were checking for the
7161         parent class being sealed too late.
7162
7163         * expression.cs (Binary.Emit): For <= and >= when dealing with
7164         floating point values, use cgt.un and clt.un instead of cgt and
7165         clt alone.
7166
7167 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7168
7169         * statement.cs: Apply the same optimization as MS: skip the 
7170         GetEnumerator returning an IEnumerator, and use the one returning a 
7171         CharEnumerator instead. This allows us to avoid the try-finally block 
7172         and the boxing.
7173
7174 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7175
7176         * cs-parser.jay: Attributes cannot be applied to
7177                          namespaces. Fixes #40473
7178
7179 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7180
7181         * class.cs:
7182         (Add*): check if the name is valid using the full name for constants,
7183         fields, properties and events.
7184
7185 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7186
7187         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7188         char constants to be part of the enumeration.
7189
7190         * expression.cs (Conditional.DoResolve): Add support for operator
7191         true. Implements the missing functionality from 14.12
7192
7193         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7194         operator true/false as required by the spec.
7195
7196         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7197         implicit conversion to boolean.
7198
7199         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7200         also one where the type implements `operator true'. 
7201
7202         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7203         get an expression that will invoke operator true based on an
7204         expression.  
7205
7206         (GetConversionOperators): Removed the hack that called op_True
7207         here.  
7208
7209         (Expression.ResolveBoolean): Move this from Statement.
7210
7211 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7212
7213         * ecore.cs (FieldExpr): do not allow initialization of initonly
7214         fields on derived classes
7215
7216 2003-03-13  Martin Baulig  <martin@ximian.com>
7217
7218         * statement.cs (Block.Emit): Call ig.BeginScope() and
7219         ig.EndScope() when compiling with debugging info; call
7220         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7221
7222 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7223
7224         * expression.cs (Indexers): Do not construct immediately, allow
7225         for new members to be appended as we go.  Fixes 38143
7226
7227 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7228
7229         * expression.cs: save/restore context when resolving an unchecked
7230         expression.
7231
7232 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7233
7234         * cfold.cs: Catch division by zero in modulus operator during
7235         constant folding.
7236
7237 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7238
7239         * interface.cs (Interface.DefineMembers): Avoid defining members
7240         twice. 
7241
7242 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7243
7244         * driver.cs: handle the +/- options for -noconfig
7245
7246         * statement.cs (Unckeched.Resolve): Also track the state of
7247         unchecked in the Resolve phase.
7248
7249 2003-02-27  Martin Baulig  <martin@ximian.com>
7250
7251         * ecore.cs (Expression.MemberLookup): Don't create a
7252         MethodGroupExpr for something which is not a method.  Fixes #38291.
7253
7254 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7255
7256         * class.cs (MemberBase.CheckParameters): Also check that the type
7257         is unmanaged if it is a pointer.
7258
7259         * expression.cs (SizeOf.Resolve): Add location information.
7260
7261         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7262         a managed type is declared.
7263
7264         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7265         parameter modifiers as well.  Fixes bug 38606
7266
7267         * class.cs: Very sad.  Am backing out the speed up changes
7268         introduced by the ArrayList -> Array in the TypeContainer, as they
7269         were not actually that much faster, and introduced a bug (no error
7270         reports on duplicated methods).
7271
7272         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7273         source first, this will guarantee that we have a valid expression
7274         before calling in lower levels functions that will require a
7275         resolved object.  Then use this original_source in the
7276         target.ResolveLValue instead of the original source that was
7277         passed to us.
7278
7279         Another change.  Use target.Resolve instead of LValueResolve.
7280         Although we are resolving for LValues, we will let the Assign code
7281         take care of that (it will be called again from Resolve).  This
7282         basically allows code like this:
7283
7284         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7285         class Y { void A (X x) { x [0] += o; }
7286
7287         The problem was that the indexer was trying to resolve for
7288         set_Item (idx, object o) and never finding one.  The real set_Item
7289         was set_Item (idx, X).  By delaying the process we get the right
7290         semantics. 
7291
7292         Fixes bug 36505
7293
7294 2003-02-23  Martin Baulig  <martin@ximian.com>
7295
7296         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7297         while calling DoEmit ().
7298
7299         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7300         source files; if you use the #line directive inside a method, the
7301         compiler stops emitting line numbers for the debugger until it
7302         reaches the end of the method or another #line directive which
7303         restores the original file.
7304
7305 2003-02-23  Martin Baulig  <martin@ximian.com>
7306
7307         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7308
7309 2003-02-23  Martin Baulig  <martin@ximian.com>
7310
7311         * statement.cs (Block.AddChildVariableNames): We need to call this
7312         recursively, not just for our immediate children.
7313
7314 2003-02-23  Martin Baulig  <martin@ximian.com>
7315
7316         * class.cs (Event.Define): Always make the field private, like csc does.
7317
7318         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7319         actually work, fixes bug #37521.
7320
7321 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7322
7323         * delegate.cs: When creating the various temporary "Parameters"
7324         classes, make sure that we call the ComputeAndDefineParameterTypes
7325         on those new parameters (just like we do with the formal ones), to
7326         allow them to be resolved in the context of the DeclSpace.
7327
7328         This fixes the bug that Dick observed in Bugzilla #38530.
7329
7330 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7331
7332         * expression.cs (ResolveMemberAccess): When resolving a constant,
7333         do not attempt to pull a constant if the value was not able to
7334         generate a valid constant.
7335
7336         * const.cs (LookupConstantValue): Do not report more errors than required.
7337
7338 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7339
7340         * expression.cs: fixes bug #38328.
7341
7342 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7343
7344         * class.cs: Changed all the various members that can be part of a
7345         class from being an ArrayList to be an Array of the right type.
7346         During the DefineType type_list, interface_list, delegate_list and
7347         enum_list are turned into types, interfaces, delegates and enums
7348         arrays.  
7349
7350         And during the member population, indexer_list, event_list,
7351         constant_list, field_list, instance_constructor_list, method_list,
7352         operator_list and property_list are turned into their real arrays.
7353
7354         Although we could probably perform this operation earlier, for
7355         good error reporting we need to keep the lists and remove the
7356         lists for longer than required.
7357
7358         This optimization was triggered by Paolo profiling the compiler
7359         speed on the output of `gen-sample-program.pl' perl script. 
7360
7361         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7362         not crash in methods like MemberLookupFailed that use this field.  
7363
7364         This problem arises when the compiler fails to resolve a type
7365         during interface type definition for example.
7366
7367 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7368
7369         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7370         inherit from System.Object, so we have to stop at null, not only
7371         when reaching System.Object.
7372
7373 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7374
7375         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7376         DeclaredOnly because the parent indexer might have had a different
7377         name, but did not loop until the top of the hierarchy was reached.
7378
7379         The problem this one fixes is 35492: when a class implemented an
7380         indexer from an interface, we were getting the interface method
7381         (which was abstract) and we were flagging an error (can not invoke
7382         abstract method).
7383
7384         This also keeps bug 33089 functioning, and test-148 functioning.
7385
7386         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7387         out if a method is special is to see if it is declared in a
7388         property or event, or whether it is one of the predefined operator
7389         names.   This should fix correctly #36804.
7390
7391 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7392
7393         The goal here is to remove the dependency on EmptyCast.Peel ().
7394         Killing it completely.
7395
7396         The problem is that currently in a number of places where
7397         constants are expected, we have to "probe" for an EmptyCast, and
7398         Peel, which is not the correct thing to do, as this will be
7399         repetitive and will likely lead to errors. 
7400
7401         The idea is to remove any EmptyCasts that are used in casts that
7402         can be reduced to constants, so we only have to cope with
7403         constants. 
7404
7405         This bug hunt was triggered by Bug 37363 and the desire to remove
7406         the duplicate pattern where we were "peeling" emptycasts to check
7407         whether they were constants.  Now constants will always be
7408         constants.
7409
7410         * ecore.cs: Use an enumconstant here instead of wrapping with
7411         EmptyCast.  
7412
7413         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7414         throwing me off.  By handling this we can get rid of a few hacks.
7415
7416         * statement.cs (Switch): Removed Peel() code.
7417
7418 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7419
7420         * class.cs: Location information for error 508
7421
7422         * expression.cs (New.DoResolve): Add a guard against double
7423         resolution of an expression.  
7424
7425         The New DoResolve might be called twice when initializing field
7426         expressions (see EmitFieldInitializers, the call to
7427         GetInitializerExpression will perform a resolve on the expression,
7428         and later the assign will trigger another resolution
7429
7430         This leads to bugs (#37014)
7431
7432         * delegate.cs: The signature for EndInvoke should contain any ref
7433         or out parameters as well.  We were not doing this in the past. 
7434
7435         * class.cs (Field.Define): Do not overwrite the type definition
7436         inside the `volatile' group.  Turns out that volatile enumerations
7437         were changing the type here to perform a validity test, which
7438         broke conversions. 
7439
7440 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7441
7442         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7443         and structs, we do not want to load the instance variable
7444
7445         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7446         enum_type has to be handled like an object reference (implicit
7447         conversions exists from this to object), but the regular IsClass
7448         and IsValueType tests will never return true for this one.
7449
7450         Also we use TypeManager.IsValueType instead of type.IsValueType,
7451         just for consistency with the rest of the code (this is only
7452         needed if we ever use the construct exposed by test-180.cs inside
7453         corlib, which we dont today).
7454
7455 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7456
7457         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7458         just InternalCall.
7459
7460 2003-02-09  Martin Baulig  <martin@ximian.com>
7461
7462         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7463         (Namespace.DefineNamespaces): New static public method; this is
7464         called when we're compiling with debugging to add all namespaces
7465         to the symbol file.
7466
7467         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7468         pass it to the Namespace's .ctor.
7469
7470         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7471         and MethodBase arguments; pass the namespace ID to the symwriter;
7472         pass the MethodBase instead of the token to the symwriter.
7473         (SymbolWriter.DefineNamespace): New method to add a namespace to
7474         the symbol file.
7475
7476 2003-02-09  Martin Baulig  <martin@ximian.com>
7477
7478         * symbolwriter.cs: New file.  This is a wrapper around
7479         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7480         methods here in near future.
7481
7482 2003-02-09  Martin Baulig  <martin@ximian.com>
7483
7484         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7485         ILGenerator.MarkSequencePoint() which are actually used by the
7486         symbol writer.
7487
7488 2003-02-09  Martin Baulig  <martin@ximian.com>
7489
7490         * location.cs (SourceFile): New public sealed class.  This
7491         contains the name and an index which is used in the location's token.
7492         (Location): Reserve an appropriate number of bits in the token for
7493         the source file instead of walking over that list, this gives us a
7494         really huge performance improvement when compiling with debugging.
7495
7496         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7497         `SourceFile' argument instead of a string.
7498         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7499         but don't parse/tokenize here, we need to generate the list of all
7500         source files before we do that.
7501         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7502         the files.
7503
7504         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7505         instead of a string.
7506
7507         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7508         of a string.
7509
7510 2003-02-09  Martin Baulig  <martin@ximian.com>
7511
7512         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7513         filename on `#line default'.
7514
7515 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7516
7517         * statement.cs: don't clear the pinned var when the fixed statement
7518         returns from the method (fixes bug#37752).
7519
7520 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7521
7522         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7523         to IsValueType.
7524
7525 2003-02-07  Martin Baulig  <martin@ximian.com>
7526
7527         * driver.cs: Removed the `--debug-args' command line argument.
7528
7529         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7530         automatically by the AsssemblyBuilder.
7531         (CodeGen.InitializeSymbolWriter): We don't need to call any
7532         initialization function on the symbol writer anymore.  This method
7533         doesn't take any arguments.
7534
7535 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7536
7537         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7538         from referenced assemblies as well.
7539
7540 2003-02-02  Martin Baulig  <martin@ximian.com>
7541
7542         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7543
7544 2003-02-02  Martin Baulig  <martin@ximian.com>
7545
7546         * class.cs (Constructor.Emit): Open the symbol writer before
7547         emitting the constructor initializer.
7548         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7549         single-stepping through constructor initializers.
7550
7551 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7552
7553         * class.cs: Handle error 549: do not allow virtual methods in
7554         sealed classes. 
7555
7556 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7557
7558         * decl.cs: Check access levels when resolving types
7559
7560 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7561
7562         * statement.cs: Add parameters and locals set in catch blocks that might 
7563         return to set vector
7564
7565 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7566
7567         * class.cs (Operator): Set the SpecialName flags for operators.
7568
7569         * expression.cs (Invocation.DoResolve): Only block calls to
7570         accessors and operators on SpecialName methods.
7571
7572         (Cast.TryReduce): Handle conversions from char constants.
7573
7574
7575 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7576
7577         * statement.cs: small memory and time optimization in FlowBranching.
7578
7579 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7580
7581         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7582         problem that the last fix but in the other sid (Set).
7583
7584         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7585         access when there is no indexer in the hierarchy.
7586
7587 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7588
7589         * class.cs: Combine some if statements.
7590
7591 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7592
7593         * driver.cs: fixed bug #37187.
7594
7595 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7596
7597         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7598         any indexer, it's needed to build a list with all the indexers in the
7599         hierarchy (AllGetters), else we have problems. Fixes #35653.
7600
7601 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7602
7603         * class.cs (MethodData.Define): It is wrong for an interface
7604         implementation to be static in both cases: explicit and implicit.
7605         We were only handling this in one case.
7606
7607         Improve the if situation there to not have negations.
7608
7609         * class.cs (Field.Define): Turns out that we do not need to check
7610         the unsafe bit on field definition, only on usage.  Remove the test.
7611
7612 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7613
7614         * driver.cs: use assembly.Location instead of Codebase (the latest
7615         patch made mcs fail when using MS assemblies).
7616
7617 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7618
7619         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7620         get the path to *corlib.dll.
7621
7622 2003-01-21  Nick Drochak <ndrochak@gol.com>
7623
7624         * cs-tokenizer.cs:
7625         * pending.cs:
7626         * typemanager.cs: Remove compiler warnings
7627
7628 2003-01-20  Duncan Mak  <duncan@ximian.com>
7629
7630         * AssemblyInfo.cs: Bump the version number to 0.19.
7631
7632 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7633
7634         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7635
7636 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7637
7638         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7639
7640 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7641
7642         * cs-parser.jay: Small fix: we were not comparing the constructor
7643         name correctly.   Thanks to Zoltan for the initial pointer.
7644
7645 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7646
7647         * cs-tokenizer.cs: Set file name when specified with #line
7648
7649 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7650
7651         * cs-parser.jay: Only perform the constructor checks here if we
7652         are named like the class;  This will help provider a better
7653         error.  The constructor path is taken when a type definition is
7654         not found, but most likely the user forgot to add the type, so
7655         report that rather than the constructor error.
7656
7657 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7658
7659         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7660         allocations.
7661
7662 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7663
7664         * cs-parser.jay: Add cleanup call.
7665
7666 2003-01-13  Duncan Mak  <duncan@ximian.com>
7667
7668         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7669         consistent with other methods.
7670
7671 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7672
7673         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7674
7675 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7676
7677         * attribute.cs: only set GuidAttr to true when we have a
7678         GuidAttribute.
7679
7680 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7681
7682         * ecore.cs:
7683         * expression.cs:
7684         * typemanager.cs: fixes to allow mcs compile corlib with the new
7685         Type.IsSubclassOf fix.
7686
7687 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7688
7689         * expression.cs (LocalVariableReference.DoResolve): Classify a
7690         constant as a value, not as a variable.   Also, set the type for
7691         the variable.
7692
7693         * cs-parser.jay (fixed_statement): take a type instead of a
7694         pointer_type, so we can produce a better error message later.
7695
7696         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7697         as an error.  
7698
7699         (For.DoEmit): Make inifinite loops have a
7700         non-conditional branch back.
7701
7702         (Fixed.DoEmit): First populate the pinned variables, then emit the
7703         statement, then clear the variables.  Before I was emitting the
7704         code once for each fixed piece.
7705
7706
7707 2003-01-08  Martin Baulig  <martin@ximian.com>
7708
7709         * statement.cs (FlowBranching.MergeChild): A break in a
7710         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7711
7712 2003-01-08  Martin Baulig  <martin@ximian.com>
7713
7714         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7715         lives in the same number space than `param_map'.  Fixes #36154.
7716
7717 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7718
7719         * cs-parser.jay (constructor_declaration): Set the
7720         Constructor.ModFlags before probing for it.  This makes the
7721         compiler report 514, 515 and 132 (the code was there, but got
7722         broken). 
7723
7724         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7725         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7726         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7727
7728 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7729
7730         * enum.cs: create the enum static fields using the enum type.
7731
7732 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7733
7734         * class.cs: don't try to create the ParamBuilder for the return
7735         type if it's not needed (and handle it breaking for the ms runtime
7736         anyway).
7737
7738 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7739
7740         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7741
7742 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7743
7744         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7745         the command.   This showed up while compiling the JANET source
7746         code, which used \r as its only newline separator.
7747
7748 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7749
7750         * class.cs (Method.Define): If we are an operator (because it
7751         reuses our code), then set the SpecialName and HideBySig.  #36128
7752
7753 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7754
7755         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7756         exception, report error 120 `object reference required'.
7757
7758         * driver.cs: Add --pause option, used during to measure the size
7759         of the process as it goes with --timestamp.
7760
7761         * expression.cs (Invocation.DoResolve): Do not allow methods with
7762         SpecialName to be invoked.
7763
7764 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7765
7766         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7767         number before adding it.
7768
7769 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7770
7771         * ecore.cs (StandardImplicitConversion): When in an unsafe
7772         context, we allow conversion between void * to any other pointer
7773         type. This fixes bug #35973.
7774
7775 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7776
7777         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7778         is not thrown when extensionless outputs are used 
7779
7780 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7781
7782         * rootcontext.cs: fixed compilation of corlib.
7783
7784 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7785
7786         * attribute.cs (Attributes.Contains): Add new method.
7787
7788         * class.cs (MethodCore.LabelParameters): if the parameter is an
7789         `out' parameter, check that no attribute `[In]' has been passed.
7790
7791         * enum.cs: Handle the `value__' name in an enumeration.
7792
7793 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7794
7795         * decl.cs: Added special case to allow overrides on "protected
7796         internal" methods
7797
7798 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7799
7800         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7801         since it makes much more sense.
7802
7803         (Attributes.ctor): Don't require a Location parameter.
7804
7805         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7806
7807         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7808         since we already have that information per attribute.
7809
7810         * everywhere : make appropriate changes.
7811
7812         * class.cs (LabelParameters): Write the code which actually
7813         applies attributes to the return type. We can't do this on the MS
7814         .NET runtime so we flag a warning in the case an exception is
7815         thrown.
7816
7817 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7818
7819         * const.cs: Handle implicit null conversions here too.
7820
7821 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7822
7823         * class.cs (MethodCore.LabelParameters): Remove the extra
7824         Type [] parameter since it is completely unnecessary. Instead
7825         pass in the method's attributes so that we can extract
7826         the "return" attribute.
7827
7828 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7829
7830         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7831         of ignoring it and letting the compile continue.
7832
7833         * typemanager.cs (ChangeType): use an extra argument to return an
7834         error condition instead of throwing an exception.
7835
7836 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7837
7838         * expression.cs (Unary.TryReduce): mimic the code for the regular
7839         code path.  Perform an implicit cast in the cases where we can
7840         implicitly convert to one of the integral types, and then reduce
7841         based on that constant.   This fixes bug #35483.
7842
7843 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7844
7845         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7846
7847 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7848
7849         * namespace.cs: fixed bug #35489.
7850
7851 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7852
7853         * class.cs: Remove some dead code.
7854
7855         * cs-parser.jay: Estimate the number of methods needed
7856         (RootContext.MethodCount);
7857
7858         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7859         numbers instead of StringBuilders.
7860
7861         * support.cs (PtrHashtable): Add constructor with initial size;
7862         We can now reduce reallocations of the method table.
7863
7864 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7865
7866         * attribute.cs (ApplyAttributes): Keep track of the emitted
7867         attributes on a per-target basis. This fixes bug #35413.
7868
7869 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7872         default to the Windows 1252 encoding.
7873
7874         (UnixParseOption): Support version, thanks to Alp for the missing
7875         pointer. 
7876
7877         * AssemblyInfo.cs: Add nice assembly information.
7878
7879         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7880         (bug 35169).
7881
7882         * cs-parser.jay: Allow a trailing comma before the close bracked
7883         in the attribute_section production.
7884
7885         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7886         address of the instance was being taken, I will take this out,
7887         because we take the address of the object immediately here.
7888
7889 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7890
7891         * typemanager.cs (AreMultipleAllowed): Take care of the most
7892         obvious case where attribute type is not in the current assembly -
7893         stupid me ;-)
7894
7895 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7896
7897         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7898         definitions, instead of doing that afterwards.  
7899
7900         Also we use a nice little hack, depending on the constructor, we
7901         know if we are a "composed" name or a simple name.  Hence, we
7902         avoid the IndexOf test, and we avoid 
7903
7904         * codegen.cs: Add code to assist in a bug reporter to track down
7905         the source of a compiler crash. 
7906
7907 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7908
7909         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7910         types have been emitted for a given element and flag an error
7911         if something which does not have AllowMultiple set is used more
7912         than once.
7913
7914         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7915         attribute types and their corresponding AllowMultiple properties
7916
7917         (AreMultipleAllowed): Check the property for a given type.
7918
7919         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7920         property in the case we have a TypeContainer.
7921
7922         (Attributes.AddAttribute): Detect duplicates and just skip on
7923         adding them. This trivial fix catches a pretty gross error in our
7924         attribute emission - global attributes were being emitted twice!
7925
7926         Bugzilla bug #33187 is now fixed.
7927
7928 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7929
7930         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7931         instead of pp_and).
7932
7933         * expression.cs (Binary.ResolveOperator): I can only use the
7934         Concat (string, string, string) and Concat (string, string,
7935         string, string) if the child is actually a concatenation of
7936         strings. 
7937
7938 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7939
7940         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7941         context where we need a 2-character lookahead.
7942
7943         * pending.cs (PendingImplementation): Rework so we can keep track
7944         of interface types all the time, and flag those which were
7945         implemented by parents as optional.
7946
7947 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7948
7949         * expression.cs (Binary.ResolveOperator): Use
7950         String.Concat(string,string,string) or
7951         String.Concat(string,string,string,string) when possible. 
7952
7953         * typemanager: More helper methods.
7954
7955
7956 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7957
7958         * pending.cs: remove the bogus return from GetMissingInterfaces()
7959         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7960
7961 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7962
7963         * namespace.cs: avoid duplicated 'using xxx' being added to
7964         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7965         when we get more than one 'using' statement for the same namespace.
7966         Report a CS0105 warning for it.
7967
7968 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7969
7970         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7971         of calling getChar/putback, uses internal knowledge of it.    
7972
7973         (xtoken): Reorder tokenizer so most common patterns are checked
7974         first.  This reduces the compilation time in another 5% (from 8.11s
7975         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7976
7977         The parsing time is 22% of the compilation in mcs, and from that
7978         64% is spent on the tokenization process.  
7979
7980         I tried using a binary search for keywords, but this is slower
7981         than the hashtable.  Another option would be to do a couple of
7982         things:
7983
7984                 * Not use a StringBuilder, instead use an array of chars,
7985                   with a set value.  Notice that this way we could catch
7986                   the 645 error without having to do it *afterwards*.
7987
7988                 * We could write a hand-parser to avoid the hashtable
7989                   compares altogether.
7990
7991         The identifier consumption process takes 37% of the tokenization
7992         time.  Another 15% is spent on is_number.  56% of the time spent
7993         on is_number is spent on Int64.Parse:
7994
7995                 * We could probably choose based on the string length to
7996                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7997                   computations. 
7998
7999         Another 3% is spend on wrapping `xtoken' in the `token' function.
8000
8001         Handle 0xa0 as whitespace (#34752)
8002
8003 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8004
8005         * typemanager.cs (IsCLRType): New routine to tell whether a type
8006         is one of the builtin types.  
8007
8008         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8009         typecode in more places instead of doing pointer comparissions.
8010         We could leverage some knowledge about the way the typecodes are
8011         laid out.
8012
8013         New code to cache namespaces in assemblies, it is currently not
8014         invoked, to be used soon.
8015
8016         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8017
8018         * expression.cs (Binary.ResolveOperator): specially handle
8019         strings, and do not perform user-defined operator overloading for
8020         built-in types.
8021
8022 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8023
8024         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8025         internalcall as it is a pretty simple operation;  Avoid whenever
8026         possible to call Char.IsLetter.
8027
8028         (consume_identifier): Cut by half the number of
8029         hashtable calls by merging the is_keyword and GetKeyword behavior.
8030
8031         Do not short-circuit, because if we do, we
8032         report errors (ie, #if false && true would produce an invalid
8033         directive error);
8034
8035
8036 2002-11-24  Martin Baulig  <martin@ximian.com>
8037
8038         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8039         check constant ranges and report a CS0221.  Fixes #33186.
8040
8041 2002-11-24  Martin Baulig  <martin@ximian.com>
8042
8043         * cs-parser.jay: Make this work for uninitialized variable
8044         declarations in the `for' initializer.  Fixes #32416.
8045
8046 2002-11-24  Martin Baulig  <martin@ximian.com>
8047
8048         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8049         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8050
8051 2002-11-24  Martin Baulig  <martin@ximian.com>
8052
8053         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8054         argument; if true, we also check for user-defined conversions.
8055         This is only needed if both arguments are of a user-defined type.
8056         Fixes #30443, added test-175.cs.
8057         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8058
8059         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8060
8061 2002-11-24  Martin Baulig  <martin@ximian.com>
8062
8063         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8064         function to get the store opcode.
8065         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8066         only emit the Ldelema if the store opcode is Stobj.  You must run
8067         both test-34 and test-167 to test this.  Fixes #34529.
8068
8069 2002-11-23  Martin Baulig  <martin@ximian.com>
8070
8071         * ecore.cs (Expression.MemberLookup): Added additional
8072         `qualifier_type' argument which is used when we're being called
8073         from MemberAccess.DoResolve() and null if we're called from a
8074         SimpleName lookup.
8075         (Expression.MemberLookupFailed): New method to report errors; this
8076         does the CS1540 check and reports the correct error message.
8077
8078         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8079         argument for the CS1540 check and redone the way how we're dealing
8080         with private members.  See the comment in the source code for details.
8081         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8082         `closure_start_type' to `closure_qualifier_type' and check whether
8083         it's not null.  It was not this filter being broken, it was just
8084         being called with the wrong arguments.
8085
8086         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8087         and pass it the correct `qualifier_type'; this also does the error
8088         handling for us.
8089
8090 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8091
8092         * expression.cs (Invocation.EmitParams): If the we are dealing
8093         with a non-built-in value type, load its address as well.
8094
8095         (ArrayCreation): Use a a pretty constant instead
8096         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8097         static initializers.  
8098
8099         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8100         because they are not really value types, just glorified integers. 
8101
8102         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8103
8104         * ecore.cs: Remove redundant code for enumerations, make them use
8105         the same code path as everything else, fixes the casting issue
8106         with enumerations in Windows.Forms.
8107
8108         * attribute.cs: Do only cast to string if it is a string, the
8109         validation happens later.
8110
8111         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8112         people upgrade their corlibs.
8113
8114         * ecore.cs: Oops, enumerations were not following the entire code path
8115
8116 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8117
8118         * typemanager.cs (FilterWithClosure): Commented out the test for
8119         1540 in typemanager.cs, as it has problems when accessing
8120         protected methods from a parent class (see test-174.cs). 
8121
8122         * attribute.cs (Attribute.ValidateGuid): new method.
8123         (Attribute.Resolve): Use above.
8124
8125 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8126
8127         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8128
8129         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8130         handling for enumerations, as we only needed the TypeContainer
8131         functionality to begin with (this is required for the fix below to
8132         work for enums that reference constants in a container class for
8133         example). 
8134
8135         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8136
8137         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8138         a valid TypeBuilder to perform lookups on.o
8139
8140         * class.cs (InheritableMemberSignatureCompare): Use true in the
8141         call to GetGetMethod and GetSetMethod, because we are comparing
8142         the signature, and we need to get the methods *even* if they are
8143         private. 
8144
8145         (PropertyBase.CheckBase): ditto.
8146
8147         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8148         GotoCase.Resolve): Use Peel on EmpytCasts.
8149
8150         * ecore.cs (EmptyCast): drop child, add Peel method.
8151
8152 2002-11-17  Martin Baulig  <martin@ximian.com>
8153
8154         * ecore.cs (EmptyCast.Child): New public property.
8155
8156         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8157         label resolved to an EmptyCast.  Fixes #34162.
8158         (GotoCase.Resolve): Likewise.
8159         (Block.EmitMeta): Likewise.
8160
8161 2002-11-17  Martin Baulig  <martin@ximian.com>
8162
8163         * expression.cs (Invocation.BetterConversion): Prefer int over
8164         uint; short over ushort; long over ulong for integer literals.
8165         Use ImplicitConversionExists instead of StandardConversionExists
8166         since we also need to check for user-defined implicit conversions.
8167         Fixes #34165.  Added test-173.cs.
8168
8169 2002-11-16  Martin Baulig  <martin@ximian.com>
8170
8171         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8172         with the `true' and `false' literals.  Fixes #33151.
8173
8174 2002-11-16  Martin Baulig  <martin@ximian.com>
8175
8176         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8177         October 22nd; don't do the cs1540 check for static members.
8178
8179         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8180         now using our own filter here and doing the cs1540 check again.
8181
8182 2002-11-16  Martin Baulig  <martin@ximian.com>
8183
8184         * support.cs (InternalParameters): Don't crash if we don't have
8185         any fixed parameters.  Fixes #33532.
8186
8187 2002-11-16  Martin Baulig  <martin@ximian.com>
8188
8189         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8190         when looking up static methods to make this work on Windows.
8191         Fixes #33773.
8192
8193 2002-11-16  Martin Baulig  <martin@ximian.com>
8194
8195         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8196         a setter rather than using PropertyInfo.CanWrite.
8197
8198 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8199
8200         * class.cs: Allow acces to block member by subclasses. Fixes build
8201         breaker.
8202
8203 2002-11-14  Martin Baulig  <martin@ximian.com>
8204
8205         * class.cs (Constructor.Emit): Added the extern/block check.
8206         Fixes bug #33678.
8207
8208 2002-11-14  Martin Baulig  <martin@ximian.com>
8209
8210         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8211         iteration while looking for indexers, this is needed because the
8212         indexer may have a different name in our base classes.  Fixed the
8213         error reporting (no indexers at all, not get accessor, no
8214         overloaded match).  Fixes bug #33089.
8215         (IndexerAccess.DoResolveLValue): Likewise.
8216
8217 2002-11-14  Martin Baulig  <martin@ximian.com>
8218
8219         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8220         indexers.  Fixes the first part of bug #33089.
8221         (MethodSignature.InheritableMemberSignatureCompare): Added support
8222         for properties.
8223
8224 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8225
8226         * attribute.cs (Attribute.Resolve): Catch the
8227         NullReferenceException and report it since it isn't supposed to
8228         happen. 
8229
8230 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8231
8232         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8233         LogicalOr and LogicalAnd that can benefit from recursively
8234         handling EmitBranchable.  The code now should be nice for Paolo.
8235
8236 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8237
8238         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8239         the Type lookups, as we perform quite a number of lookups on
8240         non-Types.  This can be removed once we can deterministically tell
8241         whether we have a type or a namespace in advance.
8242
8243         But this might require special hacks from our corlib.
8244
8245         * TODO: updated.
8246
8247         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8248         and double which avoids a conversion from an integer to a double.
8249
8250         * expression.cs: tiny optimization, avoid calling IsConstant,
8251         because it effectively performs the lookup twice.
8252
8253 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8254
8255         But a bogus return here to keep the semantics of the old code
8256         until the Mono runtime is fixed.
8257
8258         * pending.cs (GetMissingInterfaces): New method used to remove all
8259         the interfaces that are already implemented by our parent
8260         classes from the list of pending methods. 
8261
8262         * interface.cs: Add checks for calls after ResolveTypeExpr.
8263
8264 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8265
8266         * class.cs (Class.Emit): Report warning 67: event not used if the
8267         warning level is beyond 3.
8268
8269         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8270         being a NullLiteral.
8271
8272         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8273         specifiers. 
8274
8275         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8276         path that might fail if a type can not be resolved.
8277
8278         * expression.cs (Binary.Emit): Emit unsigned versions of the
8279         operators. 
8280
8281         * driver.cs: use error 5.
8282
8283 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8284
8285         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8286
8287 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8288
8289         * cs-parser.jay (switch_section): A beautiful patch from Martin
8290         Baulig that fixed 33094.
8291
8292 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8293
8294         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8295         Check whether the base is abstract and report an error if so.
8296
8297         * expression.cs (IndexerAccess.DoResolveLValue,
8298         IndexerAccess.DoResolve): ditto. 
8299
8300         (Invocation.DoResolve): ditto.
8301
8302         (Invocation.FullMethodDesc): Improve the report string.
8303
8304         * statement.cs (Block): Eliminate IsVariableDefined as it is
8305         basically just a wrapper for GetVariableInfo.
8306
8307         * ecore.cs (SimpleName): Use new 
8308
8309         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8310         type, as we return the actual parameter ref/unref state on a
8311         different call.
8312
8313 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8314
8315         * support.cs: Return proper flags REF/OUT fixing the previous
8316         commit.  
8317
8318         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8319         not used to mean `ref' but `ref or out' in ParameterReference
8320
8321         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8322         full type signature instead of calling TypeManger.CSharpName
8323         ourselves. 
8324
8325         * support.cs (InternalParameters.ParameterDesc): Do not compare
8326         directly to the modflags, because REF/OUT will actually be bitsets
8327         if set. 
8328
8329         * delegate.cs (VerifyMethod): Check also the modifiers.
8330
8331         * cs-tokenizer.cs: Fix bug where floating point values with an
8332         exponent where a sign was missing was ignored.
8333
8334         * driver.cs: Allow multiple assemblies to be specified in a single
8335         /r: argument
8336
8337 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8338
8339         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8340         because identifiers after a parenthesis would end up in this kind
8341         of production, and we needed to desamiguate it for having casts
8342         like:
8343
8344                 (UserDefinedType *) xxx
8345
8346 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8347
8348         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8349         we should set on the Bindingflags.NonPublic, but not turn on
8350         private_ok.  private_ok controls whether a Private member is
8351         returned (this is chekced on the filter routine), while the
8352         BindingFlags.NonPublic just controls whether private/protected
8353         will be allowed.   This fixes the problem part of the problem of
8354         private properties being allowed to be used in derived classes.
8355
8356         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8357         so we can call the children DoResolveLValue method (this will
8358         properly signal errors on lvalue assignments to base properties)
8359
8360         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8361         getter are null, and we have a property info, we know that this
8362         happened because the lookup failed, so we report an error 122 for
8363         protection level violation.
8364
8365         We also silently return if setter and getter are null in the
8366         resolve functions, this condition only happens if we have flagged
8367         the error before.  This is the other half of the problem. 
8368
8369         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8370         not have accessibility information, that is why we were returning
8371         true in the filter function in typemanager.cs.
8372
8373         To properly report 122 (property is inaccessible because of its
8374         protection level) correctly, we report this error in ResolveAccess
8375         by failing if both the setter and the getter are lacking (ie, the
8376         lookup failed). 
8377
8378         DoResolve and DoLResolve have been modified to check for both
8379         setter/getter being null and returning silently, the reason being
8380         that I did not want to put the knowledge about this error in upper
8381         layers, like:
8382
8383         int old = Report.Errors;
8384         x = new PropertyExpr (...);
8385         if (old != Report.Errors)
8386                 return null;
8387         else
8388                 return x;
8389
8390         So the property expr is returned, but it is invalid, so the error
8391         will be flagged during the resolve process. 
8392
8393         * class.cs: Remove InheritablePropertySignatureCompare from the
8394         class, as we no longer depend on the property signature to compute
8395         whether it is possible to implement a method or not.
8396
8397         The reason is that calling PropertyInfo.GetGetMethod will return
8398         null (in .NET, in Mono it works, and we should change this), in
8399         cases where the Get Method does not exist in that particular
8400         class.
8401
8402         So this code:
8403
8404         class X { public virtual int A { get { return 1; } } }
8405         class Y : X { }
8406         class Z : Y { public override int A { get { return 2; } } }
8407
8408         Would fail in Z because the parent (Y) would not have the property
8409         defined.  So we avoid this completely now (because the alternative
8410         fix was ugly and slow), and we now depend exclusively on the
8411         method names.
8412
8413         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8414         reference method, instead of using the property.
8415
8416         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8417         routines are gone now.
8418
8419         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8420         names, they were incorrectly named.
8421
8422         * cs-tokenizer.cs: Return are more gentle token on failure. 
8423
8424         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8425         had an out-of-sync index variable, which caused it to remove from
8426         the list of pending methods the wrong method sometimes.
8427
8428 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8429
8430         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8431         CanWrite, because those refer to this particular instance of the
8432         property, and do not take into account the fact that we can
8433         override single members of a property.
8434
8435         Constructor requires an EmitContext.  The resolution process does
8436         not happen here, but we need to compute the accessors before,
8437         because the resolution does not always happen for properties.
8438
8439         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8440         subclass, before we did not update this flag, but we did update
8441         bindingflags. 
8442
8443         (GetAccessors): Drop this routine, as it did not work in the
8444         presence of partially overwritten set/get methods. 
8445
8446         Notice that this broke the cs1540 detection, but that will require
8447         more thinking. 
8448
8449 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8450
8451         * class.cs:
8452         * codegen.cs:
8453         * driver.cs: issue a warning instead of an error if we don't support
8454         debugging for the platform. Also ignore a couple of errors that may
8455         arise when trying to write the symbols. Undo my previous patch.
8456
8457 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8458
8459         * driver.cs: ignore /debug switch except for Unix platforms.
8460
8461 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8462
8463         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8464
8465 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8466
8467         * driver.cs: Do not make mcs-debug conditional, so we do not break
8468         builds that use it.
8469
8470         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8471         review this patch.  But basically after all the children variables
8472         have been merged, the value of "Breaks" was not being set to
8473         new_breaks for Switch blocks.  I think that it should be set after
8474         it has executed.  Currently I set this to the value of new_breaks,
8475         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8476         conservative, but I do not understand this code very well.
8477
8478         I did not break anything in the build, so that is good ;-)
8479
8480         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8481
8482 2002-10-20  Mark Crichton  <crichton@gimp.org>
8483
8484         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8485
8486 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8487
8488         * cfold.cs: Fixed compile blocker.
8489
8490 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8491
8492         * driver.cs: I was chekcing the key, not the file.
8493
8494 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8495
8496         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8497         message that we were generating - we just need to silently return
8498         a null.
8499
8500 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8501
8502         * class.cs (Event.Define): Change my previous commit, as this
8503         breaks the debugger.  This is a temporary hack, as it seems like
8504         the compiler is generating events incorrectly to begin with.
8505
8506         * expression.cs (Binary.ResolveOperator): Added support for 
8507         "U operator - (E x, E y)"
8508
8509         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8510         y)".
8511
8512         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8513         init-only variables, but this path did not take into account that
8514         there might be also instance readonly variables.  Correct this
8515         problem. 
8516
8517         This fixes bug 32253
8518
8519         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8520         delegates as well.
8521
8522         * driver.cs: Change the extension for modules to `netmodule'
8523
8524         * cs-parser.jay: Improved slightly the location tracking for
8525         the debugger symbols.
8526
8527         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8528         modifiers that were specified instead of the hardcoded value
8529         (FamAndAssem).  This was basically ignoring the static modifier,
8530         and others.  Fixes 32429.
8531
8532         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8533         fixed a bug in the process (32476)
8534
8535         * expression.cs (ArrayAccess.EmitAssign): Patch from
8536         hwang_rob@yahoo.ca that fixes bug 31834.3
8537
8538 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8539
8540         * driver.cs: Make the module extension .netmodule.
8541
8542 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8543
8544         * driver.cs: Report an error if the resource file is not found
8545         instead of crashing.
8546
8547         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8548         false, like Emit does.
8549
8550 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8551
8552         * typemanager.cs: Remove unused private member.  Also reported mcs
8553         bug to report this as a warning like csc.
8554
8555 2002-10-15  Martin Baulig  <martin@gnome.org>
8556
8557         * statement.cs (Statement.Emit): Made this a virtual method; emits
8558         the line number info and calls DoEmit().
8559         (Statement.DoEmit): New protected abstract method, formerly knows
8560         as Statement.Emit().
8561
8562         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8563
8564 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8565
8566         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8567         have fixed a remaining problem: not every AddXXXX was adding a
8568         fully qualified name.  
8569
8570         Now everyone registers a fully qualified name in the DeclSpace as
8571         being defined instead of the partial name.  
8572
8573         Downsides: we are slower than we need to be due to the excess
8574         copies and the names being registered this way.  
8575
8576         The reason for this is that we currently depend (on the corlib
8577         bootstrap for instance) that types are fully qualified, because
8578         we dump all the types in the namespace, and we should really have
8579         types inserted into the proper namespace, so we can only store the
8580         basenames in the defined_names array.
8581
8582 2002-10-10  Martin Baulig  <martin@gnome.org>
8583
8584         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8585         from bug #31834, see the bug report for a testcase which is
8586         miscompiled.
8587
8588 2002-10-10  Martin Baulig  <martin@gnome.org>
8589
8590         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8591         flow analysis code for this.
8592
8593         * statement.cs (Do, While, For): Tell the flow analysis code about
8594         infinite loops.
8595         (FlowBranching.UsageVector): Added support for infinite loops.
8596         (Block.Resolve): Moved the dead code elimination here and use flow
8597         analysis to do it.
8598
8599 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8600
8601         * class.cs (Field.Define): Catch cycles on struct type
8602         definitions. 
8603
8604         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8605         fields if the fields are static.  We only need to check instance
8606         fields. 
8607
8608         * expression.cs (As.DoResolve): Test for reference type.
8609
8610         * statement.cs (Using.ResolveExpression): Use
8611         ConvertImplicitRequired, not ConvertImplicit which reports an
8612         error on failture
8613         (Using.ResolveLocalVariableDecls): ditto.
8614
8615         * expression.cs (Binary.ResolveOperator): Report errors in a few
8616         places where we had to.
8617
8618         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8619
8620 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8621
8622         * expression.cs: Use StoreFromPtr instead of extracting the type
8623         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8624
8625         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8626         an enumeration value to a System.Enum, but System.Enum is not a
8627         value type, but an class type, so we need to box.
8628
8629         (Expression.ConvertExplicit): One codepath could return
8630         errors but not flag them.  Fix this.  Fixes #31853
8631
8632         * parameter.cs (Resolve): Do not allow void as a parameter type.
8633
8634 2002-10-06  Martin Baulig  <martin@gnome.org>
8635
8636         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8637         if it's a class type and not a struct.  Fixes #31815.
8638
8639 2002-10-06  Martin Baulig  <martin@gnome.org>
8640
8641         * statement.cs: Reworked the flow analysis code a bit to make it
8642         usable for dead code elimination.
8643
8644 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8645
8646         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8647
8648 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8649
8650         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8651         to fix the test 165, will investigate deeper.
8652
8653 2002-10-04  Martin Baulig  <martin@gnome.org>
8654
8655         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8656         finally blocks actually work.
8657         (Try.Resolve): We don't need to create a sibling for `finally' if
8658         there is no finally block.
8659
8660 2002-10-04  Martin Baulig  <martin@gnome.org>
8661
8662         * class.cs (Constructor.Define): The default accessibility for a
8663         non-default constructor is private, not public.
8664
8665 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8666
8667         * class.cs (Constructor): Make AllowedModifiers public, add
8668         EXTERN.
8669
8670         * cs-parser.jay: Perform the modifiers test here, as the
8671         constructor for the Constructor class usually receives a zero
8672         because of the way we create it (first we create, later we
8673         customize, and we were never checking the modifiers).
8674
8675         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8676         is a version of LookupTypeReflection that includes the type-name
8677         cache.  This can be used as a fast path for functions that know
8678         the fully qualified name and are only calling into *.GetType() to
8679         obtain a composed type.
8680
8681         This is also used by TypeManager.LookupType during its type
8682         composition.
8683
8684         (LookupType): We now also track the real type name, as sometimes
8685         we can get a quey for the real type name from things like
8686         ComposedCast.  This fixes bug 31422.
8687
8688         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8689         complete type fullname, it does not have to go through the type
8690         resolution system to obtain the composed version of the type (for
8691         obtaining arrays or pointers).
8692
8693         (Conditional.Emit): Use the EmitBoolExpression to
8694         generate nicer code, as requested by Paolo.
8695
8696         (ArrayCreation.CheckIndices): Use the patch from
8697         hwang_rob@yahoo.ca to validate the array initializers. 
8698
8699 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8700
8701         * class.cs (ConstructorInitializer.Emit): simplify code by using
8702         Invocation.EmitCall, and at the same time, fix the bugs in calling
8703         parent constructors that took variable arguments. 
8704
8705         * ecore.cs (Expression.ConvertNumericExplicit,
8706         Expression.ImplicitNumericConversion): Remove the code that
8707         manually wrapped decimal (InternalTypeConstructor call is now gone
8708         as well).
8709
8710         * expression.cs (Cast.TryReduce): Also handle decimal types when
8711         trying to perform a constant fold on the type.
8712
8713         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8714
8715         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8716         that only turned off an error report, and did nothing else. 
8717
8718 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8719
8720         * driver.cs: Handle and ignore /fullpaths
8721
8722 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8723
8724         * expression.cs (Binary.ResolveOperator): Catch the case where
8725         DoNumericPromotions returns true, 
8726
8727         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8728
8729 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8730
8731         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8732         report error 70.
8733
8734 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8735
8736         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8737         conversion exists, but it is also required that the conversion be
8738         performed.  This manifested in "(Type64Enum) 2".  
8739
8740         * class.cs (TypeManager.AddMethod): The fix is not to change
8741         AddEnum, because that one was using a fully qualified name (every
8742         DeclSpace derivative does), but to change the AddMethod routine
8743         that was using an un-namespaced name.  This now correctly reports
8744         the duplicated name.
8745
8746         Revert patch until I can properly fix it.  The issue
8747         is that we have a shared Type space across all namespaces
8748         currently, which is wrong.
8749
8750         Options include making the Namespace a DeclSpace, and merge
8751         current_namespace/current_container in the parser.
8752
8753 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8754
8755         * cs-parser.jay: Improve error reporting when we get a different
8756         kind of expression in local_variable_type and
8757         local_variable_pointer_type. 
8758
8759         Propagate this to avoid missleading errors being reported.
8760
8761         * ecore.cs (ImplicitReferenceConversion): treat
8762         TypeManager.value_type as a target just like object_type.   As
8763         code like this:
8764
8765         ValueType v = 1;
8766
8767         Is valid, and needs to result in the int 1 being boxed before it
8768         is assigned to the value type v.
8769
8770         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8771         to validate the enumeration name.
8772
8773         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8774         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8775         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8776
8777         * ecore.cs (TryImplicitIntConversion): When doing an
8778         implicit-enumeration-conversion, check if the type is 64-bits and
8779         perform a conversion before passing to EnumConstant.
8780
8781 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8782
8783         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8784         report ambiguous type references.  Unlike the MS version, we
8785         report what the ambiguity is.   Innovation at work ;-)
8786
8787         (DeclSpace.FindType): Require a location argument to
8788         display when we display an ambiguous error.
8789
8790         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8791
8792         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8793
8794         * expression.cs (EmitDynamicInitializers): Apply patch from
8795         hwang_rob@yahoo.ca that fixes the order in which we emit our
8796         initializers. 
8797
8798 2002-09-21  Martin Baulig  <martin@gnome.org>
8799
8800         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8801         delegate takes no arguments.
8802
8803 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8804
8805         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8806         from integers.
8807
8808         * expression.cs: Extract the underlying type.
8809
8810         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8811
8812         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8813
8814 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8815
8816         * class.cs (TypeContainer.DefineType): We can not use the nice
8817         PackingSize with the size set to 1 DefineType method, because it
8818         will not allow us to define the interfaces that the struct
8819         implements.
8820
8821         This completes the fixing of bug 27287
8822
8823         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8824         means also structs.  This fixes part of the problem. 
8825         (Expresion.ImplicitReferenceConversionExists): ditto.
8826
8827         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8828         error if there were no errors reported during the type lookup
8829         process, to avoid duplicates or redundant errors.  Without this
8830         you would get an ambiguous errors plus a type not found.  We have
8831         beaten the user enough with the first error.  
8832
8833         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8834         reference. 
8835
8836         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8837         during the resolution process, stop the lookup, this avoids
8838         repeated error reports (same error twice).
8839
8840         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8841
8842         * typemanager.cs (LookupType): Redo the type lookup code to match
8843         the needs of System.Reflection.  
8844
8845         The issue is that System.Reflection requires references to nested
8846         types to begin with a "+" sign instead of a dot.  So toplevel
8847         types look like: "NameSpace.TopLevelClass", and nested ones look
8848         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8849         levels. 
8850
8851 2002-09-19  Martin Baulig  <martin@gnome.org>
8852
8853         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8854         says that a method always returns or always throws an exception,
8855         don't report the CS0161.
8856
8857         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8858         set `Returns = new_returns'.
8859
8860 2002-09-19  Martin Baulig  <martin@gnome.org>
8861
8862         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8863         to an enum constant, check for a CS0176.
8864
8865 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8866
8867         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8868         for operators that must be in pairs and report errors.
8869
8870         * ecore.cs (SimpleName.DoResolveType): During the initial type
8871         resolution process, when we define types recursively, we must
8872         check first for types in our current scope before we perform
8873         lookups in the enclosing scopes.
8874
8875         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8876
8877         (Invocation.VerifyArgumentsCompat): Call
8878         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8879         I thought we were supposed to always call this, but there are a
8880         few places in the code where we dont do it.
8881
8882 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8883
8884         * driver.cs: Add support in -linkres and -resource to specify the
8885         name of the identifier.
8886
8887 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8888
8889         * ecore.cs (StandardConversionExists): Sync with the conversion
8890         code: allow anything-* to void* conversions.
8891
8892         (FindMostSpecificSource): Use an Expression argument
8893         instead of a Type, because we might be handed over a Literal which
8894         gets a few more implicit conversions that plain types do not.  So
8895         this information was being lost.
8896
8897         Also, we drop the temporary type-holder expression when not
8898         required.
8899
8900 2002-09-17  Martin Baulig  <martin@gnome.org>
8901
8902         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8903         this is an explicit interface implementation.
8904
8905 2002-09-17  Martin Baulig  <martin@gnome.org>
8906
8907         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8908         different `IndexerName' attributes.
8909
8910         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8911         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8912         virtual CommonResolve().
8913
8914 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8915
8916         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8917         and convert that to the UnderlyingType.
8918
8919         * statement.cs (Foreach.Resolve): Indexers are just like variables
8920         or PropertyAccesses.
8921
8922         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8923         inside quoted strings, we were not doing this before.
8924
8925 2002-09-16  Martin Baulig  <martin@gnome.org>
8926
8927         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8928         resolve it.  This is needed for the definite assignment check of the
8929         instance expression, fixes bug #29846.
8930         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8931
8932 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8933
8934         * parameter.cs: Fix compile error.  Cannot reference static member
8935         from an instance object.  Is this an mcs bug?
8936
8937 2002-09-14  Martin Baulig  <martin@gnome.org>
8938
8939         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8940         multiple times.  Fixes bug #30295, added test-166.cs.
8941
8942 2002-09-14  Martin Baulig  <martin@gnome.org>
8943
8944         * statement.cs (Block.Emit): Don't emit unreachable code.
8945         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8946         `break' statements.
8947         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8948
8949 2002-09-14  Martin Baulig  <martin@gnome.org>
8950
8951         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8952         is set.
8953
8954 2002-09-14  Martin Baulig  <martin@gnome.org>
8955
8956         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8957         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8958         be false on the ms runtime.
8959
8960 2002-09-13  Martin Baulig  <martin@gnome.org>
8961
8962         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8963         the CS0038 error message.
8964
8965 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8966
8967         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8968         constant inside, return it.
8969
8970 2002-09-12  Martin Baulig  <martin@gnome.org>
8971
8972         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8973         implicit conversion can be done between enum types.
8974
8975         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8976         check whether an implicit conversion to the current enum's UnderlyingType
8977         exists and report an error if not.
8978
8979         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8980         without debugging support.
8981
8982         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8983         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8984
8985 2002-09-12  Martin Baulig  <martin@gnome.org>
8986
8987         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8988
8989         * ecore.cs (IMemberExpr.DeclaringType): New property.
8990         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8991         nonstatic member of an outer type (CS0038).
8992
8993 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8994
8995         * driver.cs: Activate the using-error detector at warning level
8996         4 (at least for MS-compatible APIs).
8997
8998         * namespace.cs (VerifyUsing): Small buglett fix.
8999
9000         * pending.cs (PendingImplementation): pass the container pointer. 
9001
9002         * interface.cs (GetMethods): Allow for recursive definition.  Long
9003         term, I would like to move every type to support recursive
9004         definitions, not the current ordering mechanism that we have right
9005         now.
9006
9007         The situation is this: Attributes are handled before interfaces,
9008         so we can apply attributes to interfaces.  But some attributes
9009         implement interfaces, we will now handle the simple cases
9010         (recursive definitions will just get an error).  
9011
9012         * parameter.cs: Only invalidate types at the end if we fail to
9013         lookup all types.  
9014
9015 2002-09-09  Martin Baulig  <martin@gnome.org>
9016
9017         * ecore.cs (PropertyExpr.Emit): Also check for
9018         TypeManager.system_int_array_get_length so this'll also work when
9019         compiling corlib.  Fixes #30003.
9020
9021 2002-09-09  Martin Baulig  <martin@gnome.org>
9022
9023         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9024         and throw an exception if we can't get the type's size.  Fixed #30040,
9025         added test-165.cs.
9026
9027 2002-09-09  Martin Baulig  <martin@gnome.org>
9028
9029         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9030
9031         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9032         context.  Fixes bug #30027.
9033
9034         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9035         virtual functions.  Fixes bug #30043, added test-164.cs.
9036
9037 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9038
9039         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9040
9041 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9042
9043         * driver.cs: Use an object to get the windows codepage since it's not a
9044         static property.
9045
9046 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9047
9048         * statement.cs (For.Emit): for infinite loops (test == null)
9049         return whether there is a break inside, not always "true".
9050
9051         * namespace.cs (UsingEntry): New struct to hold the name of the
9052         using definition, the location where it is defined, and whether it
9053         has been used in a successful type lookup.
9054
9055         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9056         strings.
9057
9058         * decl.cs: ditto.
9059
9060 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9061
9062         * attribute.cs : Fix incorrect code which relied on catching
9063         a NullReferenceException to detect a null being passed in
9064         where an object was expected.
9065
9066 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9067
9068         * statement.cs (Try): flag the catch variable as assigned
9069
9070         * expression.cs (Cast): Simplified by using ResolveType instead of
9071         manually resolving.
9072
9073         * statement.cs (Catch): Fix bug by using ResolveType.
9074
9075 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9076
9077         * expression.cs (BetterConversion): Special case for when we have
9078         a NullLiteral as the argument and we have to choose between string
9079         and object types - we choose string the way csc does.
9080
9081         * attribute.cs (Attribute.Resolve): Catch the
9082         NullReferenceException and report error #182 since the Mono
9083         runtime no more has the bug and having this exception raised means
9084         we tried to select a constructor which takes an object and is
9085         passed a null.
9086
9087 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9088
9089         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9090         message (1502, 1503) when we can't locate a method after overload
9091         resolution. This is much more informative and closes the bug
9092         Miguel reported.
9093
9094         * interface.cs (PopulateMethod): Return if there are no argument
9095         types. Fixes a NullReferenceException bug.
9096
9097         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9098         expressions too. Previously we were checking only in one place for
9099         positional arguments leaving out named arguments.
9100
9101         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9102         type to the enum type is not allowed. Remove code corresponding to
9103         that.
9104
9105         (ConvertNumericExplicit): Allow explicit conversions from
9106         the underlying type to enum type. This precisely follows the spec
9107         and closes a bug filed by Gonzalo.
9108
9109 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9110
9111         * compiler.csproj:
9112         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9113
9114 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9115
9116         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9117         it was important that we stored the right value after the
9118         reduction in `converted'.
9119
9120 2002-09-04  Martin Baulig  <martin@gnome.org>
9121
9122         * location.cs (Location.SymbolDocument): Use full pathnames for the
9123         source files.
9124
9125 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9126
9127         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9128         of the expression resolve mechanism, because that will catch the
9129         SimpleName error failures.
9130
9131         (Conditional): If we can not resolve the
9132         expression, return, do not crash.
9133
9134 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9135
9136         * cs-tokenizer.cs:
9137         (location): display token name instead of its number.
9138
9139 2002-08-28  Martin Baulig  <martin@gnome.org>
9140
9141         * expression.cs (Binary.ResolveOperator): Don't silently return
9142         but return an error if an operator cannot be applied between two
9143         enum types.
9144
9145 2002-08-28  Martin Baulig  <martin@gnome.org>
9146
9147         * class.cs (Constructor.Define): Set the permission attributes
9148         correctly instead of making all constructors public.
9149
9150 2002-08-28  Martin Baulig  <martin@gnome.org>
9151
9152         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9153         for private members before reporting a CS0103; if we find anything,
9154         it's a CS0122.
9155
9156 2002-08-28  Martin Baulig  <martin@gnome.org>
9157
9158         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9159         to check whether `closure_start_type == closure_invocation_type',
9160         we also need to check whether `m.DeclaringType == closure_invocation_type'
9161         before bypassing the permission checks.  We might be accessing
9162         protected/private members from the base class.
9163         (TypeManager.RealMemberLookup): Only set private_ok if private
9164         members were requested via BindingFlags.NonPublic.
9165
9166         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9167
9168         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9169         MethodGroupExpr.IsExplicitImpl if appropriate.
9170         (Invocation.DoResolve): Don't report the CS0120 for explicit
9171         interface implementations.
9172
9173 2002-08-27  Martin Baulig  <martin@gnome.org>
9174
9175         * expression.cs (Invocation.DoResolve): If this is a static
9176         method and we don't have an InstanceExpression, we must report
9177         a CS0120.
9178
9179 2002-08-25  Martin Baulig  <martin@gnome.org>
9180
9181         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9182         `==' between a valuetype and an object.
9183
9184 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9185
9186         * ecore.cs (TypeExpr): Provide a ToString method.
9187
9188 2002-08-24  Martin Baulig  <martin@gnome.org>
9189
9190         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9191         now called proggie.dbg and it's a binary file.
9192
9193 2002-08-23  Martin Baulig  <martin@gnome.org>
9194
9195         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9196
9197 2002-08-23  Martin Baulig  <martin@gnome.org>
9198
9199         * struct.cs (MyStructInfo.ctor): Make this work with empty
9200         structs; it's not allowed to use foreach() on null.
9201
9202 2002-08-23  Martin Baulig  <martin@gnome.org>
9203
9204         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9205         writer the full pathname of the generated assembly.
9206
9207 2002-08-23  Martin Baulig  <martin@gnome.org>
9208
9209         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9210         A `finally' block never returns or breaks; improved handling of
9211         unreachable code.
9212
9213 2002-08-23  Martin Baulig  <martin@gnome.org>
9214
9215         * statement.cs (Throw.Resolve): Allow `throw null'.
9216
9217 2002-08-23  Martin Baulig  <martin@gnome.org>
9218
9219         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9220         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9221         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9222         MemberLookup would return a wrong event if this is an explicit
9223         interface implementation and the class has an event with the same
9224         name.
9225
9226 2002-08-23  Martin Baulig  <martin@gnome.org>
9227
9228         * statement.cs (Block.AddChildVariableNames): New public method.
9229         (Block.AddChildVariableName): Likewise.
9230         (Block.IsVariableNameUsedInChildBlock): Likewise.
9231         (Block.AddVariable): Check whether a variable name has already
9232         been used in a child block.
9233
9234         * cs-parser.jay (declare_local_variables): Mark all variable names
9235         from the current block as being used in a child block in the
9236         implicit block.
9237
9238 2002-08-23  Martin Baulig  <martin@gnome.org>
9239
9240         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9241         find the symbol writer.
9242
9243         * driver.cs: csc also allows the arguments to /define being
9244         separated by commas, not only by semicolons.
9245
9246 2002-08-23  Martin Baulig  <martin@gnome.org>
9247
9248         * interface.cs (Interface.GetMembers): Added static check for events.
9249
9250 2002-08-15  Martin Baulig  <martin@gnome.org>
9251
9252         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9253         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9254
9255         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9256         why the MethodData.EmitDestructor() change was necessary.
9257
9258 2002-08-20  Martin Baulig  <martin@gnome.org>
9259
9260         * class.cs (TypeContainer.FindMembers): Added static check for events.
9261
9262         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9263
9264         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9265         use Type.GetEvents(), not Type.FindMembers().
9266
9267 2002-08-20  Martin Baulig  <martin@gnome.org>
9268
9269         * decl.cs (MemberCache): Added a special method cache which will
9270         be used for method-only searched.  This ensures that a method
9271         search will return a MethodInfo with the correct ReflectedType for
9272         inherited methods.      
9273
9274 2002-08-20  Martin Baulig  <martin@gnome.org>
9275
9276         * decl.cs (DeclSpace.FindMembers): Made this public.
9277
9278 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9279
9280         * delegate.cs: fixed build on windows.
9281         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9282
9283 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9284
9285         * ecore.cs (StandardConversionExists): Return a false
9286         if we are trying to convert the void type to anything else
9287         since that is not allowed.
9288
9289         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9290         we flag error 70 in the event an event is trying to be accessed
9291         directly from outside the declaring type.
9292
9293 2002-08-20  Martin Baulig  <martin@gnome.org>
9294
9295         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9296         MemberCache from typemanager.cs to decl.cs.
9297
9298 2002-08-19  Martin Baulig  <martin@gnome.org>
9299
9300         * class.cs (TypeContainer): Implement IMemberContainer.
9301         (TypeContainer.DefineMembers): Create the MemberCache.
9302         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9303         return public members if BindingFlags.Public was given, check
9304         whether members are static.
9305
9306 2002-08-16  Martin Baulig  <martin@gnome.org>
9307
9308         * decl.cs (DeclSpace.Define): Splitted this in Define and
9309         DefineMembers.  DefineMembers is called first and initializes the
9310         MemberCache.
9311
9312         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9313         DefineMembers() on all our DeclSpaces.
9314
9315         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9316         but call DefineMembers() on all nested interfaces.  We call their
9317         Define() in our new Define() function.
9318
9319         * interface.cs (Interface): Implement IMemberContainer.
9320         (Interface.Define): Moved all code except the attribute stuf to
9321         DefineMembers().
9322         (Interface.DefineMembers): Initialize the member cache.
9323
9324         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9325         need this anymore since we can use MemberCache.FindMembers directly.
9326
9327 2002-08-19  Martin Baulig  <martin@gnome.org>
9328
9329         * typemanager.cs (MemberCache): When creating the cache for an
9330         interface type, add all inherited members.
9331         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9332         to `out bool used_cache' and documented it.
9333         (TypeManager.MemberLookup): If we already used the cache in the first
9334         iteration, we don't need to do the interfaces check.
9335
9336 2002-08-19  Martin Baulig  <martin@gnome.org>
9337
9338         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9339         here from IMemberFinder and don't implement this interface anymore.
9340         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9341
9342         * typemanager.cs (IMemberFinder): This interface is now only used by
9343         classes which actually support the member cache.
9344         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9345         since we only put DeclSpaces into this Hashtable.
9346         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9347         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9348
9349 2002-08-16  Martin Baulig  <martin@gnome.org>
9350
9351         * typemanager.cs (ICachingMemberFinder): Removed.
9352         (IMemberFinder.MemberCache): New property.
9353         (TypeManager.FindMembers): Merged this with RealFindMembers().
9354         This function will never be called from TypeManager.MemberLookup()
9355         so we can't use the cache here, just the IMemberFinder.
9356         (TypeManager.MemberLookup_FindMembers): Check whether the
9357         IMemberFinder has a MemberCache and call the cache's FindMembers
9358         function.
9359         (MemberCache): Rewrote larger parts of this yet another time and
9360         cleaned it up a bit.
9361
9362 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9363
9364         * driver.cs (LoadArgs): Support quoting.
9365
9366         (Usage): Show the CSC-like command line arguments.
9367
9368         Improved a few error messages.
9369
9370 2002-08-15  Martin Baulig  <martin@gnome.org>
9371
9372         * typemanager.cs (IMemberContainer.Type): New property.
9373         (IMemberContainer.IsInterface): New property.
9374
9375         The following changes are conditional to BROKEN_RUNTIME, which is
9376         defined at the top of the file.
9377
9378         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9379         class'es members, but add all members from TypeHandle.ObjectType
9380         if we're an interface.
9381         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9382         is the current type.
9383         (MemberCache.CacheEntry.Container): Removed this field.
9384         (TypeHandle.GetMembers): Include inherited members.
9385
9386 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9387
9388         * typemanager.cs: fixed compilation and added a comment on a field that
9389         is never used.
9390
9391 2002-08-15  Martin Baulig  <martin@gnome.org>
9392
9393         * class.cs (ConstructorInitializer.Resolve): In the
9394         Expression.MemberLookup call, use the queried_type as
9395         invocation_type.
9396
9397         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9398         declared' attribute, it's always true.
9399         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9400         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9401         temporary wrapper for FindMembers which tells MemberLookup whether
9402         members from the base classes are included in the return value.
9403         This will go away soon.
9404         (TypeManager.MemberLookup): Use this temporary hack here; once the
9405         new MemberCache is completed, we don't need to do the DeclaredOnly
9406         looping here anymore since the MemberCache will take care of this.
9407         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9408         (MemberCache): When creating the MemberCache for a class, get
9409         members from the current class and all its base classes.
9410         (MemberCache.CacheEntry.Container): New field.  This is a
9411         temporary hack until the Mono runtime is fixed to distinguish
9412         between ReflectedType and DeclaringType.  It allows us to use MCS
9413         with both the MS runtime and the unfixed Mono runtime without
9414         problems and without accecting performance.
9415         (MemberCache.SearchMembers): The DeclaredOnly looping from
9416         TypeManager.MemberLookup is now done here.      
9417
9418 2002-08-14  Martin Baulig  <martin@gnome.org>
9419
9420         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9421         Type.GetFields on dynamic types but get the fields from the
9422         corresponding TypeContainer.
9423         (MyStructInfo.GetStructInfo): Added check for enum types.
9424
9425         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9426         (MemberList.SyncRoot): Implemented.
9427         (TypeManager.FilterWithClosure): No need to check permissions if
9428         closure_start_type == closure_invocation_type, don't crash if
9429         closure_invocation_type is null.
9430
9431 2002-08-13  Martin Baulig  <martin@gnome.org>
9432
9433         Rewrote TypeContainer.FindMembers to use a member cache.  This
9434         gives us a speed increase of about 35% for the self-hosting MCS
9435         build and of about 15-20% for the class libs (both on GNU/Linux).
9436
9437         * report.cs (Timer): New class to get enhanced profiling.  This
9438         whole class is "TIMER" conditional since it remarkably slows down
9439         compilation speed.
9440
9441         * class.cs (MemberList): New class.  This is an IList wrapper
9442         which we're now using instead of passing MemberInfo[]'s around to
9443         avoid copying this array unnecessarily.
9444         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9445         (ICachingMemberFinder, IMemberContainer): New interface.
9446         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9447         has already been checked, otherwise use it for the name comparision.
9448         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9449         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9450         if possible.  Returns a MemberList, not a MemberInfo [].
9451         (TypeHandle): New class, implements IMemberContainer.  We create
9452         one instance of this class per type, it contains a MemberCache
9453         which is used to do the member lookups.
9454         (MemberCache): New class.  Each instance of this class contains
9455         all members of a type and a name-based hash table.
9456         (MemberCache.FindMembers): This is our new member lookup
9457         function.  First, it looks up all members of the requested name in
9458         the hash table.  Then, it walks this list and sorts out all
9459         applicable members and returns them.
9460
9461 2002-08-13  Martin Baulig  <martin@gnome.org>
9462
9463         In addition to a nice code cleanup, this gives us a performance
9464         increase of about 1.4% on GNU/Linux - not much, but it's already
9465         half a second for the self-hosting MCS compilation.
9466
9467         * typemanager.cs (IMemberFinder): New interface.  It is used by
9468         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9469         Enum, Delegate or Interface.
9470         (TypeManager.finder_to_member_finder): New PtrHashtable.
9471         (TypeManager.finder_to_container): Removed.
9472         (TypeManager.finder_to_delegate): Removed.
9473         (TypeManager.finder_to_interface): Removed.
9474         (TypeManager.finder_to_enum): Removed.
9475
9476         * interface.cs (Interface): Implement IMemberFinder.
9477
9478         * delegate.cs (Delegate): Implement IMemberFinder.
9479
9480         * enum.cs (Enum): Implement IMemberFinder.
9481
9482         * class.cs (TypeContainer): Implement IMemberFinder.
9483
9484 2002-08-12  Martin Baulig  <martin@gnome.org>
9485
9486         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9487
9488 2002-08-12  Martin Baulig  <martin@gnome.org>
9489
9490         * ecore.cs (ITypeExpression): New interface for expressions which
9491         resolve to a type.
9492         (TypeExpression): Renamed to TypeLookupExpression.
9493         (Expression.DoResolve): If we're doing a types-only lookup, the
9494         expression must implement the ITypeExpression interface and we
9495         call DoResolveType() on it.
9496         (SimpleName): Implement the new ITypeExpression interface.
9497         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9498         hack, the situation that we're only looking up types can't happen
9499         anymore when this method is called.  Moved the type lookup code to
9500         DoResolveType() and call it.
9501         (SimpleName.DoResolveType): This ITypeExpression interface method
9502         is now doing the types-only lookup.
9503         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9504         (ResolveFlags): Added MaskExprClass.
9505
9506         * expression.cs (MemberAccess): Implement the ITypeExpression
9507         interface.
9508         (MemberAccess.DoResolve): Added support for a types-only lookup
9509         when we're called via ITypeExpression.DoResolveType().
9510         (ComposedCast): Implement the ITypeExpression interface.
9511
9512         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9513         Expression.Resolve() with ResolveFlags.Type instead.
9514
9515 2002-08-12  Martin Baulig  <martin@gnome.org>
9516
9517         * interface.cs (Interface.Define): Apply attributes.
9518
9519         * attribute.cs (Attribute.ApplyAttributes): Added support for
9520         interface attributes.
9521
9522 2002-08-11  Martin Baulig  <martin@gnome.org>
9523
9524         * statement.cs (Block.Emit): Only check the "this" variable if we
9525         do not always throw an exception.
9526
9527         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9528         whether the property has a set accessor.
9529
9530 2002-08-11  Martin Baulig  <martin@gnome.org>
9531
9532         Added control flow analysis support for structs.
9533
9534         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9535         with control flow analysis turned off.
9536         (IVariable): New interface.
9537         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9538         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9539         (FieldExpr.DoResolve): Resolve the instance expression with flow
9540         analysis turned off and do the definite assignment check after the
9541         resolving when we know what the expression will resolve to.
9542
9543         * expression.cs (LocalVariableReference, ParameterReference):
9544         Implement the new IVariable interface, only call the flow analysis
9545         code if ec.DoFlowAnalysis is true.
9546         (This): Added constructor which takes a Block argument.  Implement
9547         the new IVariable interface.
9548         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9549         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9550         This does the definite assignment checks for struct members.
9551
9552         * class.cs (Constructor.Emit): If this is a non-static `struct'
9553         constructor which doesn't have any initializer, call
9554         Block.AddThisVariable() to tell the flow analysis code that all
9555         struct elements must be initialized before control returns from
9556         the constructor.
9557
9558         * statement.cs (MyStructInfo): New public class.
9559         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9560         argument to this indexer.  If non-zero, check an individual struct
9561         member, not the whole struct.
9562         (FlowBranching.CheckOutParameters): Check struct members.
9563         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9564         overloaded versions of these methods which take an additional
9565         `int field_idx' argument to check struct members.
9566         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9567         overloaded versions of these methods which take an additional
9568         `string field_name' argument to check struct member.s
9569         (VariableInfo): Implement the IVariable interface.
9570         (VariableInfo.StructInfo): New public property.  Returns the
9571         MyStructInfo instance of the variable if it's a struct or null.
9572         (Block.AddThisVariable): New public method.  This is called from
9573         Constructor.Emit() for non-static `struct' constructor which do
9574         not have any initializer.  It creates a special variable for the
9575         "this" instance variable which will be checked by the flow
9576         analysis code to ensure that all of the struct's fields are
9577         initialized before control returns from the constructor.
9578         (UsageVector): Added support for struct members.  If a
9579         variable/parameter is a struct with N members, we reserve a slot
9580         in the usage vector for each member.  A struct is considered fully
9581         initialized if either the struct itself (slot 0) or all its
9582         members are initialized.
9583
9584 2002-08-08  Martin Baulig  <martin@gnome.org>
9585
9586         * driver.cs (Driver.MainDriver): Only report an error CS5001
9587         if there were no compilation errors.
9588
9589         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9590         `UnsafeContext' property to determine whether the parent is in
9591         unsafe context rather than checking the parent's ModFlags:
9592         classes nested in an unsafe class are unsafe as well.
9593
9594 2002-08-08  Martin Baulig  <martin@gnome.org>
9595
9596         * statement.cs (UsageVector.MergeChildren): Distinguish between
9597         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9598         we return.  Added test17() and test18() to test-154.cs.
9599
9600 2002-08-08  Martin Baulig  <martin@gnome.org>
9601
9602         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9603         Family access, make sure the invoking type isn't a subclass of the
9604         queried type (that'd be a CS1540).
9605
9606         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9607         this method which takes an additional `Type invocation_type'.
9608
9609         * expression.cs (BaseAccess.DoResolve): Use the base type as
9610         invocation and query type.
9611         (MemberAccess.DoResolve): If the lookup failed and we're about to
9612         report a CS0122, try a lookup with the ec.ContainerType - if this
9613         succeeds, we must report a CS1540.
9614
9615 2002-08-08  Martin Baulig  <martin@gnome.org>
9616
9617         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9618         (MethodGroupExpr): Implement the IMemberExpr interface.
9619
9620         * expression (MemberAccess.ResolveMemberAccess): No need to have
9621         any special code for MethodGroupExprs anymore, they're now
9622         IMemberExprs.   
9623
9624 2002-08-08  Martin Baulig  <martin@gnome.org>
9625
9626         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9627         Family, FamANDAssem and FamORAssem permissions.
9628         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9629
9630 2002-08-08  Martin Baulig  <martin@gnome.org>
9631
9632         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9633         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9634         or loop block.
9635
9636 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9637
9638         * driver.cs: implemented /resource option to embed managed resources.
9639
9640 2002-08-07  Martin Baulig  <martin@gnome.org>
9641
9642         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9643         (FieldBase.HasFieldInitializer): New public property.
9644         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9645         returns the field initializer and makes sure it is only resolved once.
9646         (TypeContainer.EmitFieldInitializers): Call
9647         FieldBase.GetInitializerExpression to get the initializer, this ensures
9648         that it isn't resolved multiple times.
9649
9650         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9651         the resolving process (SimpleName/MemberLookup) that we're currently
9652         emitting a field initializer (which must not access any instance members,
9653         this is an error CS0236).
9654
9655         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9656         argument, if the `IsFieldInitializer' flag is set, we must report and
9657         error CS0236 and not an error CS0120.   
9658
9659 2002-08-07  Martin Baulig  <martin@gnome.org>
9660
9661         * ecore.cs (IMemberExpr): New public interface.
9662         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9663         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9664         if the expression is an IMemberExpr.
9665
9666         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9667         to be null, implicitly default to `this' if we're non-static in
9668         this case.  Simplified the code a lot by using the new IMemberExpr
9669         interface.  Also fixed bug #28176 here.
9670
9671 2002-08-06  Martin Baulig  <martin@gnome.org>
9672
9673         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9674         ParameterReferences during semantic analysis so that we can do a
9675         type-only search when resolving Cast, TypeOf and SizeOf.
9676         (block): Pass the `current_local_parameters' to the Block's
9677         constructor.
9678
9679         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9680         argument to the constructor.
9681         (ConstructorInitializer.Resolve): Create a temporary implicit
9682         block with the parameters.
9683
9684         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9685         references here if we aren't doing a type-only search.
9686
9687         * statement.cs (Block): Added constructor which takes a
9688         `Parameters parameters' argument.
9689         (Block.Parameters): New public property.
9690
9691         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9692         to `Parameters' and made it public readonly.
9693
9694 2002-08-06  Martin Baulig  <martin@gnome.org>
9695
9696         * ecore.cs (Expression.Warning): Made this public as well.
9697
9698         * report.cs (Report.Debug): Print the contents of collections.
9699
9700 2002-08-06  Martin Baulig  <martin@gnome.org>
9701
9702         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9703         used to tell Resolve() which kinds of expressions it may return.
9704         (Expression.Resolve): Added overloaded version of this method which
9705         takes a `ResolveFlags flags' argument.  This can be used to tell
9706         Resolve() which kinds of expressions it may return.  Reports a
9707         CS0118 on error.
9708         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9709         ResolveFlags.SimpleName.
9710         (Expression.Error118): Added overloaded version of this method which
9711         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9712         which kinds of expressions are allowed.
9713
9714         * expression.cs (Argument.ResolveMethodGroup): New public method.
9715         Resolves an argument, but allows a MethodGroup to be returned.
9716         This is used when invoking a delegate.
9717
9718         * TODO: Updated a bit.
9719
9720 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9721
9722         Fixed compilation with csc.
9723
9724         * ecore.cs: Expression.Error made public. Is this correct? Should
9725         Warning be made public too?
9726
9727         * expression.cs: use ea.Location instead of ea.loc.
9728         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9729
9730 2002-08-06  Martin Baulig  <martin@gnome.org>
9731
9732         * ecore.cs (Expression.loc): Moved the location here instead of
9733         duplicating it in all derived classes.
9734         (Expression.Location): New public property.
9735         (Expression.Error, Expression.Warning): Made them non-static and
9736         removed the location argument.
9737         (Expression.Warning): Added overloaded version which takes an
9738         `int level' argument.
9739         (Expression.Error118): Make this non-static and removed the
9740         expression and location arguments.
9741         (TypeExpr): Added location argument to the constructor.
9742
9743         * expression.cs (StaticCallExpr): Added location argument to
9744         the constructor.
9745         (Indirection, PointerArithmetic): Likewise.
9746         (CheckedExpr, UnCheckedExpr): Likewise.
9747         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9748         (StringPtr): Likewise.
9749
9750
9751 2002-08-05  Martin Baulig  <martin@gnome.org>
9752
9753         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9754
9755         * assign.cs (Assign.DoResolve): Check whether the source
9756         expression is a value or variable.
9757
9758         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9759         while resolving the corresponding blocks.
9760
9761         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9762         an error, don't silently return null.
9763
9764         * statement.cs (Block.AddVariable): Do the error reporting here
9765         and distinguish between CS0128 and CS0136.
9766         (Block.DoResolve): Report all unused labels (warning CS0164).
9767         (LabeledStatement): Pass the location to the constructor.
9768         (LabeledStatement.HasBeenReferenced): New property.
9769         (LabeledStatement.Resolve): Set it to true here.
9770
9771         * statement.cs (Return.Emit): Return success even after reporting
9772         a type mismatch error (CS0126 or CS0127), this is what csc does and
9773         it avoids confusing the users with any consecutive errors.
9774
9775 2002-08-05  Martin Baulig  <martin@gnome.org>
9776
9777         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9778
9779         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9780
9781         * expression.cs (MemberAccess.DoResolve): Silently return if an
9782         error has already been reported.
9783
9784         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9785         error has already been reported.
9786
9787 2002-08-05  Martin Baulig  <martin@gnome.org>
9788
9789         * statement.cs (UsageVector): Only initialize the `parameters'
9790         vector if we actually have any "out" parameters.
9791
9792 2002-08-05  Martin Baulig  <martin@gnome.org>
9793
9794         * expression.cs (Binary.ResolveOperator): When combining delegates,
9795         they must have the same type.
9796
9797 2002-08-05  Martin Baulig  <martin@gnome.org>
9798
9799         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9800         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9801         work with the ms runtime and we also don't need it: if we're a
9802         PropertyBuilder and not in the `indexer_arguments' hash, then we
9803         are a property and not an indexer.
9804
9805         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9806         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9807         since the latter one doesn't work with the ms runtime.
9808
9809 2002-08-03  Martin Baulig  <martin@gnome.org>
9810
9811         Fixed bugs #27998 and #22735.
9812
9813         * class.cs (Method.IsOperator): New public field.
9814         (Method.CheckBase): Report CS0111 if there's already a method
9815         with the same parameters in the current class.  Report CS0508 when
9816         attempting to change the return type of an inherited method.
9817         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9818         and it's not marked abstract or extern.
9819         (PropertyBase): New abstract base class for Property and Indexer.
9820         (PropertyBase.CheckBase): Moved here from Property and made it work
9821         for indexers.
9822         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9823         the same so we can reuse it there.
9824         (Property, Indexer): Derive from PropertyBase.
9825         (MethodSignature.inheritable_property_signature_filter): New delegate
9826         to find properties and indexers.
9827
9828         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9829         argument and improved error reporting.
9830
9831         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9832         EmptyReadOnlyParameters and made it a property.
9833
9834         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9835         version of this method which takes a `PropertyInfo indexer'.
9836         (TypeManager.RegisterIndexer): New method.
9837
9838         * class.cs: Added myself as author of this file :-)
9839
9840 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9841
9842         * class.cs: fixed compilation on windoze.
9843
9844 2002-08-03  Martin Baulig  <martin@gnome.org>
9845
9846         * interface.cs (Interface.GetInterfaceBases): Check whether all
9847         base interfaces are at least as accessible than the current one.
9848
9849         * class.cs (TypeContainer.GetClassBases): Check whether base types
9850         are at least as accessible than the current type.
9851         (TypeContainer.AsAccessible): Implemented and made non-static.
9852         (MemberBase.CheckParameters): Report errors if the accessibility
9853         checks fail.
9854
9855         * delegate.cs (Delegate.Delegate): The default visibility is
9856         internal for top-level types and private for nested types.
9857         (Delegate.Define): Report errors if the accessibility checks fail.
9858
9859         * enum.cs (Enum.Enum): The default visibility is internal for
9860         top-level types and private for nested types.
9861         (Enum.DefineType): Compute the correct visibility.
9862
9863         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9864         function which takes a `bool is_toplevel' instead of a TypeContainer.
9865
9866         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9867         builtin type.
9868
9869 2002-08-02  Martin Baulig  <martin@gnome.org>
9870
9871         * expression.cs (LocalVariableReferenc): Added constructor which
9872         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9873         (LocalVariableReference.IsReadOnly): New property.
9874         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9875         variable is readonly, use our own readonly flag to do this; you can
9876         use the new constructor to get a writable reference to a read-only
9877         variable.
9878
9879         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9880         reference to the local variable.
9881
9882 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9883
9884         * rootcontext.cs (ResolveCore): Also include System.Exception
9885
9886         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9887         we reach an EmptyStatement.
9888
9889         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9890         is also fine.
9891
9892         * expression.cs (Binary.ResolveOperator): Check error result in
9893         two places.
9894
9895         use brtrue/brfalse directly and avoid compares to null.
9896
9897 2002-08-02  Martin Baulig  <martin@gnome.org>
9898
9899         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9900         Fixes bug #28407, added test-155.cs.
9901
9902 2002-08-01  Martin Baulig  <martin@gnome.org>
9903
9904         * class.cs (Event.EmitDefaultMethod): Make this work with static
9905         events.  Fixes #28311, added verify-3.cs.
9906
9907 2002-08-01  Martin Baulig  <martin@gnome.org>
9908
9909         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9910         `is_disposable' fields.
9911         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9912         `hm.is_disposable' if we're using the collection pattern.
9913         (Foreach.EmitCollectionForeach): Use the correct type for the
9914         enumerator's local variable, only emit the try/finally block if
9915         necessary (fixes #27713).
9916
9917 2002-08-01  Martin Baulig  <martin@gnome.org>
9918
9919         * ecore.cs (Expression.report118): Renamed to Error118 and made
9920         it public static.
9921
9922         * statement.cs (Throw.Resolve): Check whether the expression is of
9923         the correct type (CS0118) and whether the type derives from
9924         System.Exception (CS0155).
9925         (Catch.Resolve): New method.  Do the type lookup here and check
9926         whether it derives from System.Exception (CS0155).
9927         (Catch.CatchType, Catch.IsGeneral): New public properties.
9928
9929         * typemanager.cs (TypeManager.exception_type): Added.
9930
9931 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9932
9933         * driver.cs: Updated About function.
9934
9935 2002-07-31  Martin Baulig  <martin@gnome.org>
9936
9937         Implemented Control Flow Analysis.
9938
9939         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9940         (EmitContext.CurrentBranching): Added.
9941         (EmitContext.StartFlowBranching): Added.
9942         (EmitContext.EndFlowBranching): Added.
9943         (EmitContext.KillFlowBranching): Added.
9944         (EmitContext.IsVariableAssigned): Added.
9945         (EmitContext.SetVariableAssigned): Added.
9946         (EmitContext.IsParameterAssigned): Added.
9947         (EmitContext.SetParameterAssigned): Added.
9948         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9949         Added control flow analysis stuff here.
9950
9951         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9952         resolve the expression as lvalue.
9953         (LocalVariableReference.DoResolve): Check whether the variable has
9954         already been assigned.
9955         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9956         the parameter as assigned here.
9957         (ParameterReference.DoResolve): Check whether the parameter has already
9958         been assigned.
9959         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9960         expression as lvalue.
9961
9962         * statement.cs (FlowBranching): New class for the flow analysis code.
9963         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9964         (LabeledStatement.IsDefined): New public property.
9965         (LabeledStatement.AddUsageVector): New public method to tell flow
9966         analyis that the label may be reached via a forward jump.
9967         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9968         flow analysis.
9969         (VariableInfo.Number): New public field.  This is used by flow analysis
9970         to number all locals of a block.
9971         (Block.CountVariables): New public property.  This is the number of
9972         local variables in this block (including the locals from all parent
9973         blocks).
9974         (Block.EmitMeta): Number all the variables.
9975
9976         * statement.cs: Added flow analysis support to all classes.
9977
9978 2002-07-31  Martin Baulig  <martin@gnome.org>
9979
9980         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9981         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9982         then use this argument.
9983
9984         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9985
9986         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9987         use this to specify /define options.
9988
9989 2002-07-29  Martin Baulig  <martin@gnome.org>
9990
9991         * statement.cs (Fixed): Moved all code that does variable lookups
9992         and resolvings from Emit to Resolve.
9993
9994         * statement.cs (For): Moved all code that does variable lookups
9995         and resolvings from Emit to Resolve.
9996
9997         * statement.cs (Using): Moved all code that does variable lookups
9998         and resolvings from Emit to Resolve.
9999
10000 2002-07-29  Martin Baulig  <martin@gnome.org>
10001
10002         * attribute.cs (Attribute.Resolve): Explicitly catch a
10003         System.NullReferenceException when creating the
10004         CustromAttributeBuilder and report a different warning message.
10005
10006 2002-07-29  Martin Baulig  <martin@gnome.org>
10007
10008         * support.cs (ParameterData.ParameterName): Added method to
10009         get the name of a parameter.
10010
10011         * typemanager.cs (TypeManager.IsValueType): New public method.
10012
10013 2002-07-29  Martin Baulig  <martin@gnome.org>
10014
10015         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10016         is a flag which specifies that it's either ref or out.
10017         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10018         the out parameter to `out Parameter.Modifier mod', also set the
10019         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10020
10021         * support.cs (InternalParameters.ParameterModifier): Distinguish
10022         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10023         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10024
10025         * expression.cs (Argument.GetParameterModifier): Distinguish
10026         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10027         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10028
10029 2002-07-29  Martin Baulig  <martin@gnome.org>
10030
10031         * expression.cs (ParameterReference.ParameterReference): Added
10032         `Location loc' argument to the constructor.
10033
10034         * cs-parser.jay: Pass location to ParameterReference.
10035
10036 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10037
10038         * statement.cs (Try): Initialize the location.
10039
10040         * cs-parser.jay: pass location to Try.
10041
10042         * expression.cs (Unary.Reduce): Change the prototype to return
10043         whether a constant fold could be performed or not.  The result is
10044         returned in an out parameters.  In the case of Indirection and
10045         AddressOf, we want to perform the full tests.
10046
10047 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10048
10049         * statement.cs (Statement.Emit): Flag dead code.
10050
10051 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10052
10053         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10054
10055 2002-07-27  Martin Baulig  <martin@gnome.org>
10056
10057         * class.cs (MethodData.Define): Put back call to
10058         TypeManager.AddMethod(), accidentally commented this out.
10059
10060         * report.cs (Debug): New public method to print debugging information,
10061         this is `[Conditional ("DEBUG")]'.
10062
10063 2002-07-26  Martin Baulig  <martin@gnome.org>
10064
10065         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10066         (switch_statement): Push the current_block to the switch_stack and
10067         pop it again when we're done with the switch.
10068         (switch_section): The new block is a child of the current_block.
10069         Fixes bug #24007, added test-152.cs.
10070
10071 2002-07-27  Martin Baulig  <martin@gnome.org>
10072
10073         * expression.cs (Invocation.EmitArguments): When calling a varargs
10074         function with only its fixed arguments, we need to pass an empty
10075         array.
10076
10077 2002-07-27  Martin Baulig  <martin@gnome.org>
10078
10079         Mono 0.13 has been released.
10080
10081 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10082
10083         * driver.cs: Rename --resource to --linkres, because that is what
10084         we do currently, we dont support --resource yet.
10085
10086         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10087
10088 2002-07-25  Martin Baulig  <martin@gnome.org>
10089
10090         * class.cs (MethodData): New public class.  This is a `method builder'
10091         class for a method or one accessor of a Property/Indexer/Event.
10092         (MethodData.GetMethodFlags): Moved here from MemberBase.
10093         (MethodData.ApplyAttributes): Likewise.
10094         (MethodData.ApplyObsoleteAttribute): Likewise.
10095         (MethodData.ApplyConditionalAttribute): Likewise.
10096         (MethodData.ApplyDllImportAttribute): Likewise.
10097         (MethodData.CheckAbstractAndExternal): Likewise.
10098         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10099         (MethodData.Emit): Formerly known as Method.Emit().
10100         (MemberBase): Moved everything which was specific to a single
10101         accessor/method to MethodData.
10102         (Method): Create a new MethodData and call Define() and Emit() on it.
10103         (Property, Indexer, Event): Create a new MethodData objects for each
10104         accessor and call Define() and Emit() on them.
10105
10106 2002-07-25  Martin Baulig  <martin@gnome.org>
10107
10108         Made MethodCore derive from MemberBase to reuse the code from there.
10109         MemberBase now also checks for attributes.
10110
10111         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10112         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10113         as virtual.
10114         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10115         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10116         (MemberBase.ApplyAttributes): New virtual method; applies the
10117         attributes to a method or accessor.
10118         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10119         (MemberBase.ApplyConditionalAttribute): Likewise.
10120         (MemberBase.ApplyDllImportAttribute): Likewise.
10121         (MemberBase.CheckAbstractAndExternal): Likewise.
10122         (MethodCore.ParameterTypes): This is now a property instead of a
10123         method, it's initialized from DoDefineParameters().
10124         (MethodCore.ParameterInfo): Removed the set accessor.
10125         (MethodCore.DoDefineParameters): New protected virtual method to
10126         initialize ParameterTypes and ParameterInfo.
10127         (Method.GetReturnType): We can now simply return the MemberType.
10128         (Method.GetMethodFlags): Override the MemberBase version and add
10129         the conditional flags.
10130         (Method.CheckBase): Moved some code from Define() here, call
10131         DoDefineParameters() here.
10132         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10133         here to avoid some larger code duplication.
10134         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10135         ensure that abstract and external accessors don't declare a body.
10136
10137         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10138         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10139         lookup in the attribute's parent classes, so we need to abort as soon
10140         as we found the first match.
10141         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10142         the attribute has no arguments.
10143
10144         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10145         of a Method.
10146
10147 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10148
10149         * cs-parser.jay: reverted previous patch.
10150
10151 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10152
10153         * cs-parser.jay: fixed bug #22119.
10154
10155 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10156
10157         * attribute.cs: fixed compilation. The error was:
10158         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10159         be assigned to before control leaves the current method."
10160         [FIXME:  Filed as bug #28186: MCS must report this error.]
10161
10162 2002-07-25  Martin Baulig  <martin@gnome.org>
10163
10164         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10165         method to pull the condition name ouf of a Conditional attribute.
10166         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10167         the obsolete message and error flag out of an Obsolete attribute.
10168
10169         * class.cs (Method.GetMethodFlags): New public method to get the
10170         TypeManager.MethodFlags for this method.
10171         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10172         private methods.
10173         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10174         if we're overriding a virtual function, set the new private variable
10175         `parent_method'; call the new TypeManager.AddMethod().
10176
10177         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10178         the MethodBuilder and the Method in a PtrHashtable.
10179         (TypeManager.builder_to_method): Added for this purpose.
10180         (TypeManager.MethodFlags): Added IsObsoleteError.
10181         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10182         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10183         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10184         the message from the attribute.
10185
10186 2002-07-24  Martin Baulig  <martin@gnome.org>
10187
10188         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10189         preprocessor directives, ensure that the argument to #define/#undef is
10190         exactly one identifier and that it's actually an identifier.
10191
10192         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10193         did not work ....
10194
10195 2002-07-24  Martin Baulig  <martin@gnome.org>
10196
10197         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10198         initialize it to TypeManager.object_type in the constructor.
10199         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10200         of the `hm.get_current' method if we're using the collection pattern.
10201         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10202         for the explicit conversion to make it work when we're using the collection
10203         pattern and the `Current' property has a different return type than `object'.
10204         Fixes #27713.
10205
10206 2002-07-24  Martin Baulig  <martin@gnome.org>
10207
10208         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10209         does not match, but don't report any errors.  This method is called in
10210         order for all methods in a MethodGroupExpr until a matching method is
10211         found, so we don't want to bail out if the first method doesn't match.
10212         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10213         matches, report the 123.  Fixes #28070.
10214
10215 2002-07-24  Martin Baulig  <martin@gnome.org>
10216
10217         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10218         TypeManager.TypeToCoreType() to the top of the method so the
10219         following equality checks will work.  Fixes #28107.
10220
10221 2002-07-24  Martin Baulig  <martin@gnome.org>
10222
10223         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10224         operand is of type uint, and the other operand is of type sbyte,
10225         short or int, the operands are converted to type long." -
10226         Actually do what this comment already told us.  Fixes bug #28106,
10227         added test-150.cs.
10228
10229 2002-07-24  Martin Baulig  <martin@gnome.org>
10230
10231         * class.cs (MethodBase): New abstract class.  This is now a base
10232         class for Property, Indexer and Event to avoid some code duplication
10233         in their Define() and DefineMethods() methods.
10234         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10235         generic methods for Define() and DefineMethods().
10236         (FieldBase): Derive from MemberBase, not MemberCore.
10237         (Property): Derive from MemberBase, not MemberCore.
10238         (Property.DefineMethod): Moved all the code from this method to the
10239         new MethodBase.DefineAccessor(), just call it with appropriate
10240         argumetnts.
10241         (Property.Define): Call the new Property.DoDefine(), this does some
10242         sanity checks and we don't need to duplicate the code everywhere.
10243         (Event): Derive from MemberBase, not MemberCore.
10244         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10245         accessors, this will also make them work with interface events.
10246         (Indexer): Derive from MemberBase, not MemberCore.
10247         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10248         (Indexer.Define): Use the new MethodBase functions.
10249
10250         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10251         argument to the constructor.
10252         (Interface.FindMembers): Added support for interface events.
10253         (Interface.PopluateEvent): Implemented.
10254
10255         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10256
10257 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10258
10259         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10260         but this is required to check for a method name being the same as
10261         the containing class.  
10262
10263         Handle this now.
10264
10265 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10266
10267         * interface.cs: initialize variable.
10268
10269 2002-07-23  Martin Baulig  <martin@gnome.org>
10270
10271         Implemented the IndexerName attribute in interfaces.
10272
10273         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10274         name if this is an explicit interface implementation.
10275         (Indexer.InterfaceIndexerName): New public variable.  If we're
10276         implementing an interface indexer, this is the IndexerName in that
10277         interface.  Otherwise, it's the IndexerName.
10278         (Indexer.DefineMethod): If we're implementing interface indexer,
10279         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10280         and Pending.ImplementIndexer methods.
10281         (Indexer.Define): Also define the PropertyBuilder if we're
10282         implementing an interface indexer and this is neither an explicit
10283         interface implementation nor do the IndexerName match the one in
10284         the interface.
10285
10286         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10287         If a method is defined here, then we always need to create a proxy
10288         for it.  This is used when implementing interface indexers.
10289         (Pending.IsInterfaceIndexer): New public method.
10290         (Pending.ImplementIndexer): New public method.
10291         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10292         This is used when implementing interface indexers to define a proxy
10293         if necessary.
10294         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10295         define a proxy if necessary.
10296
10297         * interface.cs (Interface.IndexerName): New public variable.
10298         (Interface.PopulateIndexer): Set the IndexerName.
10299         (Interface.DefineIndexers): New private method.  Populate all the
10300         indexers and make sure their IndexerNames match.
10301
10302         * typemanager.cs (IndexerPropertyName): Added support for interface
10303         indexers.
10304
10305 2002-07-22  Martin Baulig  <martin@gnome.org>
10306
10307         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10308         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10309         ret if HasReturnLabel.
10310         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10311         variables.
10312
10313         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10314         and set the ec.LoopBeginTryCatchLevel.
10315         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10316         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10317         the current ec.TryCatchLevel, the branch goes out of an exception
10318         block.  In this case, we need to use Leave and not Br.
10319
10320 2002-07-22  Martin Baulig  <martin@gnome.org>
10321
10322         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10323         block unless the block does not always return or it is contained in
10324         another try { ... } catch { ... } block.  Fixes bug #26506.
10325         Added verify-1.cs to the test suite.
10326
10327 2002-07-22  Martin Baulig  <martin@gnome.org>
10328
10329         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10330         then we do not always return.  Fixes bug #24985.
10331
10332 2002-07-22  Martin Baulig  <martin@gnome.org>
10333
10334         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10335         lookup on a per-class level; ie. walk up the class hierarchy until we
10336         found at least one applicable method, then choose the best among them.
10337         Fixes bug #24463 and test-29.cs.
10338
10339 2002-07-22  Martin Baulig  <martin@gnome.org>
10340
10341         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10342         return types of the methods.  The return type is not part of the
10343         signature and we must not check it to make the `new' modifier work.
10344         Fixes bug #27999, also added test-147.cs.
10345         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10346
10347         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10348         on the method's return type.
10349
10350 2002-07-21  Martin Baulig  <martin@gnome.org>
10351
10352         * assign.cs: Make this work if the rightmost source is a constant and
10353         we need to do an implicit type conversion.  Also adding a few more tests
10354         to test-38.cs which should have caught this.
10355
10356         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10357         target in the makefile for this.  The makefile.gnu is primarily intended
10358         for end-users who don't want to debug the compiler.
10359
10360 2002-07-21  Martin Baulig  <martin@gnome.org>
10361
10362         * assign.cs: Improved the Assign class so it can now handle embedded
10363         assignments (X = Y = Z = something).  As a side-effect this'll now also
10364         consume less local variables.  test-38.cs now passes with MCS, added
10365         a few new test cases to that test.
10366
10367 2002-07-20  Martin Baulig  <martin@gnome.org>
10368
10369         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10370         instructions.  Fixes bug #27977, also added test-146.cs.
10371
10372 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10373
10374         * cs-tokenizer.cs: fixed getHex ().
10375
10376 2002-07-19  Martin Baulig  <martin@gnome.org>
10377
10378         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10379         not Type.GetType() to lookup the array type.  This is needed when
10380         we're constructing an array of a user-defined type.
10381         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10382         single-dimensional arrays, but also for single-dimensial arrays of
10383         type decimal.
10384
10385 2002-07-19  Martin Baulig  <martin@gnome.org>
10386
10387         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10388         this function is called, it's not allowed to share LocalBuilders
10389         among ILGenerators.
10390
10391 2002-07-19  Martin Baulig  <martin@gnome.org>
10392
10393         * expression.cs (Argument.Resolve): Report an error 118 when trying
10394         to pass a type as argument.
10395
10396 2002-07-18  Martin Baulig  <martin@gnome.org>
10397
10398         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10399         Conv_R_Un for the signed `long' type.
10400
10401 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10402
10403         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10404         `expr' for the temporary result, as that will fail if we do
10405         multiple resolves on the same expression.
10406
10407 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10408
10409         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10410         ec.TypeContainer for looking up aliases. 
10411
10412         * class.cs (TypeContainer): Remove LookupAlias from here.
10413
10414         * decl.cs (DeclSpace); Move here.
10415
10416 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10417
10418         * class.cs (FindMembers): Only call filter if the constructor
10419         bulider is not null.
10420
10421         Also handle delegates in `NestedTypes' now.  Now we will perform
10422         type lookups using the standard resolution process.  This also
10423         fixes a bug.
10424
10425         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10426         This uses Expressions (the limited kind that can be parsed by the
10427         tree) instead of strings.
10428
10429         * expression.cs (ComposedCast.ToString): Implement, used to flag
10430         errors since now we have to render expressions.
10431
10432         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10433         FormArrayType. 
10434
10435         * ecore.cs (SimpleName.ToString): ditto.
10436
10437         * cs-parser.jay: Instead of using strings to assemble types, use
10438         Expressions to assemble the type (using SimpleName, ComposedCast,
10439         MemberAccess).  This should fix the type lookups in declarations,
10440         because we were using a different code path for this.
10441
10442         * statement.cs (Block.Resolve): Continue processing statements
10443         even when there is an error.
10444
10445 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10446
10447         * class.cs (Event.Define): Also remove the `remove' method from
10448         the list of pending items.
10449
10450         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10451         generate more compact code. 
10452
10453 2002-07-17  Martin Baulig  <martin@gnome.org>
10454
10455         * const.cs (Const.LookupConstantValue): Add support for constant
10456         `unchecked' and `checked' expressions.
10457         Also adding test case test-140.cs for this.
10458
10459 2002-07-17  Martin Baulig  <martin@gnome.org>
10460
10461         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10462         check whether mi.ReturnType implements the IEnumerator interface; the
10463         `==' and the IsAssignableFrom() will fail in this situation.
10464
10465 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10466
10467         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10468         here too.
10469
10470 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10471
10472         * expression.cs: fixed bug #27811.
10473
10474 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10475
10476         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10477         Molaro: when we are a ref, the value already contains a pointer
10478         value, do not take the address of it.
10479
10480 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10481         * removed mb-parser.jay and mb-tokenizer.cs
10482
10483 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10484
10485         * expression.cs: check against the building corlib void type.
10486
10487 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10488
10489         * ecore.cs: fix for valuetype static readonly fields: when 
10490         initializing them, we need their address, not the address of a copy.
10491
10492 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10493
10494         * typemanager.cs: register also enum_type in corlib.
10495
10496 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10497
10498         * class.cs: allow calling this (but not base) initializers in structs.
10499
10500 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10501
10502         * ecore.cs: make sure we compare against the building base types
10503         in GetTypeSize ().
10504
10505 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10506
10507         * typemanager.cs: fix TypeToCoreType() to handle void and object
10508         (corlib gets no more typerefs after this change).
10509
10510 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10511
10512         * expression.cs (ArrayCreation.EmitArrayArguments): use
10513         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10514
10515         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10516         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10517         array indexes, the runtime actually forbids them.
10518
10519         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10520         for array arguments here.
10521
10522         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10523         instead of the default for ValueTypes.
10524
10525         (New.DoEmit): Use IsValueType instead of
10526         IsSubclassOf (value_type)
10527         (New.DoResolve): ditto.
10528         (Invocation.EmitCall): ditto.
10529
10530         * assign.cs (Assign): ditto.
10531
10532         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10533         Statements *are* currently doing part of their resolution during
10534         Emit.  
10535
10536         Expressions do always resolve during resolve, but statements are
10537         only required to propagate resolution to their children.
10538
10539 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10540
10541         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10542
10543         (LoadAssembly): Do not add the dll if it is already specified
10544
10545         (MainDriver): Add the System directory to the link path at the end,
10546         after all the other -L arguments. 
10547
10548         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10549         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10550         ldelem.u1) and using the opposite for sbytes.
10551
10552         This fixes Digger, and we can finally run it.
10553
10554         * driver.cs (UnixParseOption): Move the option parsing here.  
10555         (CSCParseOption): Implement CSC-like parsing of options.
10556
10557         We now support both modes of operation, the old Unix way, and the
10558         new CSC-like way.  This should help those who wanted to make cross
10559         platform makefiles.
10560
10561         The only thing broken is that /r:, /reference: and /lib: are not
10562         implemented, because I want to make those have the same semantics
10563         as the CSC compiler has, and kill once and for all the confussion
10564         around this.   Will be doing this tomorrow.
10565
10566         * statement.cs (Unsafe.Resolve): The state is checked during
10567         resolve, not emit, so we have to set the flags for IsUnsfe here.
10568
10569 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10570
10571         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10572         not catch the Error_ObjectRefRequired in SimpleName (as it is
10573         possible to have a class/instance variable name that later gets
10574         deambiguated), we have to check this here.      
10575
10576 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10577
10578         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10579         make static and put into Expression.
10580
10581         (Event.Define): Register the private field of the event with the 
10582         TypeManager so that GetFieldFromEvent can get at it.
10583
10584         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10585         keep track of the private field associated with an event which
10586         has no accessors.
10587
10588         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10589         private field.
10590
10591         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10592
10593 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10594
10595         * expression.cs (Binary.EmitBranchable): this routine emits the
10596         Binary expression in a branchable context.  This basically means:
10597         we need to branch somewhere, not just get the value on the stack.
10598
10599         This works together with Statement.EmitBoolExpression.
10600
10601         * statement.cs (Statement.EmitBoolExpression): Use
10602         EmitBranchable. 
10603
10604 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10605
10606         * statement.cs (For): Reduce the number of jumps in loops.
10607
10608         (For): Implement loop inversion for the For statement.
10609
10610         (Break): We can be breaking out of a Try/Catch controlled section
10611         (foreach might have an implicit try/catch clause), so we need to
10612         use Leave instead of Br.
10613
10614         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10615         now).  If the instace expression supports IMemoryLocation, we use
10616         the AddressOf method from the IMemoryLocation to extract the
10617         address instead of emitting the instance.
10618
10619         This showed up with `This', as we were emitting the instance
10620         always (Emit) instead of the Address of This.  Particularly
10621         interesting when This is a value type, as we dont want the Emit
10622         effect (which was to load the object).
10623
10624 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10625
10626         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10627
10628         * statement.cs (Checked): Set the CheckedState during the resolve
10629         process too, as the ConvCast operations track the checked state on
10630         the resolve process, and not emit.
10631
10632         * cs-parser.jay (namespace_member_declaration): Flag that we have
10633         found a declaration when we do.  This is used to flag error 1529
10634
10635         * driver.cs: Report ok when we display the help only.
10636
10637 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10638
10639         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10640
10641 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10642
10643         * cs-tokenizer.cs (define): We also have to track locally the
10644         defines.  AllDefines is just used for the Conditional Attribute,
10645         but we also need the local defines for the current source code. 
10646
10647 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10648
10649         * statement.cs (While, For, Do): These loops can exit through a
10650         Break statement, use this information to tell whether the
10651         statement is the last piece of code.
10652
10653         (Break): Flag that we break.
10654
10655         * codegen.cs (EmitContexts): New `Breaks' state variable.
10656
10657 2002-07-03  Martin Baulig  <martin@gnome.org>
10658
10659         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10660         modifiers in method declarations in structs.  Otherwise, you won't
10661         be able to override things like Object.Equals().
10662
10663 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10664
10665         * class.cs (Method, Property, Indexer): Do not allow the public
10666         modifier to be used in explicit interface implementations.
10667
10668         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10669         override modifiers in method declarations in structs
10670
10671 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10672
10673         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10674         integer or real overflow, report an error
10675
10676 2002-07-02  Martin Baulig  <martin@gnome.org>
10677
10678         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10679         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10680         to tell the runtime about our newly created System.Object and
10681         System.ValueType types.
10682
10683 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10684
10685         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10686         struct instead of Ldarg/Starg.
10687
10688 2002-07-02  Martin Baulig  <martin@gnome.org>
10689
10690         * expression.cs (Indirection.Indirection): Call
10691         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10692
10693 2002-07-02  Martin Baulig  <martin@gnome.org>
10694
10695         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10696         ValueType, call TypeManager.TypeToCoreType() on it.
10697         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10698         the OpCodes.Newarr argument.
10699
10700 2002-07-02  Martin Baulig  <martin@gnome.org>
10701
10702         * expression.cs (Invocation.EmitCall): When compiling corlib,
10703         replace all calls to the system's System.Array type to calls to
10704         the newly created one.
10705
10706         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10707         System.Array methods.
10708         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10709         from the system's System.Array type which must be replaced.
10710
10711 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10712
10713         * typemanager.cs: load unverifiable_code_ctor so we can build
10714         corlib using the correct type. Avoid using GetTypeCode() with
10715         TypeBuilders.
10716         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10717         TypeManager.object_type to allow building corlib.
10718
10719 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10720
10721         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10722
10723 2002-07-01  Martin Baulig  <martin@gnome.org>
10724
10725         * class.cs: Make the last change actually work, we need to check
10726         whether `ifaces != null' to avoid a crash.
10727
10728 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10729
10730         * class.cs: when we build structs without fields that implement
10731         interfaces, we need to add the interfaces separately, since there is
10732         no API to both set the size and add the interfaces at type creation
10733         time.
10734
10735 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10736
10737         * expression.cs: the dimension arguments to the array constructors
10738         need to be converted if they are a long.
10739
10740 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10741
10742         * class.cs: don't emit ldarg.0 if there is no parent constructor
10743         (fixes showstopper for corlib).
10744
10745 2002-06-29  Martin Baulig  <martin@gnome.org>
10746
10747         MCS now compiles corlib on GNU/Linux :-)
10748
10749         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10750         ie. check for MethodImplOptions.InternalCall.
10751
10752         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10753         and TypeManager.attribute_type are null, so we must explicitly check
10754         whether parent is not null to find out whether it's an attribute type.
10755         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10756         and SetBuilder, not only if the property is neither abstract nor external.
10757         This is necessary to set the MethodImplOptions on the accessor methods.
10758         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10759         SetBuilder, see Property.Emit().
10760
10761         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10762         populate "System.Object", "System.ValueType" and "System.Attribute" since
10763         they've already been populated from BootCorlib_PopulateCoreTypes().
10764
10765 2002-06-29  Martin Baulig  <martin@gnome.org>
10766
10767         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10768         is the NullLiteral, we also need to make sure that target_type is not
10769         an enum type.   
10770
10771 2002-06-29  Martin Baulig  <martin@gnome.org>
10772
10773         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10774         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10775         before calling BootstrapCorlib_ResolveDelegate ().
10776
10777 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10778
10779         * statement.cs: fixed build-breaker. All tests passed ok.
10780
10781 2002-06-27  Martin Baulig  <martin@gnome.org>
10782
10783         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10784         for System.Decimal when compiling corlib.
10785
10786 2002-06-27  Martin Baulig  <martin@gnome.org>
10787
10788         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10789         switch blocks which contain nothing but a default clause.
10790
10791 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10792
10793        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10794
10795 2002-06-27  Martin Baulig  <martin@gnome.org>
10796
10797         * ecore.cs (PropertyExpr.PropertyExpr): Call
10798         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10799
10800         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10801         is already a TypeBuilder.
10802
10803 2002-06-27  Martin Baulig  <martin@gnome.org>
10804
10805         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10806         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10807         the "from an array-type to System.Array" case.  This makes it work
10808         when compiling corlib.
10809
10810 2002-06-27  Martin Baulig  <martin@gnome.org>
10811
10812         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10813         non-static PropertyExpr, set its InstanceExpression.  This makes
10814         the `ICollection.Count' property work in System/Array.cs.
10815
10816 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10817
10818         * driver.cs: Made error handling more consistent.  Errors now
10819         tracked by Report class, so many methods which used to return int
10820         now return void.  Main() now prints success/failure and 
10821         errors/warnings message.
10822
10823         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10824         the magic number return values (123 and 124).  Now, if the
10825         expected error occurs, the compiler exits with success (exit value
10826         0).  If the compilation completes without seeing that particular
10827         error, the compiler exits with failure (exit value 1).  The
10828         makefile in mcs/errors has been changed to handle the new behaviour.
10829
10830         * report.cs: Made 'expected error' number a property and renamed
10831         it from 'Probe' to 'ExpectedError'.
10832
10833         * genericparser.cs: Removed error handling support, since it is
10834         now all done by Report class.
10835
10836         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10837         class, so parse() no longer returns an int.
10838
10839         * namespace.cs: Use Report.Error instead of GenericParser.error
10840
10841 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10842
10843         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10844         TypeContainer.AddOperator): At the front of the list put the
10845         explicit implementations, so they get resolved/defined first. 
10846
10847 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10848
10849         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10850         interface type is implemented by this TypeContainer.  Used during
10851         explicit interface implementation.
10852
10853         (Property.Define, Indexer.Define, Method.Define): Validate that
10854         the given interface in the explicit implementation is one of the
10855         base classes for the containing type.
10856
10857         Also if we are explicitly implementing an interface, but there is
10858         no match in the pending implementation table, report an error.
10859
10860         (Property.Define): Only define the property if we are
10861         not explicitly implementing a property from an interface.  Use the
10862         correct name also for those properties (the same CSC uses,
10863         although that is really not needed).
10864
10865         (Property.Emit): Do not emit attributes for explicitly implemented
10866         properties, as there is no TypeBuilder.
10867
10868         (Indexer.Emit): ditto.
10869
10870         Hiding then means that we do not really *implement* a pending
10871         implementation, which makes code fail.
10872
10873 2002-06-22  Martin Baulig  <martin@gnome.org>
10874
10875         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10876         the return value of Object.GetType().  [FIXME: we need to do this whenever
10877         we get a type back from the reflection library].
10878
10879 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10880
10881         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10882
10883 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10884
10885         * attribute.cs: Return null if we can not look up the type.
10886
10887         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10888         the interface types found.
10889
10890         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10891         interface types found.
10892
10893         * typemanager.cs (GetInterfaces): Make this routine returns alll
10894         the interfaces and work around the lame differences between
10895         System.Type and System.Reflection.Emit.TypeBuilder in the results
10896         result for GetInterfaces.
10897
10898         (ExpandInterfaces): Given an array of interface types, expand and
10899         eliminate repeated ocurrences of an interface.  This expands in
10900         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10901         be IA, IB, IC.
10902
10903 2002-06-21  Martin Baulig  <martin@gnome.org>
10904
10905         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10906         on System.Enum.
10907
10908 2002-06-21  Martin Baulig  <martin@gnome.org>
10909
10910         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10911         and called with one of the core types, return the corresponding typebuilder for
10912         that type.
10913
10914         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10915         element type.
10916
10917 2002-06-21  Martin Baulig  <martin@gnome.org>
10918
10919         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10920         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10921         (Expression.ConvertReferenceExplicit): Likewise.
10922
10923         * expression.cs (ElementAccess.DoResolve): Likewise.
10924         (ElementAccess.DoResolveLValue): Likewise.
10925
10926 2002-06-10  Martin Baulig  <martin@gnome.org>
10927
10928         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10929         add the "value" parameter to the parameter list.
10930
10931         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10932         to our caller.
10933
10934 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10935
10936         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10937         the argument to an int, uint, long or ulong, per the spec.  Also
10938         catch negative constants in array creation.
10939
10940 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10941
10942         * class.cs: do not allow the same interface to appear twice in
10943         the definition list.
10944
10945 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10946
10947         * ecore.cs: don't use ldlen with System.Array.
10948
10949 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10950
10951         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10952
10953 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10954
10955         * modifiers.cs: produce correct field attributes for protected
10956         internal. Easy fix so miguel can work on ther harder stuff:-)
10957
10958 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10959
10960         * pending.cs: New file.  Move the code from class.cs here.
10961         Support clearning the pending flag for all methods (when not doing
10962         explicit interface implementation).
10963
10964 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10965
10966         * rootcontext.cs: added a couple more types needed to bootstrap.
10967
10968 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10969
10970         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10971         constructor in the type, instead of any constructor in the type
10972         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10973         a bug in the Mono runtime when applying the params attribute). 
10974
10975 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10976         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10977
10978 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10979
10980         * expression.cs (Unary.ResolveOperator): Use TypeManager
10981         to resolve the type.
10982
10983 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10984
10985         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10986         attached.
10987
10988         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10989         with each member too.
10990
10991         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10992         field builders too - this takes care of the enum member case.
10993
10994 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10995
10996         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10997         address-of operator on both value types and pointers.
10998
10999 2002-06-10  Martin Baulig  <martin@gnome.org>
11000
11001         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11002         PropertyBuilder to the `property_builders' list.
11003
11004         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11005         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11006         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11007         find any indexers which are inherited from an interface.
11008
11009 2002-06-09  Martin Baulig  <martin@gnome.org>
11010
11011         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11012         the same type as the constant if necessary.  There's also a test-130.cs
11013         for this.
11014
11015         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11016
11017         * typemanager.cs (TypeManager.ChangeType): Previously known as
11018         Enum.ChangeEnumType().
11019
11020 2002-06-09  Martin Baulig  <martin@gnome.org>
11021
11022         * expression.cs (Cast.TryReduce): Added support for consts.
11023
11024 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11025
11026         * class.cs (Accessor): Hold attributes information so we can pass
11027         it along.
11028
11029         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11030         Modify to pass in attributes attached to the methods.
11031
11032         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11033
11034         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11035         to handle the Accessor kind :-)
11036
11037         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11038
11039 2002-06-08  Martin Baulig  <martin@gnome.org>
11040
11041         * expression.cs (Unary.TryReduceNegative): Added support for
11042         ULongConstants.
11043
11044 2002-06-08  Martin Baulig  <martin@gnome.org>
11045
11046         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11047         name can't be found in the `defined_names' - the caller will do a
11048         MemberLookup in this case and thus find methods in System.Enum
11049         such as Enum.IsDefined().
11050
11051 2002-06-08  Martin Baulig  <martin@gnome.org>
11052
11053         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11054         Convert.ChangeType() which works with TypeBuilder created types.
11055         (Enum.LookupEnumValue, Enum.Define): Use it here.
11056
11057         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11058         `TypeBuilder.BaseType != null' check.
11059         (TypeContainer.FindMembers): Only lookup parent members if we
11060         actually have a parent.
11061         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11062         (ConstructorInitializer.Resolve): Likewise.
11063
11064         * interface.cs (Interface.FindMembers): Added
11065         `TypeBuilder.BaseType != null' check.
11066
11067         * rootcontext.cs (RootContext.ResolveCore): Added
11068         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11069         classes_second_stage.
11070
11071         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11072         debug_type and trace_type when compiling with --nostdlib.       
11073
11074 2002-06-07  Martin Baulig  <martin@gnome.org>
11075
11076         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11077         (AddField): Set it to true when adding a non-static field.
11078         (DefineType): Use `have_nonstatic_fields' to find out whether we
11079         have non-static fields, not `Fields != null'.
11080
11081 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11082
11083         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11084         dereferencing a null on the static-field code path)
11085
11086 2002-05-30  Martin Baulig  <martin@gnome.org>
11087
11088         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11089         to take command line arguments.  Use reflection to call the new
11090         custom `Initialize' function on the symbol writer and pass it the
11091         command line arguments.
11092
11093         * driver.cs (--debug-args): New command line argument to pass command
11094         line arguments to the symbol writer.
11095
11096 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11097
11098         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11099         the target type for indexers and properties.  Thanks to Joe for
11100         catching this.
11101
11102 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11103
11104         * typemanager.cs (MethodFlags): returns the method flags
11105         (Obsolete/ShouldIgnore) that control warning emission and whether
11106         the invocation should be made, or ignored. 
11107
11108         * expression.cs (Invocation.Emit): Remove previous hack, we should
11109         not do this on matching a base type, we should do this based on an attribute
11110
11111         Only emit calls to System.Diagnostics.Debug and
11112         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11113         on the command line.
11114
11115         * rootcontext.cs: Global settings for tracing and debugging.
11116
11117         * cs-tokenizer.cs (define): New utility function to track
11118         defines.   Set the global settings for TRACE and DEBUG if found.
11119
11120 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11121
11122         * interface.cs (Populate*): Pass in the TypeContainer as well as
11123         the DeclSpace as parameters so that we can create EmitContexts and
11124         then use that to apply attributes etc.
11125
11126         (PopulateMethod, PopulateEvent, PopulateProperty)
11127         (PopulateIndexer): Apply attributes everywhere.
11128
11129         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11130         etc.
11131
11132         (ApplyAttributes): Update accordingly.
11133
11134         We now apply interface attributes for all members too.
11135
11136 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11137
11138         * class.cs (Indexer.Define); Correctly check if we are explicit
11139         implementation (instead of checking the Name for a ".", we
11140         directly look up if the InterfaceType was specified).
11141
11142         Delay the creation of the PropertyBuilder.
11143
11144         Only create the PropertyBuilder if we are not an explicit
11145         interface implementation.   This means that explicit interface
11146         implementation members do not participate in regular function
11147         lookups, and hence fixes another major ambiguity problem in
11148         overload resolution (that was the visible effect).
11149
11150         (DefineMethod): Return whether we are doing an interface
11151         implementation. 
11152
11153         * typemanager.cs: Temporary hack until we get attributes in
11154         interfaces (Ravi is working on that) and we get IndexerName
11155         support in interfaces.
11156
11157         * interface.cs: Register the indexers as properties.
11158
11159         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11160         warning, I have verified that this is a bug in the .NET runtime
11161         (JavaScript suffers of the same problem).
11162
11163         * typemanager.cs (MemberLookup): When looking up members for
11164         interfaces, the parent of an interface is the implicit
11165         System.Object (so we succeed in searches of Object methods in an
11166         interface method invocation.  Example:  IEnumerable x;  x.ToString
11167         ()) 
11168
11169 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11170
11171         * class.cs (Event): Events should also register if they do
11172         implement the methods that an interface requires.
11173
11174         * typemanager.cs (MemberLookup); use the new GetInterfaces
11175         method. 
11176
11177         (GetInterfaces): The code used to lookup interfaces for a type is
11178         used in more than one place, factor it here. 
11179
11180         * driver.cs: Track the errors at the bottom of the file, we kept
11181         on going.
11182
11183         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11184         instance if the method we are calling is static!
11185
11186 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11187
11188         * attribute.cs (ApplyAttributes): Make this function filter out
11189         the IndexerName attribute (as that attribute in reality is never
11190         applied) and return the string constant for the IndexerName
11191         attribute. 
11192
11193         * class.cs (TypeContainer.Emit): Validate that all the indexers
11194         have the same IndexerName attribute, and if so, set the
11195         DefaultName attribute on the class. 
11196
11197         * typemanager.cs: The return value might contain other stuff (not
11198         only methods).  For instance, consider a method with an "Item"
11199         property and an Item method.
11200
11201         * class.cs: If there is a problem with the parameter types,
11202         return. 
11203
11204 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11205
11206         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11207         looks at user defined conversion after making a call to 
11208         StandardConversionExists - we need this for overload resolution.
11209
11210         * expression.cs : Update accordingly the various method calls.
11211
11212         This fixes 2 bugs filed against implicit user defined conversions 
11213
11214 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11215
11216         * statement.cs: Track the result of the assignment.
11217
11218 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11219
11220         * expression.cs (MemberAccess): Improved error reporting for
11221         inaccessible members.
11222
11223 2002-05-22  Martin Baulig  <martin@gnome.org>
11224
11225         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11226         itself with debugging support.
11227
11228 2002-05-22  Martin Baulig  <martin@gnome.org>
11229
11230         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11231         Removed, this isn't needed anymore.
11232
11233 2002-05-20  Martin Baulig  <martin@gnome.org>
11234
11235         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11236         be underlying type for an enum.
11237
11238 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11239
11240         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11241         that splits out the loading of just the core types.
11242
11243         * rootcontext.cs (ResolveCore): Split the struct resolution in
11244         two, so we can load the enumeration underlying types before any
11245         enums are used.
11246
11247         * expression.cs (Is): Bandaid until we fix properly Switch (see
11248         bug #24985 for details).
11249
11250         * typemanager.cs (ImplementsInterface): The hashtable will contain
11251         a null if there are no interfaces implemented.
11252
11253 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11254
11255         * cs-parser.jay (indexer_declarator): It is fine to have array
11256         parameters
11257
11258 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11259
11260         * typemanager.cs: (RegisterBuilder): New function used to register
11261         TypeBuilders that implement interfaces.  Since
11262         TypeBuilder.GetInterfaces (as usual) does not work with lame
11263         Reflection.Emit. 
11264         (AddUserType): register interfaces.
11265
11266         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11267         dealing with TypeBuilder.  Also, arrays are showing up as
11268         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11269         methods can not be invoked on them!
11270
11271         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11272         (ImplicitReferenceConversionExists): Split out from
11273         StandardConversionExists. 
11274
11275         * expression.cs (As): We were only implementing one of the three
11276         cases for the as operator.  We now implement them all.
11277         (Is): Implement the various other cases for Is as well.
11278
11279         * typemanager.cs (CACHE): New define used to control if we want or
11280         not the FindMembers cache.  Seems to have a negative impact on
11281         performance currently
11282
11283         (MemberLookup): Nested types have full acess to
11284         enclosing type members
11285
11286         Remove code that coped with instance/static returns for events, we
11287         now catch this in RealFindMembers.
11288
11289         (RealFindMembers): only perform static lookup if the instance
11290         lookup did not return a type or an event.  
11291
11292 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11293
11294         * assign.cs (CompoundAssign): We pass more semantic information
11295         now to Compound Assignments than we did before: now we have all
11296         the information at hand, and now we resolve the target *before* we
11297         do the expression expansion, which allows the "CacheValue" method
11298         to have the effect we intended (before, a [x] += 1 would generate
11299         two differen ArrayAccess expressions from the ElementAccess,
11300         during the resolution process).
11301
11302         (CompoundAssign.DoResolve): Resolve target and original_source here.
11303
11304 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11305
11306         * expression.cs (ArrayAccess): dropped debugging information. 
11307
11308         * typemanager.cs: Small bug fix: I was always returning i_members,
11309         instead of one of i_members or s_members (depending on which had
11310         the content).
11311
11312         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11313         method is invoked before any code generation takes place, and it
11314         is a mechanism to inform that the expression will be invoked more
11315         than once, and that the method should use temporary values to
11316         avoid having side effects
11317
11318         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11319
11320         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11321         implementation.
11322
11323         * expression.cs (Indirection, ArrayAccess): Add support for
11324         CacheTemporaries in these two bad boys. 
11325
11326         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11327         ldobj or ldind_ref.  
11328         (StoreFromPtr): Handle stobj as well.
11329
11330         * expression.cs (UnaryMutator): Share more code.
11331
11332         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11333         down: I was not tracking the Filter function as well, which
11334         was affecting the results of the cache.
11335
11336 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11337
11338         * attribute.cs: Remove the hack to handle the CharSet property on
11339         StructLayouts. 
11340
11341 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11342
11343         * attribute.cs (DoResolve): More uglyness, we now only try to
11344         resolve the attribute partially, to extract the CharSet
11345         information (only if we are a StructLayout attribute).  Otherwise 
11346
11347         (GetExtraTypeInfo): Add some code to conditionally kill in the
11348         future this.   I am more and more convinced that the .NET
11349         framework has special code to handle the attribute setting on
11350         certain elements.
11351
11352         * expression.cs (IsParamsMethodApplicable): Revert my previous
11353         foreach change here, it was wrong.
11354
11355 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11356
11357         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11358         (pp_expr): do not abort on unknown input, just return.
11359         (eval): abort if there are pending chars.
11360
11361         * attribute.cs (Attribute.Resolve): Positional parameters are
11362         optional.  Deal with that case.
11363
11364         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11365         the Ansi/Unicode/Auto information for the type.
11366
11367         (TypeContainer.DefineType): instantiate the EmitContext here, as
11368         we will be using it during the type definition (to resolve
11369         attributes) and during the emit phase.
11370
11371         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11372         to pull type information out of the attributes
11373
11374         (Attribute.Resolve): track the constructor builder, and allow for
11375         multiple invocations (structs and classes will use this).
11376
11377         * ecore.cs (MemberLookupFinal): new version with all the
11378         parameters customizable.
11379
11380         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11381         constructors.  Return if the result value is null (as the error
11382         would have been flagged already by MemberLookupFinal)
11383
11384         Do not allow instances of abstract classes or interfaces to be
11385         created.
11386
11387         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11388         We have to compare the assembly property here when dealing with
11389         FamANDAssem and Assembly access modifiers, because we might be
11390         creating an assembly from *modules* (that means that we are not
11391         getting TypeBuilders for types defined in other modules that are
11392         part of this assembly).
11393
11394         (Method.Emit): If the method is marked abstract and has a body,
11395         emit an error. 
11396
11397         (TypeContainer.DefineMembers): If both the defined member and the
11398         parent name match are methods, then do not emit any warnings: let
11399         the Method.Define routine take care of flagging warnings.  But if
11400         there is a mismatch (method overrides something else, or method is
11401         overriwritten by something, then emit warning).
11402
11403         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11404         set to null, this means `do not check for the return type on the
11405         signature'. 
11406
11407         (Method.Define): set the return type for the method signature to
11408         null, so that we get methods with the same name and parameters and
11409         different return types.  This is used to flag warning 114 (you are
11410         hiding a method, and you probably want to use the new/override
11411         keywords instead).
11412
11413         * typemanager.cs (MemberLookup): Implemented proper access
11414         control, closing a long standing set of bug reports.  The problem
11415         was that the Framework only has two bits: Public and NonPublic,
11416         and NonPublic includes private and protected methods, but we need
11417         to enforce the FamANDAssem, FamOrAssem and Family. 
11418
11419 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11420
11421         * statement.cs (GotoCase): Return true: Ammounts to giving up
11422         knowledge on whether we return or not, and letting the other case
11423         be responsible for it.
11424
11425 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11426
11427         * driver.cs: Do not load directories for each file processed, only
11428         do it if there is a pattern.
11429
11430         * ecore.cs: Report readonly assigns here as well, as we might have
11431         been resolved only by MemberAccess.
11432
11433         (SimpleName.SimpleNameResolve): Also be useful for LValue
11434         resolution.   We need this to propagate assign to local readonly variables
11435
11436         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11437         do not want to reuse potential criteria memory.
11438
11439         * class.cs (MyEventBuilder): Set reflected_type;
11440
11441         * ecore.cs (Constantify): Added support for constifying bools.
11442
11443         (RootContext.LookupType): Added a cache for values looked up in
11444         the declaration space.
11445
11446         * typemanager.cs (FindMembers): Now is a front-end to
11447         RealFindMembers, and provides a two-level hashtable-based cache to
11448         the request.  
11449
11450         15% performance improvement: from 22.5 to 19.2 seconds.
11451
11452         * expression.cs (IsParamsMethodApplicable): use foreach.
11453         (Invocation.DoResolve): ditto.
11454         (New.DoResolve): ditto.
11455         (ArrayCreation.DoResolve): ditto.
11456
11457         * ecore.cs (FindMostEncompassingType): use foreach.
11458
11459         * delegate.cs (NewDelegate.DoResolve): Use foreach
11460
11461         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11462         (RemoveMethods): use foreach.
11463
11464         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11465         nested foreach statements instead of for, and also break out of
11466         the inner loop once a match is found.
11467
11468         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11469
11470 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11471
11472         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11473         we actually unwrap the expression to allow for extra information
11474         to be extracted. 
11475
11476         * expression.cs: Use Shr_Un on unsigned operations. 
11477
11478 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11479
11480         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11481         applicable operators was not being considered correctly. This closes
11482         the bug Miguel reported.
11483
11484 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11485
11486         * attribute.cs: check that the type derives from System.Attribute
11487         and report the correct error in that case (moved the duplicate code to
11488         its own method, too).
11489
11490 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11491
11492         * attribute.cs: lookup attribute type name as the spec says: first the
11493         bare attribute name and then name + "Attribute" (nant compiles with
11494         mcs after this fix).
11495
11496 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11497
11498         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11499         Because of the way we parse things, we should try to see if a
11500         UIntConstant can fit in an integer.
11501
11502 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11503
11504         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11505         when we are in an explicit context.
11506
11507         (ConvertReferenceExplicit): When converting from Iface type S to Class
11508         T make sure the rules are implemented as an OR.
11509
11510         * parameter.cs (ParameterType): Make it a property for now although the
11511         purpose really isn't anything immediate.
11512
11513         * expression.cs (Is*Applicable): Do better checking on the parameter type
11514         of a ref/out parameter. The ones from the system assemblies are already 
11515         marked with the correct type so we don't need to do any correction.
11516
11517         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11518         the object type is standard too so include that.
11519
11520 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11521
11522         * ecore.cs (StandardConversionExists): Augment with missing code:
11523         deal with IntConstant, LongConstants and Enumerations.
11524
11525         * assign.cs: Report the error, instead of failing silently
11526
11527         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11528         typecontainer that they are declared, because the
11529         typecontainer/namespace will have the list of using clauses that
11530         need to be applied.
11531
11532         Assembly Attributes were escaping the normal registration
11533         mechanism. 
11534
11535         (EmitCode): Apply attributes within an EmitContext that represents
11536         the container they were declared on.
11537
11538         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11539
11540 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11541
11542         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11543         Revamp completely - make much cleaner as we now operate only
11544         on a set of Types.
11545
11546         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11547         to implement the logic detailed in the spec more correctly.
11548
11549         (UserDefinedConversion): Update accordingly.
11550
11551 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11552
11553         * statement.cs: Return flow analysis information up.
11554
11555         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11556         and the default.
11557
11558         (token): Do not consume an extra character before calling
11559         decimal_digits.
11560
11561 2002-05-06  Piers Haken <piersh@friskit.com>
11562
11563         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11564
11565 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11566
11567         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11568         EmitContext during the instance constructor initializer
11569         resolution, to stop access to instance variables.
11570
11571         This is mandated by the spec, last paragraph of the `constructor
11572         initializers' section. 
11573
11574 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11575
11576         * cs-parser.jay, class.cs (Accessor): new class used to represent
11577         an accessor (get or set).  In the past we used `null' to represent
11578         a missing accessor.  But this is ambiguous because there was no
11579         way to tell in abstract indexers/properties if one of them was
11580         specified.
11581
11582         Now there is a way of addressing that.
11583
11584         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11585         instead of FindMembers.
11586
11587         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11588         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11589
11590         * attribute.cs: Treat indexers and properties as the same in terms
11591         of applying attributes
11592
11593         * ecore.cs (FindMostEncompassedType): Use statically initialized
11594         EmptyExpressions()s like we do elsewhere to avoid creating useless
11595         objects (and we take this out of the tight loop).
11596
11597         (GetConversionOperators): Move the code to extract the actual
11598         operators to a separate routine to clean things up.
11599
11600 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11601
11602         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11603         events are always registered FieldBuilders.
11604
11605         * class.cs (FieldBase): New class shared by Fields 
11606
11607         * delegate.cs: If we are a toplevel delegate, use our full name.
11608         If we are a nested delegate, then only use our tail name.
11609
11610 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11611
11612         * expression.cs (IsApplicable): Ensure that we add the "&" to
11613         ref/out types before comparing it with the type of the argument.
11614
11615         (IsParamsMethodApplicable): Ditto.
11616
11617         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11618         silly me ;-)
11619
11620         * delegate.cs : Handle the case when we have more than one applicable
11621         method. Flag an error only when we finish checking all.
11622
11623 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11624
11625         * expression.cs: Add support for boolean static initializers.
11626
11627 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11628
11629         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11630
11631         * parameter.cs (ComputeParameterTypes,
11632         ComputeAndDefineParameterTypes): Better error handling: now we
11633         clear the `types' cache if we fail during any of the type lookups.
11634         We also return the status code correctly to our caller
11635
11636         * delegate.cs: If we fail to define a delegate, abort the extra
11637         steps. 
11638
11639         * expression.cs (Binary.ResolveOperator): for
11640         operator==(object,object) and operator !=(object, object) we also
11641         have to verify that there is an implicit conversion from one to
11642         the other.
11643
11644         (ArrayAccess.DoResolve): Array Access can operate on
11645         non-variables. 
11646
11647 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11648
11649         * assign.cs (CompoundAssign): A new class used as a "flag" that
11650         the assignment actually is happening as part of a compound
11651         assignment operator.
11652
11653         During compound assignment, a few new rules exist to enable things
11654         like:
11655
11656         byte b |= 1 + 2
11657
11658         From the spec:
11659
11660         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11661         to the type of x) if y is implicitly convertible to the type of x,
11662         and the operator is a builtin operator and the return type of the
11663         operator is explicitly convertible to the type of x. 
11664
11665         * rootcontext.cs: Reset warning level to 2.  4 catches various
11666         "interesting" features in mcs, we must clean this up at some
11667         point, but currently am trying to kill other bugs ;-)
11668
11669         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11670         in container classes as well.  
11671
11672         * expression.cs (Binary.ResolveOperator): Handle string case
11673         before anything else (as operator overloading does emit an error
11674         before doing anything else).
11675
11676         This code could go away when we move to a table driven model, but
11677         i could not come up with a good plan last night.
11678
11679 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11680
11681         * typemanager.cs (CSharpName): reimplementation using regex.
11682         * class.cs: added null check for fields in Emit
11683         * rootcontext.cs: set warninglevel to 4
11684
11685 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11686
11687         * typemanager.cs (CSharpName): reimplemented with Lupus
11688         suggestion.
11689
11690 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11691
11692         * statement.cs (If): correclty implement Resolve, because we were
11693         not catching sem errors in there.  The same process is needed
11694         everywhere else. 
11695         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11696
11697
11698         (Statement.Warning_DeadCodeFound): Factorize code.
11699         (While): Report dead code here too.
11700
11701         (Statement): Added Resolve virtual method to allow
11702         for resolution split from the emit code.
11703
11704 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11705
11706         * statement.cs (EmitBoolExpression): No longer try to resolve the
11707         expression here.    
11708         (MakeBoolean): New utility function that resolve, implicitly
11709         converts to boolean and tags the expression. 
11710
11711
11712         (If, Do): Implement dead code elimination.
11713         (While): Implement loop inversion
11714
11715         (Do, While, For, If): Resolve the expression prior to calling our
11716         code generation.
11717
11718 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11719
11720         * class.cs:
11721           - added method Report28 (warning: program has more than one entry point)
11722           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11723           - modified method Method.Define, the part at the end of the method
11724
11725         * rootcontext.cs: added static public Location EntryPointLocation;
11726           
11727         * ../errors/cs0028.cs : Add test case for the above warning.              
11728
11729         * typemanager.cs:
11730           - modified method CSharpName to allow arrays of primitive type to
11731             be printed nicely (e.g. instead of System.Int32[][] it now prints
11732             int[][])
11733           - added method CSharpSignature: returns the signature of a method
11734             in string format to be used in reporting errors, warnings, etc.
11735
11736         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11737         with String.Empty.
11738
11739 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11740
11741         * delegate.cs (Define): Fix extremely silly bug where I was
11742         setting the type of the 'object' parameter of the BeginInvoke
11743         method to System.IAsyncResult instead of System.Object ;-)
11744
11745 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11746
11747         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11748         here. 
11749
11750         (Constructor.Emit): return if we fail to initialize the
11751         constructor.  Another door closed!  
11752
11753         * expression.cs (New.DoResolve): Improve error message (from -6 to
11754         1501).  Use DeclaredOnly lookup to find the exact constructor.
11755
11756         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11757         loop.  This is useful.
11758
11759         * cs-parser.jay: Adjust the default parameters so that destructors
11760         have the proper signature.
11761
11762 2002-04-26  Martin Baulig  <martin@gnome.org>
11763
11764         * driver.cs (LoadAssembly): If `assembly' contains any characters
11765         which are only valid in path names and not in assembly names
11766         (currently slash, backslash and point), use Assembly.LoadFrom ()
11767         instead of Assembly.Load () on the `assembly' (before iteration
11768         over the link_paths).
11769
11770 2002-04-26  Martin Baulig  <martin@gnome.org>
11771
11772         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11773
11774 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11775
11776         * class.cs (Property): use the new typemanager.MemberLookup
11777
11778         (TypeContainer.MemberLookup): Implement using the
11779         TypeManager.MemberLookup now. 
11780
11781         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11782         and return MemberInfos, so that these can be used without an
11783         EmitContext (what we had before).
11784
11785 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11786
11787         * expression.cs: Fix the case where the argument to params if the
11788         type of the params.  I omitted handling this before.   Fixed
11789
11790 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11791
11792         * driver.cs: Call BootCorlib_PopulateCoreType
11793
11794         * class.cs (Property.CheckBase): Check for properties only, not
11795         for all members. 
11796
11797         * interface.cs: Temporary hack: try/catch around the
11798         CustomAttributeBuilder, because I am getting an exception that I
11799         do not understand.
11800
11801         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11802         types whose definitions are required to be there (attributes are
11803         defined before standard types).
11804
11805         Compute definitions as we boot the various types, as they are used
11806         immediately (value_type class will need object_type, but if we do
11807         not initialize object_type, we will pass a null, which will let
11808         the runtime pick the System.Object from the existing corlib, which
11809         is not what we want).
11810
11811 2002-04-22  Patrik Torstensson <totte@labs2.com>
11812
11813         * cs-tokenizer.cs: fixed a number of trim() issues.
11814
11815 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11816
11817         * expression.cs (Argument.Type): Ensure that we return the correct
11818         type when we have out or ref parameters [in which case we 
11819         append a "&"].
11820
11821 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11822
11823         * class.cs (Property, Indexer): Allow extern modifier in there. 
11824
11825         * typemanager.cs (InitBaseTypes): Initializes object_type and
11826         value_type, since those will be used early on during the bootstrap
11827         process to compile corlib.
11828
11829         (InitCoreTypes): Move code from here to InitBaseTypes.
11830
11831 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11832
11833         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11834         single-dimension arrays as using the ldlen opcode.  
11835
11836         Daniel Lewis discovered this optimization.  
11837
11838         * typemanager.cs: Add signature for System.Array::get_Length
11839
11840 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11841
11842         * statement.cs: report the error when the foreach does not apply to an
11843         array nor a collection.
11844
11845 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11846
11847         * expression.cs: Add implicit conversions to the operator ~.
11848
11849         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11850
11851         * typemanager.cs: Locate the decimal constructor.
11852
11853 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11854
11855         * attribute.cs: use the new property of TypeOf.
11856         * expression.cs: added 'get' property around typearg.
11857
11858         These changes fix a build breaker reported by NickD. Is this the
11859         correct way to fix?  If not, please, revert my changes and make it
11860         work :-).
11861
11862 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11863
11864         * attribute.cs: Add support for typeof in attribute invocations.
11865         I am not sure that this is right though.
11866
11867 2002-04-14  Duncan Mak  <duncan@ximian.com>
11868
11869         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11870         Binary.Operator.Division case.
11871
11872 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11873
11874         * class.cs (DefineType): Ensure that we do a proper check on
11875         attribute types and also register it with the TypeManager.
11876
11877         (TypeContainer.Targets): The default for attribute types is
11878         AttributeTargets.All.
11879
11880         * attribute.cs (ApplyAttributes): Registering the attribute type
11881         is done elsewhere, not when we discover we have a Usage attribute.
11882
11883 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11884
11885         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11886         and get rid of is_delegate parameter.
11887
11888         * everywhere : update.
11889
11890 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11891
11892         * cs-parser.jay (compilation_unit): Revamp completely to use
11893         some new ideas that I got from Rhys' grammar to solve the problems
11894         with assembly level attributes.
11895
11896         (outer_declaration): New grammar production.
11897
11898         (attribute_sections): Add.
11899
11900         (opt_attributes): Base on attribute_sections
11901
11902         (namespace_declaration): Allow opt_attributes to tackle the case
11903         when we have assembly level attributes - we are clever in this
11904         regard now ;-)
11905
11906         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11907         attributes in the non-global context.
11908
11909         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11910         instead of SetGlobalAttributes.
11911
11912         * class.cs, rootcontext.cs : Ensure we define and generate 
11913         attribute types before anything else.
11914
11915         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11916         and flag the new error -20 for the case when the attribute type
11917         does not have valid targets specified. csc does not catch this.
11918
11919         * ../errors/errors.txt : update for error # -20
11920
11921 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11922
11923         * support.cs (InternalParameters.ParameterModifier): Do some null
11924         checking and return sane values.
11925
11926         * class.cs (Method.Define): If we are a PInvoke method, ensure
11927         that we are static and extern. Report error # 601
11928
11929         * ../errors/cs0601.cs : Add test case for the above error.
11930
11931 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11932
11933         * rootcontext.cs (attribute_types): We need to keep type of
11934         all attribute types separately and emit code for them first.
11935
11936         (RegisterAttribute) : Implement.
11937
11938         * class.cs (DefineType): Check if the current Type is a custom
11939         attribute type and register it accordingly.
11940
11941         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11942         adding the first attribute twice and rename to
11943
11944         (SetGlobalAttributes): this.
11945
11946         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11947         lookups.
11948
11949         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11950         if we are processing global arguments. Hmm, I am unsure of this.
11951
11952 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11953
11954         * expression.cs: added static array of strings to avoid calling
11955         Enum.ToString () for Operator in Binary. Significant recover of
11956         performance.
11957
11958 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11959
11960         * class.cs (FindMembers): Allow the Builders of the various
11961         members to be null.  If they are skip them.  This only happens
11962         during the PInvoke declaration.
11963
11964 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11965
11966         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11967         failure, so we do not keep going afterwards.
11968
11969         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11970         wanted to pass `false' as the `is_delegate' argument.  If this is
11971         the case, why not use delegate_type == null to mean `is_delegate =
11972         false' and anything else as is_delegate = true.
11973
11974 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11975
11976         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11977         code for the section, not the beginning of the tests.
11978
11979 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11980
11981         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11982
11983         * expression.cs (Binary): same.  Warn about errors where we have
11984         Enum/Enum in operator + as well.
11985
11986 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11987
11988         * statement.cs:
11989                 - added support for switch(bool)
11990                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11991                 - add TableSwitchEmit() to handle table-based switch statements
11992
11993 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11994
11995         * expression.cs (Invocation.OverloadResolve): Factor out code which
11996         does parameter compatibility checking with arguments so that we can 
11997         re-use the code even from Delegate.VerifyApplicability
11998
11999         (VerifyArgumentsCompat): Move above code here.
12000
12001         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12002         and instead make a call to the above method.
12003
12004 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12005
12006         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12007         We use it to keep track of classes which are attribute types.
12008
12009 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12010
12011         * delegate.cs (Delegate.Define): Correctly define the types in the
12012         presence of fixed and array parameters.
12013
12014         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12015         doing FindMembers.
12016
12017         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12018         include NonPublic after the first iteration.
12019
12020         * class.cs (Indexer.CheckBase): Only check if both parents are
12021         non-null. 
12022
12023         * cs-parser.jay (accessor_body): If empty, set to null.
12024
12025         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12026         same code path here to resolve constants names that we did have in
12027         MemberAccess.DoResolve.  There is too much code duplicated here.
12028
12029 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12030
12031         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12032
12033         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12034         to MakeUnionSet.
12035
12036         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12037         tokens, numbers and strings.
12038
12039         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12040         parenthesis.
12041
12042         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12043         asyncronous parameters and the regular parameters.  
12044
12045         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12046         specify the target directory.
12047
12048         * expression.cs: (This.DoResolve): Simplify
12049         (As.Emit): Optimize, do not generate IsInst if the expression is
12050         always of the given type.
12051
12052         (Is.DoResolve): Bug fix, we were reporting both always/never for
12053         the is expression.
12054
12055         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12056         creating too many unnecessary arrays.
12057
12058 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12059
12060         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12061         fields instead of rolling our own initializer.   Takes care of all
12062         implicit conversions, and drops unnecessary static checks/argument.
12063
12064 2002-03-31  Dick Porter  <dick@ximian.com>
12065
12066         * driver.cs: use the GetDirectories() return values properly, and
12067         use "/" as path separator.
12068
12069 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12070
12071         * expression.cs (Unary): Optimize - - expr into expr.
12072         (Binary): Optimize a + (-b) into a -b.
12073
12074         * codegen.cs (CodeGen): Made all methods static.
12075
12076 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12077
12078         * rootcontext.cs: 
12079
12080         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12081         TypeBuilder property.
12082
12083         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12084         instead. 
12085
12086         * tree.cs: Removed the various RecordXXXX, and replaced with a
12087         single RecordDecl.  Removed all the accessor methods, and just
12088         left a single access point Type 
12089
12090         * enum.cs: Rename DefineEnum to DefineType.
12091
12092         * decl.cs: New abstract method `DefineType' used to unify the
12093         Defines for Enumerations, Interfaces, TypeContainers and
12094         Delegates.
12095
12096         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12097         LookupBaseClasses method that used to live in class.cs and
12098         interface.cs here, and renamed to FindType.
12099
12100         * delegate.cs: Implement DefineType.  Take advantage of the
12101         refactored pattern for locating the parent builder without taking
12102         the parent_builder argument (which we know does not work if we are
12103         nested, and triggering a toplevel definition).
12104
12105 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12106
12107         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12108         accessibility of a member has changed during override and report
12109         an error if so.
12110
12111         * class.cs (Method.Define, Property.Define): Only complain on
12112         overrides if the method is private, any other accessibility is
12113         fine (and since we just checked the permission is the same, we are
12114         good to go).
12115
12116         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12117         and elif are processed always.  The other pre-processing
12118         directives are only processed if we are "taking" the path
12119
12120 2002-03-29  Martin Baulig  <martin@gnome.org>
12121
12122         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12123         current location is not Null.
12124
12125         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12126         a separate method so we can profile it.
12127
12128         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12129         `span.Seconds' are just seconds, but no minutes or hours.
12130         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12131
12132 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12133
12134         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12135         Remove the gratuitous set of Final:
12136
12137                                 // If an interface implementation, then we can set Final.
12138                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12139                                     implementing.DeclaringType.IsInterface)
12140                                         flags |= MethodAttributes.Final;
12141
12142         I do not know what I was smoking when I used that.
12143
12144
12145         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12146         step into fixing the name resolution issues for delegates and
12147         unifying the toplevel name resolution.
12148
12149 2002-03-28  Martin Baulig  <martin@gnome.org>
12150
12151         * class.cs (Method.Emit): If we have a symbol writer, call its
12152         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12153         tell it about the current method.
12154
12155         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12156         writer that we're going to emit the first byte of IL code for a new
12157         statement (a new source line).
12158         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12159         EmitContext.Mark() before emitting any code.
12160
12161         * location.cs (SymbolDocument): Return null when we're Null.
12162
12163         * statement.cs (Statement): Moved the `Location loc' variable here.
12164         (Statement.EmitBoolExpression): If we have a symbol writer, call
12165         ec.Mark() before emitting any code to tell it that we're at the
12166         beginning of a new statement.
12167         (StatementExpression): Added `Location' argument to the constructor.
12168         (Block): Added public readonly variable `StartLocation' and public
12169         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12170         (Block): Added constructor which takes a start and end location.
12171         (Block.SetEndLocation): New method. This sets the end location.
12172         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12173         local variables we create.
12174         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12175         each statement and do also mark the begin and end of the block.
12176
12177         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12178         tell it the current lexer.Location, use Location.Null for the end of the
12179         block.
12180         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12181         current block, set its end location using SetEndLocation().
12182         (statement_expression): StatementExpression constructor now takes the
12183         lexer.Location as additional argument.
12184         (for_statement, declare_local_variables): Likewise.
12185         (declare_local_variables): When creating a new implicit block, use the
12186         new Block constructor and pass it the lexer.Location.
12187
12188 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12189
12190         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12191         members also on the parent interfaces recursively.
12192
12193 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12194
12195         * report.cs: Use new formats, since Gonzalo finished the missing
12196         bits. 
12197
12198         * expression.cs (Binary.ResolveOperator): added missing operator|
12199         operator& and operator^ for bool/bool.
12200
12201         * cs-parser.jay: CheckDef now takes a Location argument that is
12202         used to report errors more precisly (instead of reporting the end
12203         of a definition, we try to track something which is a lot closer
12204         to the source of the problem).
12205
12206         * cs-tokenizer.cs: Track global token use, so we can properly flag
12207         the use of #define/#undef after the first token has been seen.
12208
12209         Also, rename the reportXXXX to Error_DescriptiveName
12210
12211         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12212         TypeContainer, so that Enum and Interface can use this too.
12213
12214         * class.cs (TypeContainer.LookupInterfaceOrClass,
12215         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12216         `builder' argument.  Typically this was used to pass the parent
12217         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12218         the definition).  
12219
12220         The problem is that a nested class could trigger the definition of
12221         a toplevel class, and the builder would be obviously wrong in that
12222         case. 
12223
12224         So we drop this argument, and we compute dynamically the
12225         TypeBuilder/ModuleBuilder (the correct information was available
12226         to us anyways from DeclSpace.Parent)
12227
12228         * interface.cs (Interface.DefineInterface): Drop builder
12229         parameter cleanup like class.cs
12230
12231         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12232         like class.cs
12233
12234         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12235         values. 
12236
12237         (Try.Emit): Propagate the returns value from the statement.
12238
12239         (Return.Emit): Even if we are leavning 
12240
12241         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12242
12243         * modifiers.cs: Fix the computation of MethodAttributes flags.
12244
12245 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12246
12247         * driver.cs: allow compilation of files that start with '/'.
12248         Add a default case when checking the argument of --target.
12249
12250 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12251
12252         * interface.cs: Implement the same search algorithm for types in
12253         the interface code.
12254
12255         * delegate.cs: Do not allow multiple definition.
12256
12257         * Recovered ChangeLog that got accidentally amputated
12258
12259         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12260
12261         * rootcontext.cs: Load manually enum to allow core classes to
12262         contain enumerations.
12263
12264         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12265         Update to new static methods in TypeManager.
12266
12267         * typemanager.cs (GetMethod, GetConstructor): Use our
12268         implementation of FindMembers to find the members, since during
12269         corlib compilation, the types are TypeBuilders and GetMethod and
12270         GetConstructor do not work.
12271
12272         Make all methods in TypeManager static.
12273
12274         (InitCodeHelpers): Split the functionality from
12275         the InitCodeTypes function.
12276
12277         * driver.cs: Call InitCodeHelpers after we have populated the
12278         types. 
12279
12280         * cs-parser.jay (delegate_declaration): we did not used to compute
12281         the delegate name correctly for void delegates.
12282
12283 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12284
12285         * rootcontext.cs (RootContext): Init the interface_resolve_order
12286         and type_container_resolve_order always.
12287
12288         (ResolveCore, BootstrapCorlib_ResolveClass,
12289         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12290         compiler when compiling with --nostdlib
12291
12292         * class.cs (TypeContainer.DefineType): Check that our parent is
12293         not null.  This test is most important when we are bootstraping
12294         the core types.
12295
12296         * codegen.cs: Split out the symbol writing code.
12297
12298 2002-03-25  Martin Baulig  <martin@gnome.org>
12299
12300         * driver.cs (-g): Made -g an alias for --debug.
12301
12302 2002-03-24  Martin Baulig  <martin@gnome.org>
12303
12304         * codegen.cs (SymbolWriter): New public variable. Returns the
12305         current symbol writer.
12306         (CodeGen): Added `bool want_debugging_support' argument to the
12307          constructor. If true, tell the ModuleBuild that we want debugging
12308         support and ask it for the ISymbolWriter.
12309         (Save): If we have a symbol writer, call it's Close() method after
12310         saving the assembly.
12311
12312         * driver.c (--debug): New command line argument to create a
12313         debugger information file.
12314
12315         * location.cs (SymbolDocument): New public property. Returns an
12316         ISymbolDocumentWriter object for the current source file or null
12317         if we don't have a symbol writer.
12318
12319 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12320
12321         * driver.cs (LoadAssembly): Correctly return when all the paths
12322         have been tried and not before.
12323
12324         * statement.cs (Switch.Emit): return the actual coverage for this
12325         statement (returns/not-returns)
12326
12327         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12328         switch of the statement if we are the last switch section.  That
12329         kills two problems: try/catch problems (we used to emit an empty
12330         nop at the end) and switch statements where all branches would
12331         return. 
12332
12333 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12334
12335         * driver.cs: Add default assemblies (the equivalent to the
12336         Microsoft CSC.RSP file)
12337
12338         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12339         also update tokens_seen and set it to false.
12340
12341         * driver.cs: Implement --recurse for Mike.
12342
12343         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12344         correctly splitting out the paths.
12345
12346 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12347
12348         * interface.cs (Interface.PopulateProperty): Instead of using
12349         `parent' as the declaration space for the set parameters, use
12350         `this' 
12351
12352         * support.cs (InternalParameters): InternalParameters constructor
12353         takes a DeclSpace instead of a TypeContainer.
12354
12355         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12356         types are being initialized, load the address of it before calling
12357         the function.  
12358
12359         (New): Provide a mechanism to disable the generation of local
12360         value type temporaries when the caller will be providing us with
12361         an address to store it.
12362
12363         (ArrayCreation.EmitDynamicInitializers): Use it.
12364
12365 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12366
12367         * expression.cs (Invocation.EmitArguments): Only probe for array
12368         property if there is more than one argument.  Sorry about that.
12369
12370         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12371         empty param arrays.
12372
12373         * class.cs (Method.LabelParameters): Fix incorrect code path that
12374         prevented the `ParamArrayAttribute' from being applied to the
12375         params attribute.
12376
12377 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12378
12379         * support.cs (ReflectionParameters): Correctly compute whether the
12380         last argument is a params array.  Fixes the problem with
12381         string.Split ('a')
12382
12383         * typemanager.cs: Make the assemblies array always be non-null
12384         (empty, but non-null)
12385
12386         * tree.cs (RecordDecl): New function that abstracts the recording
12387         of names.  This reports error 101, and provides a pointer to the
12388         previous declaration.  Fixes a crash in the compiler.
12389
12390         * cs-parser.jay (constructor_declaration): Update to new grammar,
12391         and provide a constructor_body that can be empty.
12392
12393 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12394
12395         * driver.cs: Add support for --resources.
12396
12397         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12398         Make all types for the various array helper methods be integer.
12399
12400         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12401         CheckState to ConvCast.
12402
12403         (ConvCast): Now it takes a `checked' state argument, to avoid
12404         depending on the emit context for the conversion, and just using
12405         the resolve time setting.
12406
12407         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12408         instead of Invocation.EmitArguments.  We do not emit the original
12409         arguments, instead we emit those which have been converted to
12410         unsigned int expressions.
12411
12412         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12413
12414         * codegen.cs: ditto.
12415
12416         * expression.cs (LocalVariableReference): Drop the use of the
12417         Store function that depended on the variable index.
12418
12419         * statement.cs (VariableInfo): Drop the `Idx' property from this
12420         class, as this is not taking into account the indexes for
12421         temporaries tat we generate during the execution, getting the
12422         indexes wrong.
12423
12424         * class.cs: First emit class initializers, then call the parent
12425         constructor. 
12426
12427         * expression.cs (Binary): Fix opcode emision.
12428         (UnaryMutator.EmitCode): Support checked code generation
12429
12430         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12431         matches for events for both the Static and Instance scans,
12432         pointing to the same element.   Fix that.
12433
12434 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12435
12436         * rootcontext.cs (ResolveTree): Always set the
12437         interface_resolve_order, because nested interfaces will be calling
12438         into us.
12439
12440         * class.cs (GetInterfaceOrClass): Track the same resolution
12441         process used by TypeManager.LookupType.  This fixes the nested
12442         type lookups in class declarations (separate path from
12443         LookupType). 
12444
12445         (TypeContainer.DefineType): Also define nested interfaces.
12446         (TypeContainer.RegisterOrder): New public function used to
12447         register the order in which child interfaces need to be closed.
12448
12449         Nested interfaces need to be closed after their parents have been
12450         created. 
12451
12452         * interface.cs (InterfaceAttr): Put all the logic for computing
12453         the interface attribute here. 
12454
12455         (DefineInterface): Register our interface order with the
12456         RootContext or with the TypeContainer depending on the case.
12457
12458 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12459
12460         * cs-parser.jay: rework foreach statement to work with the new
12461         changes to the policy on SimpleNames.
12462
12463         * report.cs: support Stacktrace on warnings as well.
12464
12465         * makefile: drop --unsafe and /unsafe from the compile.
12466
12467 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12468
12469         * ecore.cs (StandardConversionExists): Modify to take an Expression
12470         as the first parameter. Ensure we do null -> reference type conversion
12471         checking.
12472
12473         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12474         temporary Expression objects.
12475
12476 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12477
12478         * interface.cs: workaround bug in method overloading resolution
12479         (there is already a bugzilla bug for it).
12480
12481 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12482
12483         We could also solve this problem by having a separate path for
12484         performing type lookups, instead of DoResolve, we could have a
12485         ResolveType entry point, and only participating pieces of the
12486         production (simplename, deref, array) would implement this. 
12487
12488         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12489         signal SimpleName to only resolve type names and not attempt to
12490         resolve anything else.
12491
12492         * expression.cs (Cast): Set the flag.
12493
12494         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12495
12496         * class.cs: Only report 108 if there is no `new' modifier.
12497
12498         * cs-parser.jay: rework foreach statement to work with the new
12499         changes to the policy on SimpleNames.
12500
12501         * report.cs: support Stacktrace on warnings as well.
12502
12503         * makefile: drop --unsafe and /unsafe from the compile.
12504
12505 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12506
12507         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12508         lookups here, instead of doing that at parse time.  This means
12509         that our grammar will not introduce `LocalVariableReferences' as
12510         expressions at this point.  That solves the problem of code like
12511         this:
12512
12513         class X {
12514            static void Main ()
12515            { int X = 1;
12516             { X x = null }}}
12517
12518         This is only half the fix.  The full fix requires parameters to
12519         also be handled in this way.
12520
12521         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12522         makes the use more obvious of the DeclSpace.  The
12523         ec.TypeContainer.TypeBuilder is now only used to pull the
12524         TypeBuilder for it.
12525
12526         My theory is that I can get rid of the TypeBuilder completely from
12527         the EmitContext, and have typecasts where it is used (from
12528         DeclSpace to where it matters).  
12529
12530         The only pending problem is that the code that implements Aliases
12531         is on TypeContainer, and probably should go in DeclSpace.
12532
12533         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12534         lookups here, instead of doing that at parse time.  This means
12535         that our grammar will not introduce `LocalVariableReferences' as
12536         expressions at this point.  That solves the problem of code like
12537         this:
12538
12539         class X {
12540            static void Main ()
12541            { int X = 1;
12542             { X x = null }}}
12543
12544         This is only half the fix.  The full fix requires parameters to
12545         also be handled in this way.
12546
12547         * class.cs (Property.DefineMethod): When implementing an interface
12548         method, set newslot, when implementing an abstract method, do not
12549         set the flag (before we tried never setting it, or always setting
12550         it, which is the difference).
12551         (Indexer.DefineMethod): same.
12552         (Method.DefineMethod): same.
12553
12554         * ecore.cs: Only set the status used flag if we get back a Field.
12555
12556         * attribute.cs: Temporary hack, so Paolo can keep working.
12557
12558 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12559
12560         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12561         the unmanaged type in the case we have a MarshalAs attribute.
12562
12563         (Resolve): Handle the case when we are parsing the special MarshalAs
12564         attribute [we need to store the unmanaged type to use later]
12565
12566         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12567         MarshalAs Attribute.
12568
12569         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12570         on parameters and accordingly set the marshalling info.
12571
12572 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12573
12574         * class.cs: Optimizing slightly by removing redundant code after
12575         we switched to the `NoTypes' return value.
12576         (Property.DefineMethod): use NoTypes here too.
12577
12578         This fixes the bug I introduced in my last batch of changes.
12579
12580 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12581
12582         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12583
12584         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12585         Enums since those are types too. 
12586
12587         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12588
12589         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12590         thanks to a call during the lookup process.
12591
12592 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12593
12594         * statement.cs (Foreach): Lots of work to accomodate a particular
12595         kind of foreach statement that I had not kept in mind.  It is
12596         possible to have foreachs on classes that provide a GetEnumerator
12597         method that return objects that implement the "pattern" for using
12598         a foreach, there is no need to support GetEnumerator
12599         specifically. 
12600
12601         This is needed to compile nant.
12602
12603         * decl.cs: Only report 114 if the member is not `Finalize' and if
12604         the warning level is at least 2.
12605
12606         * class.cs: Moved the compare function from Method to
12607         MethodSignature. 
12608
12609         (MethodSignature.InheritableMemberSignatureCompare): Add new
12610         filter function that is used to extract inheritable methods from a
12611         class. 
12612
12613         (Method.Define): Use the new `inheritable_method_signature_filter'
12614         delegate
12615
12616         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12617         command. 
12618
12619 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12620
12621         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12622
12623         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12624
12625         * expression.cs: Pass location information to
12626         ConvertImplicitStandard. 
12627
12628         * class.cs: Added debugging code to track return values from
12629         interfaces. 
12630
12631 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12632
12633         * expression.cs (Is.DoResolve): If either side of the `is' is an
12634         interface, do not flag the warning.
12635
12636         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12637         for interfaces
12638
12639         * report.cs: Allow for --fatal to be used with --probe.
12640
12641         * typemanager.cs (NoTypes): Move the definition for the empty Type
12642         array here. 
12643
12644         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12645         properties. 
12646         (TypeContainer.DefineProxy): New function used to proxy to parent
12647         implementations when implementing interfaces.
12648         (TypeContainer.ParentImplements): used to lookup if our parent
12649         implements a public function that is required by an interface.
12650         (TypeContainer.VerifyPendingMethods): Hook this up.
12651
12652         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12653         `modules' and `assemblies' arraylists into arrays.  We only grow
12654         these are the very early start up of the program, so this improves
12655         the speedof LookupType (nicely measured).
12656
12657         * expression.cs (MakeByteBlob): Replaced unsafe code with
12658         BitConverter, as suggested by Paolo.
12659
12660         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12661         folding of string concatenation, but if either side is a string,
12662         and the other is not, then return null, and let the runtime use
12663         the concatenation on the string plus the object (using
12664         `Object.ToString'). 
12665
12666 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12667
12668         Constant Folding has been implemented now.
12669
12670         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12671         the error instead on types that are not supported in one's
12672         complement. 
12673
12674         * constant.cs (Constant and all children): New set of functions to
12675         perform implict and explicit conversions.
12676
12677         * ecore.cs (EnumConstant): Implement the new functions to perform
12678         conversion by proxying to the child expression.
12679
12680         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12681         own separate setting that can not be turned off from the command
12682         line using --unchecked or --checked and is only controlled using
12683         the checked/unchecked statements and expressions.  This setting is
12684         used by the constant folder to flag errors.
12685
12686         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12687         ConstantCheckState as well.   
12688
12689         During Resolve, they also have to flag the state, because the
12690         constant folder runs completely in the Resolve phase.
12691
12692         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12693         well.
12694
12695 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12696
12697         * cfold.cs: New file, this file contains the constant folder.
12698
12699         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12700         argument to track whether we are using the resulting address to
12701         load or store a value and provide better error messages. 
12702
12703         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12704         new AddressOf arguments.
12705
12706         * statement.cs (Foreach.EmitCollectionForeach): Update
12707
12708         * expression.cs (Argument.Emit): Call AddressOf with proper
12709         arguments to track usage.
12710
12711         (New.DoEmit): Call AddressOf with new arguments.
12712
12713         (Unary.Emit): Adjust AddressOf call.
12714
12715 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12716
12717         * cs-parser.jay (member_access): Change the case for pre-defined types
12718         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12719         this suggestion.
12720
12721         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12722         a method body.
12723
12724         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12725         essentially like methods and apply attributes like MethodImplOptions to them too.
12726
12727         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12728         not being null.
12729
12730         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12731         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12732         is the DeclSpace.
12733
12734         * Update code everywhere accordingly.
12735
12736         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12737
12738         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12739
12740 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12741
12742         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12743         try performing lookups against those instead of jumping straight into using
12744         the 'using' clauses.
12745
12746         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12747
12748         (LookupType): Perform lookups in implicit parents too.
12749
12750         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12751         sequence as RootContext.LookupType. 
12752
12753         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12754         the various cases of namespace lookups into this method.
12755
12756 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12757
12758         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12759         in positional arguments)
12760
12761         * class.cs (Operator): Update the AllowedModifiers to contain
12762         extern. 
12763
12764         * cs-parser.jay: Update operator declaration to allow for the
12765         operator body to be empty.
12766
12767         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12768         values. 
12769
12770 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12771
12772         * class.cs (Method.Emit): Label parameters.
12773
12774         * driver.cs: Return 1 or 0 as the program exit code.
12775
12776 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12777
12778         * expression.cs: Special case the `null' object when trying to
12779         auto-compute the type, as anything can be explicitly converted to
12780         that. 
12781
12782         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12783         spotting this Paolo.
12784
12785         (Expression.ImplicitNumericConversion): Perform comparissions of
12786         the type using the underlying type in the case of an enumeration
12787         rather than using the enumeration type for the compare.
12788
12789         Cope with the underlying == type case, which is not possible to
12790         catch before. 
12791
12792         (Expression.ConvertNumericExplicit): Perform comparissions of
12793         the type using the underlying type in the case of an enumeration
12794         rather than using the enumeration type for the compare.
12795
12796         * driver.cs: If the user does not supply an extension, assume .exe
12797
12798         * cs-parser.jay (if_statement): Rewrote so that we can track the
12799         location for the if statement.
12800
12801         * expression.cs (Binary.ConstantFold): Only concat strings when
12802         the operation is "+", not everything ;-)
12803
12804         * statement.cs (Statement.EmitBoolExpression): Take a location
12805         argument. 
12806         (If, While, Do): Track location.
12807
12808         * expression.cs (Binary.ResolveOperator): In the object + string
12809         case, I was missing a call to ConvertImplicit
12810
12811 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12812
12813         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12814         Location arguments. Ensure we use RootContext.LookupType to do our work
12815         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12816
12817         * interface.cs (PopulateMethod): Handle the type of the parameter being
12818         null gracefully.
12819
12820         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12821         have a params method with no fixed arguments and a call is made with no
12822         arguments.
12823
12824 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12825
12826         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12827         the verbatim-string-literal
12828
12829         * support.cs (InternalParameters.ParameterModifier): handle null
12830         fixed parameters.
12831         (InternalParameters.ParameterType): ditto.
12832
12833         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12834         duplicating the name of the variable parameter.
12835         (GetParameterByName): Fix bug where we were not looking up array
12836         paramters if they were the only present (thanks Paolo!).
12837         (GetParameterInfo): We only have an empty set of types if both
12838         fixed and array are set to null.
12839         (GetParameterInfo-idx): Handle FixedParameter == null
12840
12841         * cs-parser.jay: Handle the case where there is no catch
12842         statements (missing null test).
12843
12844 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12845
12846         * driver.cs (MainDriver): Be conservative on our command line
12847         handling.
12848
12849         Catch DirectoryNotFoundException when calling GetFiles.
12850
12851         (SplitPathAndPattern): Used to split the input specification into
12852         a path and a pattern that we can feed to Directory.GetFiles.
12853
12854 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12855
12856         * statement.cs (Fixed): Implement the last case of the Fixed
12857         statement (string handling).
12858
12859         * expression.cs (StringPtr): New class used to return a char * to
12860         a string;  Used by the Fixed statement.
12861
12862         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12863
12864         * expression.cs (Binary.ResolveOperator): Remove redundant
12865         MemberLookup pn parent type.
12866         Optimize union call, we do not need a union if the types are the same.
12867         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12868         type.
12869
12870         Specialize the use of MemberLookup everywhere, instead of using
12871         the default settings. 
12872
12873         (StackAlloc): Implement stackalloc keyword.
12874
12875         * cs-parser.jay: Add rule to parse stackalloc.
12876
12877         * driver.cs: Handle /h, /help, /?
12878
12879         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12880         before we supported unsafe code.
12881
12882         * makefile: add --unsafe to the self compilation of mcs.
12883
12884 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12885
12886         * expression.cs (PointerArithmetic): New class that is used to
12887         perform pointer arithmetic.
12888         (Binary.Resolve): Handle pointer arithmetic
12889         Handle pointer comparission.
12890         (ArrayPtr): Utility expression class that is used to take the
12891         address of an array.
12892
12893         (ElementAccess): Implement array access for pointers
12894
12895         * statement.cs (Fixed): Implement fixed statement for arrays, we
12896         are missing one more case before we are done.
12897
12898         * expression.cs (Indirection): Implement EmitAssign and set the
12899         ExprClass to Variable.  This allows pointer dereferences to be
12900         treated as variables, and to have values assigned to them.
12901
12902         * ecore.cs (Expression.StoreFromPtr): New utility function to
12903         store values dereferencing.
12904
12905 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12906
12907         * expression.cs (Binary.ResolveOperator): Ensure that we are
12908         not trying to operate on a void type - this fixes the reported
12909         bug.
12910
12911         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12912         the parent implementation is sealed.
12913
12914         * ../errors/cs0239.cs : Add.
12915
12916         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12917
12918         * typemanager.cs (unverifiable_code_type): Corresponds to 
12919         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12920         which have unsafe code in them.
12921
12922         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12923         unsafe context.
12924
12925 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12926
12927         * cs-tokenizer.cs: Add support for @"litreal strings"
12928
12929         Make tokenizer accept pre-processor directives
12930         on any column (remove the old C-like limitation). 
12931
12932         * rootcontext.cs (EmitCode): Emit any global attributes.
12933         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12934
12935         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12936
12937         * cs-parser.jay: Add support for global attributes.  
12938
12939 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12940
12941         * expression.cs (Indirection): New helper class.  Unary will
12942         create Indirection classes to be able to implement the
12943         IMemoryLocation interface on it.
12944
12945 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12946
12947         * cs-parser.jay (fixed_statement): reference the right statement.
12948
12949         * statement.cs (Fixed.Emit): Finish implementing the fixed
12950         statement for the &x case.
12951
12952 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12953
12954         * class.cs (Property.Define, Method.Define): Remove newslot when
12955         `implementing'.  
12956
12957         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12958         wrong.  NewSlot should only be used if the `new' keyword is present.
12959
12960         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12961         locating our system dir.  Sorry about this.
12962
12963 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12964
12965         * driver.cs (GetSystemDir): Compute correctly the location of our
12966         system assemblies.  I was using the compiler directory instead of
12967         the library directory.
12968
12969 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12970
12971         * expression.cs (BetterFunction): Put back in what Miguel commented out
12972         since it is the correct fix. The problem is elsewhere ;-)
12973
12974         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12975         parameters of the parms method are themselves compatible or not !
12976
12977         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12978         to check that a class implements an interface before saying that an implicit
12979         conversion was allowed. Use ImplementsInterface to do the checking.
12980
12981 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12982
12983         * class.cs (Method.Define): Track whether we are an explicit
12984         implementation or not.  And only call DefineMethodOverride if we
12985         are an explicit implementation.
12986
12987         (Property.DefineMethod): Ditto.
12988
12989 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12990
12991         * expression.cs (BetterFunction): Catch hideous bug which was
12992          preventing us from detecting ambiguous calls due to implicit casts i.e
12993         cs0121.
12994
12995 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12996
12997         * support.cs (Pair): Remove un-needed method.  I figured why I was
12998         getting the error in cs-parser.jay, the variable in a foreach loop
12999         is readonly, and the compiler does not really treat this as a variable.
13000
13001         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13002         instead of EQUALS in grammar.  
13003
13004         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13005
13006         * expression.cs (Unary.DoResolve): Check whether the argument is
13007         managed or not.
13008
13009 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13010
13011         * support.cs: Api for Pair to set a value.  Despite the fact that
13012         the variables are public the MS C# compiler refuses to compile
13013         code that accesses the field if the variable is part of a foreach
13014         statement. 
13015
13016         * statement.cs (Fixed): Begin implementation of the fixed
13017         statement.
13018
13019         (Block.AddVariable): Return the VariableInfo on success and null
13020         on failure instead of true/false. 
13021
13022         * cs-parser.jay (foreach): Catch errors on variables already
13023         defined (we were ignoring this value before) and properly unwind
13024         the block hierarchy
13025
13026         (fixed_statement): grammar for the fixed statement.
13027
13028 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13029
13030         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13031         pointer types to be incretemented.
13032
13033         (SizeOf): Implement.
13034
13035         * cs-parser.jay (pointer_member_access): Implement
13036         expr->IDENTIFIER production.
13037
13038         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13039         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13040         on safe contexts.
13041
13042         (Unary): Implement indirection.
13043
13044         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13045         use in non-unsafe context).
13046
13047         (SimpleName.DoResolve): Check for pointers in field access on safe
13048         contexts. 
13049
13050         (Expression.LoadFromPtr): Factor the load-indirect code in this
13051         function.  This was duplicated in UnboxCast and ParameterReference
13052
13053 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13054
13055         * expression.cs (ComposedCast): report an error if a pointer cast
13056         is used in a safe region.
13057
13058         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13059         pointer type casts in unsafe context.
13060
13061         * codegen.cs (EmitContext): Set up IsUnsafe.
13062
13063         * cs-parser.jay (non_expression_type): Add productions for pointer
13064         casts. 
13065
13066         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13067         code.  We should not use force into static mode if the method is
13068         not virtual.  Fixes bug in MIS
13069
13070         * statement.cs (Do.Emit, While.Emit, For.Emit,
13071         Statement.EmitBoolExpression): Add support to Do and While to
13072         propagate infinite loop as `I do return' semantics.
13073
13074         Improve the For case to also test for boolean constants.
13075
13076         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13077         to the list of attributes we can add.
13078
13079         Remove `EmitContext' argument.
13080
13081         * class.cs (Method.Define): Apply parameter attributes.
13082         (Constructor.Define): Apply parameter attributes.
13083         (MethodCore.LabelParameters): Move here the core of labeling
13084         parameters. 
13085
13086         * support.cs (ReflectionParameters.ParameterModifier,
13087         InternalParameters.ParameterModifier): Use IsByRef on the type and
13088         only return the OUT bit for these parameters instead of in/out/ref
13089         flags.
13090
13091         This is because I miss-understood things.  The ParameterInfo.IsIn
13092         and IsOut represent whether the parameter has the [In] and [Out]
13093         attributes set.  
13094
13095 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13096
13097         * ecore.cs (FieldExpr.Emit): Release temporaries.
13098
13099         * assign.cs (LocalTemporary.Release): new function.
13100
13101         * codegen.cs (EmitContext.GetTemporaryStorage,
13102         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13103         temporary storage.  Now we can "put back" localbuilders when we
13104         are done with them
13105
13106 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13107
13108         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13109         need to make a copy of the variable to generate verifiable code.
13110
13111 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13112
13113         * driver.cs: Compute dynamically the system directory.
13114
13115         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13116         Slower, but more generally useful.  Used by the abstract
13117         registering implementation. 
13118
13119         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13120         the rules for the special rule on Type/instances.  First check if
13121         we have the same name, and if so, try that special static path
13122         rather than the instance path.
13123
13124 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13125
13126         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13127         for, while and if.
13128
13129         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13130         Enum, ValueType, Delegate or Array for non-corlib compiles.
13131
13132         * cs-tokenizer.cs: Catch long identifiers (645)
13133
13134         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13135         piece of code.
13136
13137         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13138         fix, we were returning too early, so we were not registering
13139         pending methods from abstract classes.
13140
13141         Do not register pending methods if the class is abstract.
13142
13143         * expression.cs (Conditional.DoResolve): Report circular implicit
13144         conversions when we neecd to compute it for conditional
13145         expressions. 
13146
13147         (Is.DoResolve): If the expression is always of the provided type,
13148         flag warning 183.  If the expression can not ever be of the
13149         provided type flag warning 184.
13150
13151         * class.cs: Catch 169 as well.
13152
13153         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13154         read. 
13155
13156 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13157
13158         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13159
13160 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13161
13162         * interface.cs: (PopulateMethod): Check for pointers being defined
13163         only if the unsafe context is active.
13164         (PopulateProperty): ditto.
13165         (PopulateIndexer): ditto.
13166
13167         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13168         specified.  If pointers are present, make sure that they are
13169         present in an unsafe context.
13170         (Constructor, Constructor.Define): ditto.
13171         (Field, Field.Define): ditto.
13172         (Property, Property.Define): ditto.
13173         (Event, Event.Define): ditto.
13174
13175         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13176         hashtable if there are classes or structs defined.
13177
13178         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13179         code, as the constant resolution moved.
13180
13181         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13182         the metadata, so we can flag error 133. 
13183
13184         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13185         pointer is being declared in an unsafe context.
13186
13187 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13188
13189         * modifiers.cs (Modifiers.Check): Require a Location argument.
13190         Report error 227 for Unsafe use.
13191
13192         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13193
13194         * statement.cs (For.Emit): If the test is null, then report that
13195         we do `return', as we wont reach anything afterwards.
13196
13197         (Switch.SwitchGoverningType): Track the expression that matched
13198         the conversion.
13199
13200         * driver.cs: Allow negative numbers as an error code to flag.
13201
13202         * cs-parser.jay: Handle 1551.
13203
13204         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13205
13206 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13207
13208         * cs-parser.jay: Report 1518 (type declaration can only contain
13209         class, struct, interface, enum or delegate)
13210
13211         (switch_label): Report 1523 (keywords `case' or `default' must
13212         preced code)
13213
13214         (opt_switch_sections): Report 1522 (empty switch)
13215
13216         * driver.cs: Report 1515 (response file specified multiple times)
13217         Report 1516 (Source file specified multiple times).
13218
13219         * expression.cs (Argument.Resolve): Signal 1510
13220
13221         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13222         access not allowed in static code)
13223
13224 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13225
13226         * typemanager.cs (IsPointerType): Utility method which we are going
13227         to need a lot.
13228
13229         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13230         the object type, so we take care of that.
13231
13232         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13233
13234         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13235         added to non-params parameters :-)
13236
13237         * typemanager.cs (CSharpName): Include 'void' type too. 
13238
13239         (void_ptr_type): Include in the set of core types.
13240
13241         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13242         duplicating code.
13243
13244         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13245         an unsafe context.
13246
13247         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13248         completely forgotten about it.
13249
13250 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13251
13252         * cs-parser.jay (pointer_type): Add. This begins our implementation
13253         of parsing rules for unsafe code.
13254
13255         (unsafe_statement): Implement.
13256
13257         (embedded_statement): Modify to include the above.
13258
13259         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13260
13261         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13262         if the current context is an unsafe one.
13263
13264         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13265         are handled differently, we need separate rules for them.
13266
13267         (local_variable_declaration): Update to use local_variable_pointer_type
13268         to allow variable declarations of unmanaged pointer types.
13269
13270         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13271         in unsafe contexts.
13272
13273         * ../errors/cs0214.cs : Add.
13274
13275 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13276
13277         * makefile: remove 'response' file when cleaning.
13278
13279 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13280
13281         * cs-parser.jay: Report 1524.
13282
13283 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13284
13285         * typemanager.cs (RegisterMethod): drop checking if we have
13286         registered this from here
13287
13288 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * class.cs (Method.EmitDestructor): Implement calling our base
13291         destructor. 
13292
13293         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13294         value of InFinally.
13295
13296         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13297         this routine and will wrap the call in a try/catch block.  Deal
13298         with the case.
13299
13300 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13301
13302         * ecore.cs (Expression.MemberLookup): instead of taking a
13303         parameter `same_type' that was used to tell whether we could
13304         access private members we compute our containing type from the
13305         EmitContext.
13306
13307         (FieldExpr): Added partial support for volatile fields.  This does
13308         not work for volatile fields exposed from assemblies, as I can not
13309         figure out how to extract the modreq from it.
13310
13311         Updated all the source files to use this.
13312
13313         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13314         because it is referenced by MemberLookup very often. 
13315
13316 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13317
13318         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13319         TypeBuilder.GetCustomAttributes to retrieve what we need.
13320
13321         Get rid of redundant default_member_attr_type as this is the same as
13322         default_member_type which already exists.
13323
13324         * interface.cs, attribute.cs : Update accordingly.
13325
13326 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13327
13328         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13329         work for TYpeBuilders though.  Ravi, can you please fix this?
13330
13331         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13332
13333         * expression.cs (Argument.Emit): Handle the case of ref objects
13334         being passed to ref functions;  
13335
13336         (ParameterReference.EmitLoad): Loads the content of the pointer
13337         without dereferencing.
13338
13339 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13340
13341         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13342
13343 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13344
13345         * class.cs (Indexer.DefineMethod): Incorporate the interface
13346         type in the name of the method if we are doing explicit interface
13347         implementation.
13348
13349         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13350
13351         (BetterConversion): Fix extremely trivial bug where we were referring to
13352         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13353         again !
13354
13355         * ../errors/bug16.cs : Add although we have fixed it.
13356
13357 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13358
13359         * expression.cs (BaseIndexer): Begin implementation.
13360
13361         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13362
13363         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13364         production directly to remove a shift/reduce, and implement
13365         explicit interface implementation.
13366
13367         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13368         after a floating point suffix.
13369
13370         * expression.cs (DoNumericPromotions): Improved the conversion for
13371         uint/uint.  If we have a constant, we avoid doing a typecast to a
13372         larger type.
13373
13374         * class.cs (Indexer): Implement explicit interface implementation
13375         for indexers.
13376
13377 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13378
13379         * class.cs: make the default instance constructor public and hidebysig.
13380
13381 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13382
13383         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13384         so we can call it from elsewhere.
13385
13386         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13387         we emit it internally if the class has a defined indexer; otherwise the user
13388         emits it by decorating the class definition with the DefaultMemberAttribute.
13389
13390         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13391         attribute is not used on a type which defines an indexer.
13392
13393         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13394         character when we skip whitespace.
13395
13396         * ../errors/cs0646.cs : Add.
13397
13398 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13399
13400         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13401         again. 
13402
13403         * makefile: Add practical target `mcs3.exe' which builds the third
13404         generation compiler. 
13405
13406         * expression.cs (New): Fix structures constructor calling.
13407
13408         * class.cs (Property, Method, Indexer): Emit Final flag on the
13409         method if we are an interface implementation and we are not
13410         abstract. 
13411
13412         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13413         whether this property is referencing a `base' method.
13414
13415         * expression.cs (Invocation.EmitCall): take an extra argument:
13416         is_base, this is used to determine whether the `call' or
13417         `callvirt' opcode should be used.
13418
13419
13420         * delegate.cs: update EmitCall.
13421
13422         * class.cs (Method.Define): Set NewSlot for the cases where we are
13423         not implementing an interface method.
13424
13425         (Property.Define): ditto.
13426
13427 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13428
13429         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13430         'r'.  Allows mcs to parse itself fully.
13431
13432 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13433
13434         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13435         of the number of initializers that require the InitializeArray method.
13436
13437         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13438         update the above field where necessary.
13439
13440         (MakeByteBlob): Update accordingly.
13441
13442         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13443         greater than 2.
13444
13445         (EmitDynamicInitializers): Update in accordance with the new optimization.
13446
13447         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13448         same OpCode applies.
13449
13450         * cs-parser.jay : Fix some glaring errors I introduced.
13451
13452 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13453
13454         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13455         so that we can check for name clashes there too.
13456
13457         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13458         for interface indexers.
13459
13460         * interfaces.cs (Define): Emit the default member attribute.
13461
13462         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13463         variable was being referred to while setting the value ;-)
13464
13465 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13466
13467         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13468         byte-by-byte information when we know the data is zero.
13469
13470         Make the block always a multiple of 4, because
13471         DefineInitializedData has a bug.
13472
13473         * assign.cs: Fix, we should assign from the temporary, not from
13474         the source. 
13475
13476         * expression.cs (MakeByteBlob): Fix my incorrect code.
13477
13478 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13479
13480         * typemanager.cs (EnumToUnderlying): This function is used to get
13481         the underlying type from an enumeration, because it does not
13482         always work. 
13483
13484         * constant.cs: Use the I4_S form for values between -128 and 127.
13485
13486         * statement.cs (Block.LookupLabel): Looks up a label.
13487         (Block): Drop support for labeled blocks.
13488
13489         (LabeledStatement): New kind of statement that represents a label
13490         only.
13491
13492         (Goto): Finally implement this bad boy.
13493
13494         * cs-parser.jay: Update to reflect new mechanism to implement
13495         labels.
13496
13497 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13498
13499         * codegen.cs (EmitContext.This): a codegen property that keeps the
13500         a single instance of this instead of creating many different this
13501         instances. 
13502
13503         * delegate.cs (Delegate.DoResolve): Update to use the property;
13504
13505         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13506
13507         * expression.cs (BaseAccess.DoResolve): Ditto.
13508
13509 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13510
13511         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13512         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13513
13514         (InitCoreTypes): Update accordingly.
13515
13516         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13517         so we can quickly store the state.
13518
13519         (ApplyAttributes): Set the correct implementation flags
13520         for InternalCall methods.
13521
13522 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13523
13524         * expression.cs (EmitCall): if a method is not virtual, then do
13525         not use callvirt on it.
13526
13527         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13528         user defined stuff) requires the use of stobj, which takes an
13529         address on the stack instead of an array and an index.  So emit
13530         the Ldelema operation for it.
13531
13532         (EmitStoreOpcode): Use stobj for valuetypes.
13533
13534         (UnaryMutator.EmitCode): Use the right 1 value depending on
13535         whether we are dealing with int64/uint64, float or doubles.
13536
13537         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13538         constructors that I implemented last night.
13539
13540         (Constructor.IsDefault): Fix to work properly for static
13541         constructors.
13542
13543         * cs-parser.jay (CheckDef): report method signature errors.
13544         Update error number 103 to be 132.
13545
13546         * decl.cs: New AdditionResult enumeration value: MethodExists.
13547         Although we do this check for methods later on in the semantic
13548         analysis, catching repeated default constructors is so easy that
13549         we catch these here. 
13550
13551         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13552         promotions code.
13553
13554         (ParameterReference.EmitAssign, Emit): handle
13555         bools as bytes.
13556
13557         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13558         (ArrayAccess.EmitStoreOpcode): ditto.
13559
13560         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13561
13562         * expression.cs (MakeByteBlob): Complete all the missing types
13563         (uint, short, ushort, byte, sbyte)
13564
13565         * class.cs: Only init instance field initializers on instance
13566         constructors. 
13567
13568         Rename `constructors' to instance_constructors. 
13569
13570         (TypeContainer.AddConstructor): Only add constructors to the list
13571         if it is not static.
13572
13573         Make sure that we handle default_static_constructor independently
13574         everywhere where we handle instance_constructors
13575
13576 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13577
13578         * class.cs: Do not lookup or create a base initializer for a
13579         static constructor.
13580
13581         (ConstructorInitializer.Resolve): use the proper type to lookup
13582         for constructors.
13583
13584         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13585
13586         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13587         in DeclSpace. 
13588
13589         * decl.cs: CloseType is now an virtual method, the default
13590         implementation just closes this type.
13591
13592 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13593
13594         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13595         to PreserveSig by default. Also emit HideBySig on such methods.
13596
13597         Basically, set the defaults to standard values.
13598
13599         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13600         argument, if candidate is better, it can't be worse than the best !
13601
13602         (Invocation): Re-write bits to differentiate between methods being
13603         applicable in their expanded form and their normal form - for params
13604         methods of course.
13605
13606         Get rid of use_standard everywhere as only standard conversions are allowed
13607         in overload resolution. 
13608
13609         More spec conformance.
13610
13611 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13612
13613         * driver.cs: Add --timestamp, to see where the compiler spends
13614         most of its time.
13615
13616         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13617         `this' in static code.
13618
13619         (SimpleName.DoResolve): Implement in terms of a helper function
13620         that allows static-references to be passed upstream to
13621         MemberAccess.
13622
13623         (Expression.ResolveWithSimpleName): Resolve specially simple
13624         names when called by MemberAccess to implement the special
13625         semantics. 
13626
13627         (Expression.ImplicitReferenceConversion): Handle conversions from
13628         Null to reference types before others, as Null's type is
13629         System.Object. 
13630
13631         * expression.cs (Invocation.EmitCall): Handle the special case of
13632         calling methods declared on a reference type from a ValueType
13633         (Base classes System.Object and System.Enum)
13634
13635         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13636         the left hand side is a TypeExpr, not on every enumeration. 
13637
13638         (Binary.Resolve): If types are reference types, then do a cast to
13639         object on operators != and == of both arguments.
13640
13641         * typemanager.cs (FindMembers): Extract instance and static
13642         members if requested.
13643
13644         * interface.cs (PopulateProperty): Use void_type instead of null
13645         as the return type for the setter method.
13646
13647         (PopulateIndexer): ditto.
13648
13649 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13650
13651         * support.cs (ReflectionParameters): Fix minor bug where we
13652         were examining the wrong parameter for the ParamArray attribute.
13653
13654         Cope with requests for the type of the parameter at position
13655         greater than the params parameter's. We now return the element
13656         type of the params array as that makes more sense.
13657
13658         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13659         accordingly as we no longer have to extract the element type
13660         ourselves.
13661
13662         (Invocation.OverloadResolve): Update.
13663
13664 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13665
13666         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13667         against IEnumerator, test whether the return value is a descendant
13668         of the IEnumerator interface.
13669
13670         * class.cs (Indexer.Define): Use an auxiliary method to implement
13671         the other bits of the method definition.  Begin support for
13672         explicit interface implementation.
13673
13674         (Property.DefineMethod): Use TypeManager.void_type instead of null
13675         for an empty return value.
13676
13677 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13678
13679         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13680         dealing with a FieldExpr which is composed of a FieldBuilder, in
13681         the code path we did extract the constant, but we should have
13682         obtained the underlying value to be able to cast it (otherwise we
13683         end up in an infinite loop, this is what Ravi was running into).
13684
13685         (ArrayCreation.UpdateIndices): Arrays might be empty.
13686
13687         (MemberAccess.ResolveMemberAccess): Add support for section
13688         14.5.4.1 that deals with the special case of E.I when E is a type
13689         and something else, that I can be a reference to a static member.
13690
13691         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13692         handle a particular array type to create byte blobs, it is just
13693         something we dont generate byteblobs for.
13694
13695         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13696         arguments. 
13697
13698         * location.cs (Push): remove the key from the hashtable that we
13699         are about to add.   This happens for empty files.
13700
13701         * driver.cs: Dispose files after we have parsed them.
13702
13703         (tokenize): new function that only runs the tokenizer on its
13704         input, for speed testing.
13705
13706 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13707
13708         * class.cs (Event.Define): Define the private field only if there
13709         are no accessors defined.
13710
13711         * expression.cs (ResolveMemberAccess): If there is no associated
13712         field with the event, that means we have an event defined with its
13713         own accessors and we should flag error cs0070 since transforming
13714         ourselves into a field is not valid in that case.
13715
13716         * ecore.cs (SimpleName.DoResolve): Same as above.
13717
13718         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13719         and charset to sane values.
13720
13721 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13722
13723         * assign.cs (DoResolve): Perform check on events only if they 
13724         are being accessed outside the declaring type.
13725
13726         * cs-parser.jay (event_declarations): Update rules to correctly
13727         set the type of the implicit parameter etc.
13728
13729         (add_accessor, remove_accessor): Set current local parameters.
13730
13731         * expression.cs (Binary): For delegate addition and subtraction,
13732         cast the return value from the method into the appropriate delegate
13733         type.
13734
13735 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13736
13737         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13738         of these as the workaround is unnecessary.
13739
13740         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13741         delegate data - none of that is needed at all.
13742
13743         Re-write bits to extract the instance expression and the delegate method
13744         correctly.
13745
13746         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13747         on delegates too.
13748
13749         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13750         of attaching attributes instead of duplicating code everywhere.
13751
13752         * everywhere : Update code to do attribute emission using the above method.
13753
13754 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13755
13756         * expression.cs (IsParamsMethodApplicable): if there are not
13757         parameters, return immediately.
13758
13759         * ecore.cs: The 0 literal can be implicity converted to an enum
13760         type. 
13761
13762         (SimpleName.DoResolve): First lookup the type, then lookup the
13763         members. 
13764
13765         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13766         want to get its address.  If the InstanceExpression is not
13767         addressable, store the result in a temporary variable, then get
13768         the address of it.
13769
13770         * codegen.cs: Only display 219 errors on warning level or above. 
13771
13772         * expression.cs (ArrayAccess): Make it implement the
13773         IMemoryLocation interface.
13774
13775         (Binary.DoResolve): handle the operator == (object a, object b)
13776         and operator != (object a, object b) without incurring into a
13777         BoxedCast (because 5 != o should never be performed).
13778
13779         Handle binary enumerator operators.
13780
13781         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13782         value type, otherwise use Ldelem_ref.
13783
13784         Use precomputed names;
13785
13786         (AddressOf): Implement address of
13787
13788         * cs-parser.jay (labeled_statement): Fix recursive block
13789         addition by reworking the production.
13790
13791         * expression.cs (New.DoEmit): New has a special case:
13792                 
13793                  If we are dealing with a ValueType, we have a few
13794                  situations to deal with:
13795                 
13796                     * The target of New is a ValueType variable, that is
13797                       easy, we just pass this as the variable reference
13798                 
13799                     * The target of New is being passed as an argument,
13800                       to a boxing operation or a function that takes a
13801                       ValueType.
13802                 
13803                       In this case, we need to create a temporary variable
13804                       that is the argument of New.
13805
13806
13807 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13808
13809         * rootcontext.cs (LookupType): Check that current_type is not null before
13810         going about looking at nested types.
13811
13812         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13813         not implement the IAssignMethod interface any more.
13814
13815         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13816         where we tranform them into FieldExprs if they are being resolved from within
13817         the declaring type.
13818
13819         * ecore.cs (SimpleName.DoResolve): Do the same here.
13820
13821         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13822
13823         * ../errors/bug10.cs : Add.
13824
13825         * ../errors/cs0070.cs : Add.
13826
13827         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13828
13829         * assign.cs : Get rid of EventIsLocal everywhere.
13830
13831 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13832
13833         * ecore.cs (ConvertIntLiteral): finished the implementation.
13834
13835         * statement.cs (SwitchLabel): Convert the value we are using as a
13836         key before looking up the table.
13837
13838 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13839
13840         * codegen.cs (EmitTopBlock): Require a Location argument now.
13841
13842         * cs-parser.jay (constructor_declarator): We need to setup
13843         current_local_parameters before we parse the
13844         opt_constructor_initializer, to allow the variables to be bound
13845         to the constructor arguments.
13846
13847         * rootcontext.cs (LookupType): First lookup nested classes in our
13848         class and our parents before we go looking outside our class.
13849
13850         * expression.cs (ConstantFold): Extract/debox the values at the
13851         beginnning. 
13852
13853         * rootcontext.cs (EmitCode): Resolve the constants first before we
13854         resolve the types.  This is not really needed, but it helps debugging.
13855
13856         * statement.cs: report location.
13857
13858         * cs-parser.jay: pass location to throw statement.
13859
13860         * driver.cs: Small bug fix.
13861
13862         * report.cs: Updated format to be 4-zero filled digits.
13863
13864 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13865
13866         * expression.cs (CheckIndices): Fix minor bug where the wrong
13867         variable was being referred to ;-)
13868
13869         (DoEmit): Do not call EmitStaticInitializers when the 
13870         underlying type is System.Object.
13871
13872 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13873
13874         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13875         and do the usual workaround for SRE.
13876
13877         * class.cs (MyEventBuilder.EventType): New member to get at the type
13878         of the event, quickly.
13879
13880         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13881
13882         * assign.cs (Assign.DoResolve): Handle the case when the target
13883         is an EventExpr and perform the necessary checks.
13884
13885         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13886         interface.
13887
13888         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13889
13890         (EventExpr): Set the type in the constructor itself since we 
13891         are meant to be born fully resolved.
13892
13893         (EventExpr.Define): Revert code I wrote earlier.
13894                 
13895         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13896         instance expression is null. The instance expression is a This in that case
13897         or a null, depending on whether it is a static method or not.
13898
13899         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13900         refers to more than one method.
13901
13902         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13903         and accordingly flag errors.
13904
13905 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13906
13907         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13908
13909 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13910
13911         * location.cs (ToString): Provide useful rutine.
13912
13913 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13914
13915         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13916         objects, return the actual integral boxed.
13917
13918         * statement.cs (SwitchLabel): define an ILLabel for each
13919         SwitchLabel. 
13920
13921         (Switch.CheckSwitch): If the value is a Literal, extract
13922         the underlying literal.
13923
13924         Also in the unused hashtable we had, add the SwitchLabel so we can
13925         quickly look this value up.
13926
13927         * constant.cs: Implement a bunch of new constants.  Rewrite
13928         Literal based on this.  Made changes everywhere to adapt to this.
13929
13930         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13931         dereferencing array only once, and also copes with enumrations.
13932
13933         bytes are two bytes wide, not one.
13934
13935         (Cast): Perform constant conversions.
13936
13937         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13938         wrappers to the literals here.
13939
13940         * expression.cs (DoNumericPromotions): long literals can converted
13941         to ulong implicity (this is taken care of elsewhere, but I was
13942         missing this spot).
13943
13944         * ecore.cs (Expression.Literalize): Make the return type Literal,
13945         to improve type checking.
13946
13947         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13948
13949 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13950
13951         * literal.cs: Revert code from ravi that checked the bounds.  The
13952         bounds are sane by the definition of the type itself. 
13953
13954         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13955         need to actually look up in our parent hierarchy for interfaces
13956         implemented. 
13957
13958         * const.cs: Use the underlying type for enumerations
13959
13960         * delegate.cs: Compute the basename for the delegate creation,
13961         that should fix the delegate test case, and restore the correct
13962         Type Lookup semantics in rootcontext
13963
13964         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13965         referencing a nested type with the Reflection API is using the "+"
13966         sign. 
13967
13968         * cs-parser.jay: Do not require EOF token at the end.
13969
13970 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13971
13972         * rootcontext.cs (LookupType): Concatenate type names with
13973         a '.' instead of a '+' The test suite passes again.
13974
13975         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13976         field of the enumeration.
13977
13978         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13979         the case when the member is an EventExpr.
13980
13981         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13982         static has an associated instance expression.
13983
13984         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13985
13986         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13987
13988         * class.cs (Event.Define): Register event and perform appropriate checks
13989         for error #111.
13990
13991         We define the Add and Remove methods even if the use provides none because
13992         in that case, we provide default implementations ourselves.
13993
13994         Define a private field of the type of the event. This is done by the CSC compiler
13995         and we should be doing it too ;-)
13996
13997         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13998         More methods we use in code we generate.
13999
14000         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14001         is important.
14002
14003         (InitCoreTypes): Update accordingly for the above.
14004
14005         * class.cs (Event.Emit): Generate code for default accessors that we provide
14006
14007         (EmitDefaultMethod): Do the job in the above.
14008
14009         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14010         appropriate place.
14011
14012 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14013
14014         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14015         builders even if we were missing one.
14016
14017         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14018         pass the Basename as our class name instead of the Name.  The
14019         basename will be correctly composed for us.
14020
14021         * parameter.cs (Paramters): Now takes a Location argument.
14022
14023         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14024         make all the code call directly LookupType in RootContext and take
14025         this chance to pass the Location information everywhere.
14026
14027         * Everywhere: pass Location information.
14028
14029 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14030
14031         * class.cs (Constructor.Define): Updated way of detecting the
14032         length of the parameters.
14033
14034         (TypeContainer.DefineType): Use basename as the type name for
14035         nested types.
14036
14037         (TypeContainer.Define): Do not recursively define types here, as
14038         definition is taken care in order by the RootContext.
14039
14040         * tree.cs: Keep track of namespaces in a per-file basis.
14041
14042         * parameter.cs (Parameter.ComputeSignature): Update to use
14043         DeclSpace. 
14044
14045         (Parameters.GetSignature): ditto.
14046
14047         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14048         instead of a TypeContainer.
14049
14050         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14051         resolve names.  Because we need to be resolve in our context, not
14052         our parents.
14053
14054         * driver.cs: Implement response files.
14055
14056         * class.cs (TypeContainer.DefineType): If we are defined, do not
14057         redefine ourselves.
14058
14059         (Event.Emit): Emit the code for add/remove handlers.
14060         (Event.Define): Save the MethodBuilders for add/remove.
14061
14062         * typemanager.cs: Use pair here too.
14063
14064         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14065         DictionaryEntry requires the first argument to be non-null.  
14066
14067         (enum_declaration): Compute full name for registering the
14068         enumeration.
14069
14070         (delegate_declaration): Instead of using
14071         formal_parameter_list, use opt_formal_parameter_list as the list
14072         can be empty.
14073
14074         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14075         (EventParsing): New property that controls whether `add' and
14076         `remove' are returned as tokens or identifiers (for events);
14077
14078 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14079
14080         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14081         use MyEventBuilder only and let it wrap the real builder for us.
14082
14083         (MyEventBuilder): Revamp constructor etc.
14084
14085         Implement all operations that we perform on EventBuilder in precisely the same
14086         way here too.
14087
14088         (FindMembers): Update to use the EventBuilder member.
14089
14090         (Event.Emit): Update accordingly.
14091
14092 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14093
14094         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14095         by calling the appropriate methods.
14096
14097         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14098         useful.
14099
14100         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14101
14102 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14103
14104         * delegate.cs (Delegate.Populate): Check that the return type
14105         and various parameters types are indeed accessible.
14106
14107         * class.cs (Constructor.Define): Same here.
14108
14109         (Field.Define): Ditto.
14110
14111         (Event.Define): Ditto.
14112
14113         (Operator.Define): Check that the underlying Method defined itself
14114         correctly - so it's MethodBuilder should not be null.
14115
14116         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14117         expression happens to be null.
14118
14119         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14120         members but as of now we don't seem to be able to do anything really useful with it.
14121
14122         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14123         not the EventBuilder.
14124
14125 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14126
14127         * cs-tokenizer.cs: Add support for defines.
14128         Add support for #if, #elif, #else, #endif
14129
14130         (eval_var): evaluates a variable.
14131         (eval): stubbed for evaluating functions.
14132
14133         * cs-parser.jay: Pass the defines information
14134
14135         * driver.cs: Add --define command line option.
14136
14137         * decl.cs: Move MemberCore here.
14138
14139         Make it the base class for DeclSpace.  This allows us to catch and
14140         report 108 and 109 for everything now.
14141
14142         * class.cs (TypeContainer.Define): Extract all the members
14143         before populating and emit the warning 108 (new keyword required
14144         to override) instead of having each member implement this.
14145
14146         (MemberCore.Define): New abstract method, we will be using this in
14147         the warning reporting engine in Populate.
14148
14149         (Operator.Define): Adjust to new MemberCore protocol. 
14150
14151         * const.cs (Const): This does not derive from Expression, it is a
14152         temporary object we use to create fields, it is a MemberCore. 
14153
14154         * class.cs (Method.Define): Allow the entry point to be in a
14155         specific class.
14156
14157         * driver.cs: Rewrite the argument handler to clean it up a bit.
14158
14159         * rootcontext.cs: Made it just an auxiliary namespace feature by
14160         making everything static.
14161
14162         * driver.cs: Adapt code to use RootContext type name instead of
14163         instance variable.
14164
14165         * delegate.cs: Remove RootContext argument.
14166
14167         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14168         argument. 
14169
14170         * class.cs (Event.Define): The lookup can fail.
14171
14172         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14173
14174         * expression.cs: Resolve the this instance before invoking the code.
14175
14176 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14177
14178         * cs-parser.jay: Add a production in element_access that allows
14179         the thing to become a "type" reference.  This way we can parse
14180         things like "(string [])" as a type.
14181
14182         Note that this still does not handle the more complex rules of
14183         casts. 
14184
14185
14186         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14187
14188         * ecore.cs: (CopyNewMethods): new utility function used to
14189         assemble the list of methods from running FindMembers.
14190
14191         (MemberLookup): Rework FindMembers so that 
14192
14193 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14194
14195         * class.cs (TypeContainer): Remove Delegates who fail to be
14196         defined.
14197
14198         * delegate.cs (Populate): Verify that we dont get null return
14199         values.   TODO: Check for AsAccessible.
14200
14201         * cs-parser.jay: Use basename to emit error 574 (destructor should
14202         have the same name as container class), not the full name.
14203
14204         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14205         possible representation.  
14206
14207         Also implements integer type suffixes U and L.
14208
14209 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14210
14211         * expression.cs (ArrayCreation.DoResolve): We need to do the
14212         argument resolution *always*.
14213
14214         * decl.cs: Make this hold the namespace.  Hold the root context as
14215         well.
14216         (LookupType): Move here.
14217
14218         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14219
14220         * location.cs (Row, Name): Fixed the code, it was always returning
14221         references to the first file.
14222
14223         * interface.cs: Register properties defined through interfaces.
14224
14225         * driver.cs: Add support for globbing on the command line
14226
14227         * class.cs (Field): Make it derive from MemberCore as well.
14228         (Event): ditto.
14229
14230 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14231
14232         * class.cs (Event::Define): Check that the type of the event is a delegate
14233         type else flag error #66.
14234
14235         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14236         same.
14237
14238         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14239         values of EntryPoint, CharSet etc etc.
14240
14241         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14242
14243         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14244         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14245         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14246         which needs this to do its work.
14247
14248         * ../errors/cs0066.cs : Add.
14249
14250 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14251
14252         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14253         helper functions.
14254
14255         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14256         clears out the parameters field.
14257         (MemberSignatureCompare): Cleanup
14258
14259         (MemberCore): New base class used to share code between MethodCore
14260         and Property.
14261
14262         (RegisterRequiredImplementations) BindingFlags.Public requires
14263         either BindingFlags.Instace or Static.  Use instance here.
14264
14265         (Property): Refactored code to cope better with the full spec.
14266
14267         * parameter.cs (GetParameterInfo): Return an empty array instead
14268         of null on error.
14269
14270         * class.cs (Property): Abstract or extern properties have no bodies.
14271
14272         * parameter.cs (GetParameterInfo): return a zero-sized array.
14273
14274         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14275         method modifier validation to the typecontainer so we can reuse
14276         this on properties.
14277
14278         (MethodCore.ParameterTypes): return an empty sized array of types.
14279
14280         (Property.Define): Test property modifier validity.
14281
14282         Add tests for sealed/override too.
14283
14284         (Method.Emit): abstract or extern methods have no bodies.
14285
14286 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14287
14288         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14289         thing.
14290
14291         (Method::Define, ::Emit): Modify accordingly.
14292
14293         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14294
14295         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14296
14297         * makefile: Pass in /unsafe.
14298
14299 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14300
14301         * class.cs (MakeKey): Kill routine.
14302
14303         * class.cs (TypeContainer.Define): Correctly define explicit
14304         method implementations (they require the full interface name plus
14305         the method name).
14306
14307         * typemanager.cs: Deply the PtrHashtable here and stop using the
14308         lame keys.  Things work so much better.
14309
14310         This of course broke everyone who depended on `RegisterMethod' to
14311         do the `test for existance' test.  This has to be done elsewhere.
14312
14313         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14314         the object stupid Equals method (because, that like fails all over
14315         the place).  We still do not use it.
14316
14317         * class.cs (TypeContainer.SetRequiredInterface,
14318         TypeContainer.RequireMethods): Killed these two routines and moved
14319         all the functionality to RegisterRequiredImplementations.
14320
14321         (TypeContainer.RegisterRequiredImplementations): This routine now
14322         registers all the implementations required in an array for the
14323         interfaces and abstract methods.  We use an array of structures
14324         which can be computed ahead of time to reduce memory usage and we
14325         also assume that lookups are cheap as most classes will not
14326         implement too many interfaces.
14327
14328         We also avoid creating too many MethodSignatures.
14329
14330         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14331         clear the "pending" bit if we find that there are problems with
14332         the declaration.
14333
14334         (TypeContainer.VerifyPendingMethods): Update to report errors of
14335         methods that look like implementations but are not.
14336
14337         (TypeContainer.Define): Add support for explicit interface method
14338         implementation. 
14339
14340 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14341
14342         * typemanager.cs: Keep track of the parameters here instead of
14343         being a feature of the TypeContainer.
14344
14345         * class.cs: Drop the registration of parameters here, as
14346         InterfaceMethods are also interface declarations.
14347
14348         * delegate.cs: Register methods with the TypeManager not only with
14349         the TypeContainer.  This code was buggy.
14350
14351         * interface.cs: Full registation here.
14352
14353 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14354
14355         * expression.cs: Remove reducer for binary expressions, it can not
14356         be done this way.
14357
14358         * const.cs: Put here the code that used to go into constant.cs
14359
14360         * constant.cs: Put here the code for constants, this is a new base
14361         class for Literals.
14362
14363         * literal.cs: Make Literal derive from Constant.
14364
14365 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14366
14367         * statement.cs (Return.Emit): Report error 157 if the user
14368         attempts to return from a finally block.
14369
14370         (Return.Emit): Instead of emitting a return, jump to the end of
14371         the function.
14372
14373         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14374         LocalBuilder to store the result of the function.  ReturnLabel is
14375         the target where we jump.
14376
14377
14378 2001-12-09  Radek Doulik  <rodo@ximian.com>
14379
14380         * cs-parser.jay: remember alias in current namespace
14381
14382         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14383         namespaces
14384
14385         * class.cs (LookupAlias): lookup alias in my_namespace
14386
14387         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14388         aliases hashtable
14389         (LookupAlias): lookup alias in this and if needed in parent
14390         namespaces
14391
14392 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14393
14394         * support.cs: 
14395
14396         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14397         making things static.  I need this to avoid passing the
14398         TypeContainer when calling ParameterType.
14399
14400         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14401         that did string manipulation to compute the type and then call
14402         GetType.  Use Parameter.ParameterType instead.
14403
14404         * cs-tokenizer.cs: Consume the suffix for floating values.
14405
14406         * expression.cs (ParameterReference): figure out whether this is a
14407         reference parameter or not.  Kill an extra variable by computing
14408         the arg_idx during emission.
14409
14410         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14411         function that returns whether a parameter is an out/ref value or not.
14412
14413         (Parameter.ParameterType): The type of the parameter (base,
14414         without ref/out applied).
14415
14416         (Parameter.Resolve): Perform resolution here.
14417         (Parameter.ExternalType): The full type (with ref/out applied).
14418
14419         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14420         support for expressions on the using statement.
14421
14422 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14423
14424         * statement.cs (Using.EmitLocalVariableDecls): Split the
14425         localvariable handling of the using statement.
14426
14427         (Block.EmitMeta): Keep track of variable count across blocks.  We
14428         were reusing slots on separate branches of blocks.
14429
14430         (Try.Emit): Emit the general code block, we were not emitting it. 
14431
14432         Check the type of the declaration to be an IDisposable or
14433         something that can be implicity converted to it. 
14434
14435         Emit conversions if required.
14436
14437         * ecore.cs (EmptyExpression): New utility class.
14438         (Expression.ImplicitConversionExists): New utility function.
14439
14440 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14441
14442         * statement.cs (Using): Implement.
14443
14444         * expression.cs (LocalVariableReference): Support read only variables.
14445
14446         * statement.cs: Remove the explicit emit for the Leave opcode.
14447         (VariableInfo): Add a readonly field.
14448
14449 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14450
14451         * ecore.cs (ConvCast): new class used to encapsulate the various
14452         explicit integer conversions that works in both checked and
14453         unchecked contexts.
14454
14455         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14456         properly generate the overflow opcodes.
14457
14458 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14459
14460         * statement.cs: The correct type for the EmptyExpression is the
14461         element_type, not the variable type.  Ravi pointed this out.
14462
14463 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14464
14465         * class.cs (Method::Define): Handle PInvoke methods specially
14466         by using DefinePInvokeMethod instead of the usual one.
14467
14468         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14469         above to do the task of extracting information and defining the method.
14470
14471 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14472
14473         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14474         of the condition for string type.
14475
14476         (Emit): Move that here. 
14477
14478         (ArrayCreation::CheckIndices): Keep string literals in their expression
14479         form.
14480
14481         (EmitDynamicInitializers): Handle strings appropriately.
14482
14483 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14484
14485         * codegen.cs (EmitContext): Replace multiple variables with a
14486         single pointer to the current Switch statement.
14487
14488         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14489         EmitContext.
14490
14491 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14492
14493         * statement.cs 
14494
14495         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14496         default'.
14497
14498         (Foreach.Emit): Foreach on arrays was not setting
14499         up the loop variables (for break/continue).
14500
14501         (GotoCase): Semi-implented.
14502
14503 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14504
14505         * attribute.cs (CheckAttribute): Handle system attributes by using
14506         Attribute.GetAttributes to examine information we need.
14507
14508         (GetValidPlaces): Same here.
14509
14510         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14511
14512         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14513
14514         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14515
14516         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14517
14518         (Method::Emit): Handle the case when we are a PInvoke method.
14519
14520 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14521
14522         * expression.cs: Use ResolveWithSimpleName on compound names.
14523
14524 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14525
14526         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14527         before trying to reduce it.
14528
14529         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14530
14531         * constant.cs (LookupConstantValue): Implement.
14532
14533         (EmitConstant): Use the above in emitting the constant.
14534
14535         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14536         that are user-defined by doing a LookupConstantValue on them.
14537
14538         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14539         too, like above.
14540
14541 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14542
14543         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14544
14545         (BaseAccess.DoResolve): Implement.
14546
14547         (MemberAccess.DoResolve): Split this routine into a
14548         ResolveMemberAccess routine that can be used independently
14549
14550 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14551
14552         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14553         As that share bits of the implementation.  Is returns a boolean,
14554         while As returns the Type that is being probed.
14555
14556 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14557
14558         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14559         instead of a Literal - much easier.
14560
14561         (EnumInTransit): Remove - utterly useless :-)
14562
14563         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14564
14565         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14566
14567         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14568         chain when we have no associated expression.
14569
14570 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14571
14572         * constant.cs (Define): Use Location while reporting the errror.
14573
14574         Also emit a warning when 'new' is used and there is no inherited
14575         member to hide.
14576
14577         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14578         populated.
14579
14580         (LookupEnumValue): Implement to lookup an enum member's value and define it
14581         if necessary.
14582
14583         (Populate): Re-write accordingly to use the above routine.
14584
14585 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14586
14587         * expression.cs (This): Fix prototype for DoResolveLValue to
14588         override the base class DoResolveLValue.
14589
14590         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14591         declarations) 
14592
14593         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14594         (we need to load the address of the field here).  This fixes
14595         test-22. 
14596
14597         (FieldExpr.DoResolveLValue): Call the DoResolve
14598         function to initialize the Instance expression.
14599
14600         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14601         correctly the GetEnumerator operation on a value type.
14602
14603         * cs-parser.jay: Add more simple parsing error catches.
14604
14605         * statement.cs (Switch): Add support for string switches.
14606         Handle null specially.
14607
14608         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14609
14610 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14611
14612         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14613
14614         (declare_local_constant): New helper function.
14615
14616         * statement.cs (AddConstant): Keep a separate record of constants
14617
14618         (IsConstant): Implement to determine if a variable is a constant.
14619
14620         (GetConstantExpression): Implement.
14621
14622         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14623
14624         * statement.cs (IsVariableDefined): Re-write.
14625
14626 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14627
14628         * class.cs (TypeContainer::FindMembers): Look for constants
14629         in the case when we are looking for MemberTypes.Field
14630
14631         * expression.cs (MemberAccess::DoResolve): Check that in the
14632         case we are a FieldExpr and a Literal, we are not being accessed
14633         by an instance reference.
14634
14635         * cs-parser.jay (local_constant_declaration): Implement.
14636
14637         (declaration_statement): Implement for constant declarations.
14638
14639 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14640
14641         * statement.cs (Switch): Catch double defaults.
14642
14643         (Switch): More work on the switch() statement
14644         implementation.  It works for integral values now, need to finish
14645         string support.
14646
14647
14648 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14649
14650         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14651         integer literals into other integer literals.  To be used by
14652         switch. 
14653
14654 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14655
14656         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14657         some memory.
14658
14659         (EmitDynamicInitializers): Cope with the above since we extract data
14660         directly from ArrayData now.
14661
14662         (ExpectInitializers): Keep track of whether initializers are mandatory
14663         or not.
14664
14665         (Bounds): Make it a hashtable to prevent the same dimension being 
14666         recorded for every element in that dimension.
14667
14668         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14669         from being found.
14670
14671         Also fix bug which was causing the indices to be emitted in the reverse
14672         order.
14673
14674 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14675
14676         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14677         unfinished.  They do not work, because the underlying code is
14678         sloppy.
14679
14680 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14681
14682         * cs-parser.jay: Remove bogus fixme.
14683
14684         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14685         on Switch statement.
14686
14687 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14688
14689         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14690         the same. 
14691
14692         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14693         parameter. Apparently, any expression is allowed. 
14694
14695         (ValidateInitializers): Update accordingly.
14696
14697         (CheckIndices): Fix some tricky bugs thanks to recursion.
14698
14699         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14700         I was being completely brain-dead.
14701
14702         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14703         and re-write acordingly.
14704
14705         (DelegateInvocation): Re-write accordingly.
14706
14707         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14708
14709         (MakeByteBlob): Handle types more correctly.
14710
14711         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14712         initialization from expressions but it is incomplete because I am a complete
14713         Dodo :-|
14714
14715 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14716
14717         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14718         on If.  Basically, we have to return `true' (ie, we do return to
14719         our caller) only if both branches of the if return.
14720
14721         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14722         short-circuit operators, handle them as short circuit operators. 
14723
14724         (Cast.DoResolve): Resolve type.
14725         (Cast.Cast): Take an expression as the target type.
14726
14727         * cs-parser.jay (cast_expression): Remove old hack that only
14728         allowed a limited set of types to be handled.  Now we take a
14729         unary_expression and we resolve to a type during semantic
14730         analysis.
14731
14732         Use the grammar productions from Rhys to handle casts (this is
14733         not complete like Rhys syntax yet, we fail to handle that corner
14734         case that C# has regarding (-x), but we will get there.
14735
14736 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14737
14738         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14739         field which is an array type.
14740
14741         * cs-parser.jay (declare_local_variables): Support array initialization too.
14742
14743         * typemanager.cs (MakeKey): Implement.
14744
14745         (everywhere): Use the above appropriately.
14746
14747         * cs-parser.jay (for_statement): Update for array initialization while
14748         declaring variables.
14749
14750         * ecore.cs : The error message was correct, it's the variable's names that
14751         were misleading ;-) Make the code more readable.
14752
14753         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14754         the correct type etc.
14755
14756         (ConvertExplicit): Handle Enum types by examining the underlying type.
14757
14758 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14759
14760         * parameter.cs (GetCallingConvention): Always return
14761         CallingConventions.Standard for now.
14762
14763 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14764
14765         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14766         and `r' after calling DoNumericPromotions.
14767
14768         * ecore.cs: Fix error message (the types were in the wrong order).
14769
14770         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14771         BindingFlags.Instance as well 
14772
14773         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14774         implicit int literal conversion in an empty cast so that we
14775         propagate the right type upstream.
14776
14777         (UnboxCast): new class used to unbox value types.
14778         (Expression.ConvertExplicit): Add explicit type conversions done
14779         by unboxing.
14780
14781         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14782         the target type before applying the implicit LongLiterals to ULong
14783         literal cast.
14784
14785 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14786
14787         * cs-parser.jay (for_statement): Reworked the way For works: now
14788         we declare manually any variables that are introduced in
14789         for_initializer to solve the problem of having out-of-band code
14790         emition (that is what got for broken).
14791
14792         (declaration_statement): Perform the actual variable declaration
14793         that used to be done in local_variable_declaration here.
14794
14795         (local_variable_declaration): Do not declare anything, just pass
14796         the information on a DictionaryEntry
14797
14798 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14799
14800         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14801         re-write of the logic to now make it recursive.
14802
14803         (UpdateIndices): Re-write accordingly.
14804
14805         Store element data in a separate ArrayData list in the above methods.
14806
14807         (MakeByteBlob): Implement to dump the array data into a byte array.
14808
14809 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14810
14811         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14812         into CheckIndices.
14813
14814         * constant.cs (Define): Implement.
14815
14816         (EmitConstant): Re-write fully.
14817
14818         Pass in location info.
14819
14820         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14821         respectively.
14822
14823         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14824         DictionaryEntry since we need location info too.
14825
14826         (constant_declaration): Update accordingly.
14827
14828         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14829         code into another method : UpdateIndices.
14830
14831 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14832
14833         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14834         some type checking etc.
14835
14836 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14837
14838         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14839         bits to provide dimension info if the user skips doing that.
14840
14841         Update second constructor to store the rank correctly.
14842
14843 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14844
14845         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14846         and try to implement.
14847
14848         * ../errors/cs0150.cs : Add.
14849
14850         * ../errors/cs0178.cs : Add.
14851
14852 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14853
14854         * statement.cs: Implement foreach on multi-dimensional arrays. 
14855
14856         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14857         name of the params argument.
14858
14859         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14860         initializing the array.
14861
14862         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14863         we can use this elsewhere.
14864
14865         * statement.cs: Finish implementation of foreach for single
14866         dimension arrays.
14867
14868         * cs-parser.jay: Use an out-of-band stack to pass information
14869         around, I wonder why I need this.
14870
14871         foreach_block: Make the new foreach_block the current_block.
14872
14873         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14874         function used to return a static Parameters structure.  Used for
14875         empty parameters, as those are created very frequently.
14876
14877         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14878
14879 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14880
14881         * interface.cs : Default modifier is private, not public. The
14882         make verify test passes again.
14883
14884 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14885
14886         * support.cs (ReflectionParameters): Fix logic to determine
14887         whether the last parameter is a params one. Test 9 passes again.
14888
14889         * delegate.cs (Populate): Register the builders we define with
14890         RegisterParameterForBuilder. Test 19 passes again.
14891
14892         * cs-parser.jay (property_declaration): Reference $6 instead
14893         of $$ to get at the location.
14894
14895         (indexer_declaration): Similar stuff.
14896
14897         (attribute): Ditto.
14898
14899         * class.cs (Property): Register parameters for the Get and Set methods
14900         if they exist. Test 23 passes again.
14901
14902         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14903         call to EmitArguments as we are sure there aren't any params arguments. 
14904         Test 32 passes again.
14905
14906         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14907         IndexOutOfRangeException. 
14908
14909         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14910         Test 33 now passes again.
14911
14912 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14913
14914         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14915         broke a bunch of things.  Will have to come up with a better way
14916         of tracking locations.
14917
14918         * statement.cs: Implemented foreach for single dimension arrays.
14919
14920 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14921
14922         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14923         an error.  This removes the lookup from the critical path.
14924
14925         * cs-parser.jay: Removed use of temporary_loc, which is completely
14926         broken. 
14927
14928 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14929
14930         * support.cs (ReflectionParameters.ParameterModifier): Report
14931         whether the argument is a PARAMS argument or not.
14932
14933         * class.cs: Set the attribute `ParamArrayAttribute' on the
14934         parameter argument.
14935
14936         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14937         and cons_param_array_attribute (ConstructorInfo for
14938         ParamArrayAttribute)., 
14939
14940         * codegen.cs: Emit the return using the `Return' statement, that
14941         way we can report the error correctly for missing return values. 
14942
14943         * class.cs (Method.Emit): Clean up.
14944
14945         * expression.cs (Argument.Resolve): Take another argument: the
14946         location where this argument is used.  Notice that this is not
14947         part of the "Argument" class as to reduce the size of the
14948         structure (we know the approximate location anyways).
14949
14950         Test if the argument is a variable-reference, if not, then
14951         complain with a 206.
14952
14953         (Argument.Emit): Emit addresses of variables.
14954
14955         (Argument.FullDesc): Simplify.
14956
14957         (Invocation.DoResolve): Update for Argument.Resolve.
14958
14959         (ElementAccess.DoResolve): ditto.
14960
14961         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14962         method should be virtual, as this method is always virtual.
14963
14964         (NewDelegate.DoResolve): Update for Argument.Resolve.
14965
14966         * class.cs (ConstructorInitializer.DoResolve): ditto.
14967
14968         * attribute.cs (Attribute.Resolve): ditto.
14969
14970 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14971
14972         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14973
14974         * expression.cs (ParameterReference): Drop IStackStorage and implement
14975         IAssignMethod instead. 
14976
14977         (LocalVariableReference): ditto.
14978
14979         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14980         IAssignMethod instead. 
14981
14982 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14983
14984         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14985         enumerations that are used in heavily used structures derive from
14986         byte in a laughable and pathetic attempt to reduce memory usage.
14987         This is the kind of pre-optimzations that you should not do at
14988         home without adult supervision.
14989
14990         * expression.cs (UnaryMutator): New class, used to handle ++ and
14991         -- separatedly from the other unary operators.  Cleans up the
14992         code, and kills the ExpressionStatement dependency in Unary.
14993
14994         (Unary): Removed `method' and `Arguments' from this class, making
14995         it smaller, and moving it all to SimpleCall, so I can reuse this
14996         code in other locations and avoid creating a lot of transient data
14997         strucutres when not required.
14998
14999         * cs-parser.jay: Adjust for new changes.
15000
15001 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15002
15003         * enum.cs (Enum.Populate): If there is a failure during
15004         definition, return
15005
15006         * cs-parser.jay (opt_enum_base): we used to catch type errors
15007         here, but this is really incorrect.  The type error should be
15008         catched during semantic analysis.
15009
15010 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15011
15012         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15013         current_local_parameters as expected since I, in my stupidity, had forgotten
15014         to do this :-)
15015
15016         * attribute.cs (GetValidPlaces): Fix stupid bug.
15017
15018         * class.cs (Method::Emit): Perform check on applicability of attributes.
15019
15020         (Constructor::Emit): Ditto.
15021
15022         (Field::Emit): Ditto.
15023
15024         (Field.Location): Store location information.
15025
15026         (Property, Event, Indexer, Operator): Ditto.
15027
15028         * cs-parser.jay (field_declaration): Pass in location for each field.
15029
15030         * ../errors/cs0592.cs : Add.
15031
15032 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15033
15034         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15035
15036         (InitCoreTypes): Update accordingly.
15037
15038         (RegisterAttrType, LookupAttr): Implement.
15039
15040         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15041         info about the same.
15042
15043         (Resolve): Update to populate the above as necessary.
15044
15045         (Error592): Helper.
15046
15047         (GetValidPlaces): Helper to the above.
15048
15049         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15050
15051         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15052
15053 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15054
15055         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15056
15057         * ../errors/cs0617.cs : Add.
15058
15059 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15060
15061         * enum.cs (Emit): Rename to Populate to be more consistent with what
15062         we expect it to do and when exactly it is called.
15063
15064         * class.cs, rootcontext.cs : Update accordingly.
15065
15066         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15067         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15068
15069         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15070
15071         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15072         of a fieldinfo using the above, when dealing with a FieldBuilder.
15073
15074 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15075
15076         * ../errors/cs0031.cs : Add.
15077
15078         * ../errors/cs1008.cs : Add.
15079
15080         * ../errrors/cs0543.cs : Add.
15081
15082         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15083         enum type.
15084
15085         (FindMembers): Implement.
15086
15087         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15088         enums and delegates too.
15089
15090         (enum_types): Rename to builder_to_enum.
15091
15092         (delegate_types): Rename to builder_to_delegate.
15093
15094         * delegate.cs (FindMembers): Implement.
15095
15096 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15097
15098         * typemanager.cs (IsEnumType): Implement.
15099
15100         * enum.cs (Emit): Re-write parts to account for the underlying type
15101         better and perform checking etc.
15102
15103         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15104         of the underlying type.
15105
15106         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15107         value
15108
15109         * enum.cs (error31): Helper to report error #31.
15110
15111         * cs-parser.jay (enum_declaration): Store location of each member too.
15112
15113         * enum.cs (member_to_location): New hashtable. 
15114
15115         (AddEnumMember): Update location hashtable.
15116
15117         (Emit): Use the location of each member while reporting errors.
15118
15119 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15120
15121         * cs-parser.jay: A for_initializer if is a
15122         local_variable_declaration really ammount to have an implicit
15123         block with the variable declaration and no initializer for for.
15124
15125         * statement.cs (For.Emit): Cope with null initializers.
15126
15127         This fixes the infinite loop on for initializers.
15128
15129 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15130
15131         * enum.cs: More cleanup.
15132
15133         * ecore.cs: Remove dead code.
15134
15135         * class.cs (Property.Emit): More simplification.
15136         (Event.Emit): ditto.
15137
15138         Reworked to have less levels of indentation.
15139
15140 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15141
15142         * class.cs (Property): Emit attributes.
15143
15144         (Field): Ditto.
15145
15146         (Event): Ditto.
15147
15148         (Indexer): Ditto.
15149
15150         (Operator): Ditto.
15151
15152         * enum.cs (Emit): Ditto.
15153
15154         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15155         Enums too.
15156
15157         * class.cs (Field, Event, etc.): Move attribute generation into the
15158         Emit method everywhere.
15159
15160         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15161         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15162         as we had no way of defining nested enums !
15163
15164         * rootcontext.cs : Adjust code accordingly.
15165
15166         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15167
15168 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15169
15170         * expression.cs (EvalConstantExpression): Move into ecore.cs
15171
15172         * enum.cs (Enum): Rename some members and make them public and readonly
15173         according to our convention.
15174
15175         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15176         nothing else.
15177
15178         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15179
15180         (Enum::Emit): Write a simple version for now which doesn't try to compute
15181         expressions. I shall modify this to be more robust in just a while.
15182
15183         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15184
15185         (TypeContainer::CloseType): Create the Enum types too.
15186
15187         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15188
15189         * expression.cs (EvalConstantExpression): Get rid of completely.
15190
15191         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15192         user-defined values and other cases.
15193
15194         (IsValidEnumLiteral): Helper function.
15195
15196         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15197         out there in the case we had a literal FieldExpr.
15198
15199         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15200
15201         (Literalize): Revamp a bit to take two arguments.
15202
15203         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15204
15205 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15206
15207         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15208
15209         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15210
15211         (Resolve): Use the above to ensure we have proper initializers.
15212
15213 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15214
15215         * expression.cs (Expression::EvalConstantExpression): New method to 
15216         evaluate constant expressions.
15217
15218         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15219
15220 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15221
15222         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15223         in an array.
15224
15225         (Binary.ResolveOperator): Handle operator != (object a, object b)
15226         and operator == (object a, object b);
15227
15228         (Binary.DoNumericPromotions): Indicate whether the numeric
15229         promotion was possible.
15230
15231         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15232         Implement.  
15233
15234         Made the ArrayAccess implement interface IAssignMethod instead of
15235         IStackStore as the order in which arguments are passed reflects
15236         this.
15237
15238         * assign.cs: Instead of using expr.ExprClass to select the way of
15239         assinging, probe for the IStackStore/IAssignMethod interfaces.
15240
15241         * typemanager.cs: Load InitializeArray definition.
15242
15243         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15244         static data that can be used to initialize arrays. 
15245
15246 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15247
15248         * expression.cs: Handle operator== and operator!= for booleans.
15249
15250         (Conditioal.Reduce): Implement reducer for the ?: operator.
15251
15252         (Conditional.Resolve): Implement dead code elimination.
15253
15254         (Binary.Resolve): Catch string literals and return a new
15255         concatenated string.
15256
15257         (Unary.Reduce): Implement reduction of unary expressions.
15258
15259         * ecore.cs: Split out the expression core handling here.
15260
15261         (Expression.Reduce): New method used to perform constant folding
15262         and CSE.  This is needed to support constant-expressions. 
15263
15264         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15265         targets, and optimize for !x.
15266
15267 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15268
15269         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15270         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15271         set custom atttributes.
15272
15273         * literal.cs (Literal::GetValue): New abstract method to return the actual
15274         value of the literal, cast as an object.
15275
15276         (*Literal): Implement GetValue method.
15277
15278         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15279         expressions to the arraylist but objects of type Argument.
15280
15281         * class.cs (TypeContainer::Emit): Emit our attributes too.
15282
15283         (Method::Emit, Constructor::Emit): Ditto.
15284
15285         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15286         to be ignoring earlier.
15287
15288 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15289
15290         * attribute.cs (AttributeSection::Define): Implement to do the business
15291         of constructing a CustomAttributeBuilder.
15292
15293         (Attribute): New trivial class. Increases readability of code.  
15294
15295         * cs-parser.jay : Update accordingly.
15296
15297         (positional_argument_list, named_argument_list, named_argument): New rules
15298
15299         (attribute_arguments): Use the above so that we are more correct.
15300
15301 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15302
15303         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15304         to perform all checks for a method with a params parameter.
15305
15306         (Invocation::OverloadResolve): Update to use the above method and therefore
15307         cope correctly with params method invocations.
15308
15309         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15310         params too.
15311
15312         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15313         constructors in our parent too because we can't afford to miss out on 
15314         protected ones ;-)
15315
15316         * attribute.cs (AttributeSection): New name for the class Attribute
15317
15318         Other trivial changes to improve readability.
15319
15320         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15321         use the new class names.
15322
15323 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15324
15325         * class.cs (Method::Define): Complete definition for params types too
15326
15327         (Indexer::Define): Ditto.
15328
15329         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15330         Cope everywhere with a request for info about the array parameter.
15331
15332 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15333
15334         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15335
15336         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15337         local_variable_type to extract the string corresponding to the type.
15338
15339         (local_variable_type): Fixup the action to use the new helper method.
15340
15341         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15342         go.
15343
15344         * expression.cs : Clean out code which uses the above.
15345
15346 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15347
15348         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15349         and bale out if necessary by returning a false.
15350
15351         (RegisterProperty): Ditto.
15352
15353         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15354         and print out appropriate error messages.
15355
15356         * interface.cs (everywhere): Ditto.
15357
15358         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15359         location to constructor.
15360
15361         * class.cs (Property, Event, Indexer): Update accordingly.
15362
15363         * ../errors/cs111.cs : Added.
15364
15365         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15366         of a method, as laid down by the spec.
15367
15368         (Invocation::OverloadResolve): Use the above method.
15369
15370 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15371
15372         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15373         now take a TypeContainer and a Parameters object.
15374
15375         (ParameterData): Modify return type of ParameterModifier method to be 
15376         Parameter.Modifier and not a string.
15377
15378         (ReflectionParameters, InternalParameters): Update accordingly.
15379
15380         * expression.cs (Argument::GetParameterModifier): Same here.
15381
15382         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15383         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15384         symbol in it at all so maybe this is only for now.
15385
15386 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15387
15388         * support.cs (InternalParameters): Constructor now takes an extra argument 
15389         which is the actual Parameters class.
15390
15391         (ParameterDesc): Update to provide info on ref/out modifiers.
15392
15393         * class.cs (everywhere): Update call to InternalParameters to pass in
15394         the second argument too.
15395
15396         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15397         to return the modifier info [ref/out etc]
15398
15399         (InternalParameters, ReflectionParameters): Implement the above.
15400
15401         * expression.cs (Argument::ParameterModifier): Similar function to return
15402         info about the argument's modifiers.
15403
15404         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15405         too.
15406
15407         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15408         a new SetFormalParameters object which we pass to InternalParameters.
15409
15410 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15411
15412         * expression.cs (NewArray): Merge into the ArrayCreation class.
15413
15414 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15415
15416         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15417         NewUserdefinedArray into one as there wasn't much of a use in having
15418         two separate ones.
15419
15420         * expression.cs (Argument): Change field's name to ArgType from Type.
15421
15422         (Type): New readonly property which returns the proper type, taking into 
15423         account ref/out modifiers.
15424
15425         (everywhere): Adjust code accordingly for the above.
15426
15427         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15428         whether we are emitting for a ref or out parameter.
15429
15430         * expression.cs (Argument::Emit): Use the above field to set the state.
15431
15432         (LocalVariableReference::Emit): Update to honour the flag and emit the
15433         right stuff.
15434
15435         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15436
15437         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15438
15439         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15440
15441         (ReflectionParameters, InternalParameters): Implement the above method.
15442
15443         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15444         reporting errors.
15445
15446         (Invocation::FullMethodDesc): Ditto. 
15447
15448 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15449
15450         * cs-parser.jay: Add extra production for the second form of array
15451         creation. 
15452
15453         * expression.cs (ArrayCreation): Update to reflect the above
15454         change. 
15455
15456         * Small changes to prepare for Array initialization.
15457
15458 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15459
15460         * typemanager.cs (ImplementsInterface): interface might be null;
15461         Deal with this problem;
15462
15463         Also, we do store negative hits on the cache (null values), so use
15464         this instead of calling t.GetInterfaces on the type everytime.
15465
15466 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15467
15468         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15469
15470         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15471         split functionality out into different classes.
15472
15473         (New::FormArrayType): Move into NewBuiltinArray.
15474
15475         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15476         quite useless.
15477
15478         (NewBuiltinArray): New class to handle creation of built-in arrays.
15479
15480         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15481         account creation of one-dimensional arrays.
15482
15483         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15484
15485         (NewUserdefinedArray::DoResolve): Implement.
15486
15487         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15488
15489         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15490         we maintain inside the TypeManager. This is necessary to perform lookups on the
15491         module builder.
15492
15493         (LookupType): Update to perform GetType on the module builders too.     
15494
15495         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15496
15497         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15498
15499 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15500
15501         * expression.cs (New::DoResolve): Implement guts of array creation.
15502
15503         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15504
15505 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15506
15507         * expression.cs: Fix bug I introduced lsat night that broke
15508         Delegates. 
15509
15510         (Expression.Resolve): Report a 246 error (can not resolve name)
15511         if we find a SimpleName in the stream.
15512
15513         (Expression.ResolveLValue): Ditto.
15514
15515         (Expression.ResolveWithSimpleName): This function is a variant of
15516         ResolveName, this one allows SimpleNames to be returned without a
15517         warning.  The only consumer of SimpleNames is MemberAccess
15518
15519 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15520
15521         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15522         might arrive here.  I have my doubts that this is correct.
15523
15524         * statement.cs (Lock): Implement lock statement.
15525
15526         * cs-parser.jay: Small fixes to support `lock' and `using'
15527
15528         * cs-tokenizer.cs: Remove extra space
15529
15530         * driver.cs: New flag --checked, allows to turn on integer math
15531         checking. 
15532
15533         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15534         Threading.Monitor.Exit 
15535
15536 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15537
15538         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15539         Expression Class to be IndexerAccess.
15540
15541         Notice that Indexer::DoResolve sets the eclass to Value.
15542
15543 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15544
15545         * class.cs (TypeContainer::Emit): Emit code for indexers.
15546
15547         * assign.cs (IAssignMethod): New interface implemented by Indexers
15548         and Properties for handling assignment.
15549
15550         (Assign::Emit): Simplify and reuse code. 
15551
15552         * expression.cs (IndexerAccess, PropertyExpr): Implement
15553         IAssignMethod, clean up old code. 
15554
15555 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15556
15557         * typemanager.cs (ImplementsInterface): New method to determine if a type
15558         implements a given interface. Provides a nice cache too.
15559
15560         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15561         method.
15562
15563         (ConvertReferenceExplicit): Ditto.
15564
15565         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15566         various methods, with correct names etc.
15567
15568         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15569         Operator.UnaryNegation.
15570
15571         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15572         we have a unary plus or minus operator.
15573
15574         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15575         UnaryMinus.
15576
15577         * everywhere : update accordingly.
15578
15579         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15580         respectively.
15581
15582         * class.cs (Method::Define): For the case where we are implementing a method
15583         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15584         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15585
15586 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15587
15588         * interface.cs (FindMembers): Implement to work around S.R.E
15589         lameness.
15590
15591         * typemanager.cs (IsInterfaceType): Implement.
15592
15593         (FindMembers): Update to handle interface types too.
15594
15595         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15596         use IsAssignableFrom as that is not correct - it doesn't work.
15597
15598         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15599         and accordingly override EmitStatement.
15600
15601         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15602         using the correct logic :-)
15603
15604 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15605
15606         * ../errors/cs-11.cs : Add to demonstrate error -11 
15607
15608 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15609
15610         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15611         then pass this as a hint to ResolveLValue.
15612
15613         * expression.cs (FieldExpr): Add Location information
15614
15615         (FieldExpr::LValueResolve): Report assignment to readonly
15616         variable. 
15617
15618         (Expression::ExprClassFromMemberInfo): Pass location information.
15619
15620         (Expression::ResolveLValue): Add new method that resolves an
15621         LValue. 
15622
15623         (Expression::DoResolveLValue): Default invocation calls
15624         DoResolve. 
15625
15626         (Indexers): New class used to keep track of indexers in a given
15627         Type. 
15628
15629         (IStackStore): Renamed from LValue, as it did not really describe
15630         what this did.  Also ResolveLValue is gone from this interface and
15631         now is part of Expression.
15632
15633         (ElementAccess): Depending on the element access type
15634
15635         * typemanager.cs: Add `indexer_name_type' as a Core type
15636         (System.Runtime.CompilerServices.IndexerNameAttribute)
15637
15638         * statement.cs (Goto): Take a location.
15639
15640 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15641
15642         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15643         if two delegates are compatible.
15644
15645         (NewDelegate::DoResolve): Update to take care of the case when
15646         we instantiate a delegate from another delegate.
15647
15648         * typemanager.cs (FindMembers): Don't even try to look up members
15649         of Delegate types for now.
15650
15651 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15652
15653         * delegate.cs (NewDelegate): New class to take care of delegate
15654         instantiation.
15655
15656         * expression.cs (New): Split the delegate related code out into 
15657         the NewDelegate class.
15658
15659         * delegate.cs (DelegateInvocation): New class to handle delegate 
15660         invocation.
15661
15662         * expression.cs (Invocation): Split out delegate related code into
15663         the DelegateInvocation class.
15664
15665 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15666
15667         * expression.cs (New::DoResolve): Implement delegate creation fully
15668         and according to the spec.
15669
15670         (New::DoEmit): Update to handle delegates differently.
15671
15672         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15673         because of which we were printing out arguments in reverse order !
15674
15675         * delegate.cs (VerifyMethod): Implement to check if the given method
15676         matches the delegate.
15677
15678         (FullDelegateDesc): Implement.
15679
15680         (VerifyApplicability): Implement.
15681
15682         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15683         delegate invocations too.
15684
15685         (Invocation::Emit): Ditto.
15686
15687         * ../errors/cs1593.cs : Added.
15688
15689         * ../errors/cs1594.cs : Added.
15690
15691         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15692
15693 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15694
15695         * typemanager.cs (intptr_type): Core type for System.IntPtr
15696
15697         (InitCoreTypes): Update for the same.
15698
15699         (iasyncresult_type, asynccallback_type): Ditto.
15700
15701         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15702         correct.
15703
15704         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15705         too.
15706
15707         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15708         the builders for the 4 members of a delegate type :-)
15709
15710         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15711         type.
15712
15713         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15714
15715         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15716
15717 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15718
15719         * statement.cs (Break::Emit): Implement.   
15720         (Continue::Emit): Implement.
15721
15722         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15723         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15724         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15725         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15726         end loop
15727
15728         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15729         properties that track the label for the current loop (begin of the
15730         loop and end of the loop).
15731
15732 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15733
15734         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15735         use of emitting anything at all.
15736
15737         * class.cs, rootcontext.cs : Get rid of calls to the same.
15738
15739         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15740
15741         (Populate): Define the constructor correctly and set the implementation
15742         attributes.
15743
15744         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15745         have been defined.
15746
15747         (AddDelegateType): Implement.
15748
15749         (IsDelegateType): Implement helper method.
15750
15751         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15752
15753         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15754         and accordingly handle it.
15755
15756         * delegate.cs (Populate): Take TypeContainer argument.
15757         Implement bits to define the Invoke method. However, I still haven't figured out
15758         how to take care of the native int bit :-(
15759
15760         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15761         Qualify the name of the delegate, not its return type !
15762
15763         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15764         conversion.
15765
15766         (StandardConversionExists): Checking for array types turns out to be recursive.
15767
15768         (ConvertReferenceExplicit): Implement array conversion.
15769
15770         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15771
15772 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15773
15774         * cs-parser.jay (delegate_declaration): Store the fully qualified
15775         name as it is a type declaration.
15776
15777         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15778         readonly.
15779
15780         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15781         as TypeContainer::DefineType.
15782
15783         (Populate): Method in which all the definition of the various methods (Invoke)
15784         etc is done.
15785
15786         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15787         see.
15788
15789         (CloseDelegate): Finally creates the delegate.
15790
15791         * class.cs (TypeContainer::DefineType): Update to define delegates.
15792         (Populate, Emit and CloseType): Do the same thing here too.
15793
15794         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15795         delegates in all these operations.
15796
15797 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15798
15799         * expression.cs: LocalTemporary: a new expression used to
15800         reference a temporary that has been created.
15801
15802         * assign.cs: Handle PropertyAccess back here, so that we can
15803         provide the proper semantic access to properties.
15804
15805         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15806         a few more explicit conversions. 
15807
15808         * modifiers.cs: `NEW' modifier maps to HideBySig.
15809
15810         * expression.cs (PropertyExpr): Make this into an
15811         ExpressionStatement, and support the EmitStatement code path. 
15812
15813         Perform get/set error checking, clean up the interface.
15814
15815         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15816         them into toplevel access objects.
15817
15818 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15819
15820         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15821         SRE.
15822
15823         * typemanager.cs: Keep track here of our PropertyBuilders again to
15824         work around lameness in SRE.
15825
15826 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15827
15828         * expression.cs (LValue::LValueResolve): New method in the
15829         interface, used to perform a second resolution pass for LValues. 
15830
15831         (This::DoResolve): Catch the use of this in static methods.
15832
15833         (This::LValueResolve): Implement.
15834
15835         (This::Store): Remove warning, assigning to `this' in structures
15836         is 
15837
15838         (Invocation::Emit): Deal with invocation of
15839         methods on value types.  We need to pass the address to structure
15840         methods rather than the object itself.  (The equivalent code to
15841         emit "this" for structures leaves the entire structure on the
15842         stack instead of a pointer to it). 
15843
15844         (ParameterReference::DoResolve): Compute the real index for the
15845         argument based on whether the method takes or not a `this' pointer
15846         (ie, the method is static).
15847
15848         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15849         value types returned from functions when we need to invoke a
15850         method on the sturcture.
15851
15852
15853 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15854
15855         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15856         defining the type in the Modulebuilder or Typebuilder. This is to take
15857         care of nested types which need to be defined on the TypeBuilder using
15858         DefineNestedMethod.
15859
15860         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15861         methods in RootContext, only ported to be part of TypeContainer.
15862
15863         (TypeContainer::GetInterfaceOrClass): Ditto.
15864
15865         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15866
15867         * interface.cs (Interface::DefineInterface): New method. Does exactly
15868         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15869         too.
15870
15871         (Interface::GetInterfaces): Move from RootContext here and port.
15872
15873         (Interface::GetInterfaceByName): Same here.
15874
15875         * rootcontext.cs (ResolveTree): Re-write.
15876
15877         (PopulateTypes): Re-write.
15878
15879         * class.cs (TypeContainer::Populate): Populate nested types too.
15880         (TypeContainer::Emit): Emit nested members too.
15881
15882         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15883         instead just use the name argument passed in as it is already fully
15884         qualified.
15885
15886         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15887         to TypeContainer mapping to see if a type is user-defined.
15888
15889         * class.cs (TypeContainer::CloseType): Implement. 
15890
15891         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15892         the default constructor.
15893
15894         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15895         twice.
15896
15897         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15898
15899         * interface.cs (CloseType): Create the type here.
15900
15901         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15902         the hierarchy.
15903
15904         Remove all the methods which are now in TypeContainer.
15905
15906 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15907
15908         * delegate.cs (Define): Re-write bits to define the delegate
15909         correctly.
15910
15911 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15912
15913         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15914
15915         * expression.cs (ImplicitReferenceConversion): handle null as well
15916         as a source to convert to any reference type.
15917
15918         * statement.cs (Return): Perform any implicit conversions to
15919         expected return type.  
15920
15921         Validate use of return statement.  
15922
15923         * codegen.cs (EmitContext): Pass the expected return type here.
15924
15925         * class.cs (Method, Constructor, Property): Pass expected return
15926         type to EmitContext.
15927
15928 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15929
15930         * expression.cs: Make DoResolve take an EmitContext instead of a
15931         TypeContainer.
15932
15933         Replaced `l' and `location' for `loc', for consistency.
15934
15935         (Error, Warning): Remove unneeded Tc argument.
15936
15937         * assign.cs, literal.cs, constant.cs: Update to new calling
15938         convention. 
15939
15940         * codegen.cs: EmitContext now contains a flag indicating whether
15941         code is being generated in a static method or not.
15942
15943         * cs-parser.jay: DecomposeQI, new function that replaces the old
15944         QualifiedIdentifier.  Now we always decompose the assembled
15945         strings from qualified_identifier productions into a group of
15946         memberaccesses.
15947
15948 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15949
15950         * rootcontext.cs: Deal with field-less struct types correctly now
15951         by passing the size option to Define Type.
15952
15953         * class.cs: Removed hack that created one static field. 
15954
15955 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15956
15957         * statement.cs: Moved most of the code generation here. 
15958
15959 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15960
15961         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15962         seem very right.
15963
15964         (ElementAccess): Remove useless bits for now - keep checks as the spec
15965         says.
15966
15967 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15968
15969         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15970         and start performing checks according to the spec.
15971
15972 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15973
15974         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15975         rank_specifiers instead.
15976
15977         (rank_specifiers): Change the order in which the rank specifiers are stored
15978
15979         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15980
15981         * expression.cs (ElementAccess): Implement the LValue interface too.
15982
15983 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15984
15985         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15986         except that user defined conversions are not included.
15987
15988         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15989         perform the conversion of the return type, if necessary.
15990
15991         (New::DoResolve): Check whether we are creating an array or an object
15992         and accordingly do the needful.
15993
15994         (New::Emit): Same here.
15995
15996         (New::DoResolve): Implement guts of array creation.
15997
15998         (New::FormLookupType): Helper function.
15999
16000 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16001
16002         * codegen.cs: Removed most of the code generation here, and move the
16003         corresponding code generation bits to the statement classes. 
16004
16005         Added support for try/catch/finalize and throw.
16006
16007         * cs-parser.jay: Added support for try/catch/finalize.
16008
16009         * class.cs: Catch static methods having the flags override,
16010         virtual or abstract.
16011
16012         * expression.cs (UserCast): This user cast was not really doing
16013         what it was supposed to do.  Which is to be born in fully resolved
16014         state.  Parts of the resolution were being performed at Emit time! 
16015
16016         Fixed this code.
16017
16018 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16019
16020         * expression.cs: Implicity convert the result from UserCast.
16021
16022 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16023
16024         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16025         prevented it from working correctly. 
16026
16027         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16028         merely ConvertImplicit.
16029
16030 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16031
16032         * typemanager.cs: Make the LookupTypeContainer function static,
16033         and not per-instance.  
16034
16035         * class.cs: Make static FindMembers (the one that takes a Type
16036         argument). 
16037
16038         * codegen.cs: Add EmitForeach here.
16039
16040         * cs-parser.jay: Make foreach a toplevel object instead of the
16041         inline expansion, as we need to perform semantic analysis on it. 
16042
16043 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16044
16045         * expression.cs (Expression::ImplicitUserConversion): Rename to
16046         UserDefinedConversion.
16047
16048         (Expression::UserDefinedConversion): Take an extra argument specifying 
16049         whether we look for explicit user conversions too.
16050
16051         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16052
16053         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16054
16055         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16056         with the appropriate arguments.
16057
16058         * cs-parser.jay (cast_expression): Record location too.
16059
16060         * expression.cs (Cast): Record location info.
16061
16062         (Expression::ConvertExplicit): Take location argument.
16063
16064         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16065         to determine if we are doing explicit conversions.
16066
16067         (UserCast::Emit): Update accordingly.
16068
16069         (Expression::ConvertExplicit): Report an error if everything fails.
16070
16071         * ../errors/cs0030.cs : Add.
16072
16073 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16074
16075         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16076         virtual and newslot bits. 
16077
16078         * class.cs (TypeContainer::RegisterRequiredImplementations):
16079         Record methods we need.
16080
16081         (TypeContainer::MakeKey): Helper function to make keys for
16082         MethodBases, since the Methodbase key is useless.
16083
16084         (TypeContainer::Populate): Call RegisterRequiredImplementations
16085         before defining the methods.   
16086
16087         Create a mapping for method_builders_to_methods ahead of time
16088         instead of inside a tight loop.
16089
16090         (::RequireMethods):  Accept an object as the data to set into the
16091         hashtable so we can report interface vs abstract method mismatch.
16092
16093 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16094
16095         * report.cs: Make all of it static.
16096
16097         * rootcontext.cs: Drop object_type and value_type computations, as
16098         we have those in the TypeManager anyways.
16099
16100         Drop report instance variable too, now it is a global.
16101
16102         * driver.cs: Use try/catch on command line handling.
16103
16104         Add --probe option to debug the error reporting system with a test
16105         suite. 
16106
16107         * report.cs: Add support for exiting program when a probe
16108         condition is reached.
16109
16110 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16111
16112         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16113         we do a forcible conversion regardless of type, to check if 
16114         ForceConversion returns a null.
16115
16116         (Binary::error19): Use location to report error.
16117
16118         (Unary::error23): Use location here too.
16119
16120         * ../errors/cs0019.cs : Check in.
16121
16122         * ../errors/cs0023.cs : Check in.
16123
16124         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16125         case of a non-null MethodInfo object with a length of 0 !
16126
16127         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16128         an applicable member - according to the spec :-)
16129         Also fix logic to find members in base types.
16130
16131         (Unary::ResolveOperator): Same here.
16132
16133         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16134         as I was getting thoroughly confused between this and error19 :-)
16135
16136         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16137         (::FindMostEncompassedType): Implement.
16138         (::FindMostEncompassingType): Implement.
16139         (::StandardConversionExists): Implement.
16140
16141         (UserImplicitCast): Re-vamp. We now need info about most specific
16142         source and target types so that we can do the necessary conversions.
16143
16144         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16145         mathematical union with no duplicates.
16146
16147 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16148
16149         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16150         in order from base classes to child classes, so that we can in
16151         child classes look up in our parent for method names and
16152         attributes (required for handling abstract, virtual, new, override
16153         constructs: we need to instrospect our base class, and if we dont
16154         populate the classes in order, the introspection might be
16155         incorrect.  For example, a method could query its parent before
16156         the parent has any methods and would determine that the parent has
16157         no abstract methods (while it could have had them)).
16158
16159         (RootContext::CreateType): Record the order in which we define the
16160         classes.
16161
16162 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16163
16164         * class.cs (TypeContainer::Populate): Also method definitions can
16165         fail now, keep track of this.
16166
16167         (TypeContainer::FindMembers): Implement support for
16168         DeclaredOnly/noDeclaredOnly flag.
16169
16170         (Constructor::Emit) Return the ConstructorBuilder.
16171
16172         (Method::Emit) Return the MethodBuilder. 
16173         Check for abstract or virtual methods to be public.
16174
16175         * rootcontext.cs (RootContext::CreateType): Register all the
16176         abstract methods required for the class to be complete and the
16177         interface methods that must be implemented. 
16178
16179         * cs-parser.jay: Report error 501 (method requires body if it is
16180         not marked abstract or extern).
16181
16182         * expression.cs (TypeOf::Emit): Implement.
16183
16184         * typemanager.cs: runtime_handle_type, new global type.
16185
16186         * class.cs (Property::Emit): Generate code for properties.
16187
16188 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16189
16190         * expression.cs (Unary::ResolveOperator): Find operators on base type
16191         too - we now conform exactly to the spec.
16192
16193         (Binary::ResolveOperator): Same here.
16194
16195         * class.cs (Operator::Define): Fix minor quirk in the tests.
16196
16197         * ../errors/cs0215.cs : Added.
16198
16199         * ../errors/cs0556.cs : Added.
16200
16201         * ../errors/cs0555.cs : Added.
16202
16203 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16204
16205         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16206         single integer which is really efficient
16207
16208 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16209
16210         *  expression.cs (Expression::ImplicitUserConversion): Use location
16211         even in the case when we are examining True operators.
16212  
16213         * class.cs (Operator::Define): Perform extensive checks to conform
16214         with the rules for operator overloading in the spec.
16215
16216         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16217         some of the other conversions mentioned in the spec.
16218
16219         * typemanager.cs (array_type): New static member for the System.Array built-in
16220         type.
16221
16222         (cloneable_interface): For System.ICloneable interface.
16223
16224         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16225         we start resolving the tree and populating types.
16226
16227         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16228  
16229 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16230
16231         * expression.cs (Expression::ExprClassFromMemberInfo,
16232         Expression::Literalize): Create literal expressions from
16233         FieldInfos which are literals.
16234
16235         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16236         type casts, because they were wrong.  The test suite in tests
16237         caught these ones.
16238
16239         (ImplicitNumericConversion): ushort to ulong requires a widening
16240         cast. 
16241
16242         Int32 constant to long requires widening cast as well.
16243
16244         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16245         for integers because the type on the stack is not i4.
16246
16247 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16248
16249         * expression.cs (report118): require location argument. 
16250
16251         * parameter.cs: Do not dereference potential null value.
16252
16253         * class.cs: Catch methods that lack the `new' keyword when
16254         overriding a name.  Report warnings when `new' is used without
16255         anything being there to override.
16256
16257         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16258
16259         * class.cs: Only add constructor to hashtable if it is non-null
16260         (as now constructors can fail on define).
16261
16262         (TypeManager, Class, Struct): Take location arguments.
16263
16264         Catch field instance initialization in structs as errors.
16265
16266         accepting_filter: a new filter for FindMembers that is static so
16267         that we dont create an instance per invocation.
16268
16269         (Constructor::Define): Catch errors where a struct constructor is
16270         parameterless 
16271
16272         * cs-parser.jay: Pass location information for various new
16273         constructs. 
16274
16275         * delegate.cs (Delegate): take a location argument.
16276
16277         * driver.cs: Do not call EmitCode if there were problesm in the
16278         Definition of the types, as many Builders wont be there. 
16279
16280         * decl.cs (Decl::Decl): Require a location argument.
16281
16282         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16283         into integers, and find the most appropiate integer for it.
16284
16285         * literal.cs: Implement ULongLiteral.
16286
16287         * rootcontext.cs: Provide better information about the location of
16288         failure when CreateType fails.
16289
16290 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16291
16292         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16293         as well.
16294
16295         * expression.cs (Binary::CheckShiftArguments): Add missing type
16296         computation.
16297         (Binary::ResolveOperator): Add type to the logical and and logical
16298         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16299         before.
16300
16301         (Binary::DoNumericPromotions): In the case where either argument
16302         is ulong (and most signed types combined with ulong cause an
16303         error) perform implicit integer constant conversions as well.
16304
16305 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16306
16307         * expression.cs (UserImplicitCast): Method should always be
16308         non-null. 
16309         (Invocation::BetterConversion): Simplified test for IntLiteral.
16310
16311         (Expression::ImplicitNumericConversion): Split this routine out.
16312         Put the code that performs implicit constant integer conversions
16313         here. 
16314
16315         (Expression::Resolve): Become a wrapper around DoResolve so we can
16316         check eclass and type being set after resolve.
16317
16318         (Invocation::Badness): Remove this dead function
16319
16320         (Binary::ResolveOperator): Do not compute the expensive argumnets
16321         unless we have a union for it.
16322
16323         (Probe::Emit): Is needs to do an isinst and then
16324         compare against null.
16325
16326         (::CanConvert): Added Location argument.  If the Location argument
16327         is null (Location.Null), then we do not report errors.  This is
16328         used by the `probe' mechanism of the Explicit conversion.  We do
16329         not want to generate an error for something that the user
16330         explicitly requested to be casted.  But the pipeline for an
16331         explicit cast first tests for potential implicit casts.
16332
16333         So for now, if the Location is null, it means `Probe only' to
16334         avoid adding another argument.   Might have to revise this
16335         strategy later.
16336
16337         (ClassCast): New class used to type cast objects into arbitrary
16338         classes (used in Explicit Reference Conversions).
16339
16340         Implement `as' as well.
16341
16342         Reverted all the patches from Ravi below: they were broken:
16343
16344                 * The use of `level' as a mechanism to stop recursive
16345                   invocations is wrong.  That was there just to catch the
16346                   bug with a strack trace but not as a way of addressing
16347                   the problem.
16348
16349                   To fix the problem we have to *understand* what is going
16350                   on and the interactions and come up with a plan, not
16351                   just get things going.
16352
16353                 * The use of the type conversion cache that I proposed
16354                   last night had an open topic: How does this work across
16355                   protection domains.  A user defined conversion might not
16356                   be public in the location where we are applying the
16357                   conversion, a different conversion might be selected
16358                   (ie, private A->B (better) but public B->A (worse),
16359                   inside A, A->B applies, but outside it, B->A will
16360                   apply).
16361
16362                 * On top of that (ie, even if the above is solved),
16363                   conversions in a cache need to be abstract.  Ie, `To
16364                   convert from an Int to a Short use an OpcodeCast', not
16365                   `To convert from an Int to a Short use the OpcodeCast on
16366                   the variable 5' (which is what this patch was doing).
16367
16368 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16369
16370         * expression.cs (Invocation::ConversionExists): Re-write to use
16371         the conversion cache
16372
16373         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16374         cache all conversions done, not just user-defined ones.
16375
16376         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16377         to determine if a conversion exists instead of acutually trying to 
16378         perform the conversion. It's faster too.
16379
16380         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16381         and only then attempt the implicit conversion.
16382
16383 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16384
16385         * expression.cs (ConvertImplicit): Use a cache for conversions
16386         already found. Check level of recursion and bail out if necessary.
16387
16388 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16389
16390         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16391         Export standard methods that we expect for string operations.
16392
16393         * statement.cs (Block::UsageWarning): Track usage of variables and
16394         report the errors for not used variables.
16395
16396         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16397         operator. 
16398
16399 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16400
16401         * codegen.cs: remove unnneded code 
16402
16403         * expression.cs: Removed BuiltinTypeAccess class
16404
16405         Fix the order in which implicit conversions are
16406         done.  
16407
16408         The previous fixed dropped support for boxed conversions (adding a
16409         test to the test suite now)
16410
16411         (UserImplicitCast::CanConvert): Remove test for source being null,
16412         that code is broken.  We should not feed a null to begin with, if
16413         we do, then we should track the bug where the problem originates
16414         and not try to cover it up here.
16415
16416         Return a resolved expression of type UserImplicitCast on success
16417         rather than true/false.  Ravi: this is what I was talking about,
16418         the pattern is to use a static method as a "constructor" for
16419         objects. 
16420
16421         Also, do not create arguments until the very last minute,
16422         otherwise we always create the arguments even for lookups that
16423         will never be performed. 
16424
16425         (UserImplicitCast::Resolve): Eliminate, objects of type
16426         UserImplicitCast are born in a fully resolved state. 
16427
16428         * typemanager.cs (InitCoreTypes): Init also value_type
16429         (System.ValueType). 
16430
16431         * expression.cs (Cast::Resolve): First resolve the child expression.
16432
16433         (LValue): Add new method AddressOf to be used by
16434         the `&' operator.  
16435
16436         Change the argument of Store to take an EmitContext instead of an
16437         ILGenerator, because things like FieldExpr need to be able to call
16438         their children expression to generate the instance code. 
16439
16440         (Expression::Error, Expression::Warning): Sugar functions for
16441         reporting errors.
16442
16443         (Expression::MemberLookup): Accept a TypeContainer instead of a
16444         Report as the first argument.
16445
16446         (Expression::ResolvePrimary): Killed.  I still want to improve
16447         this as currently the code is just not right.
16448
16449         (Expression::ResolveMemberAccess): Simplify, but it is still
16450         wrong. 
16451
16452         (Unary::Resolve): Catch errors in AddressOf operators.
16453
16454         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16455         index to a byte for the short-version, or the compiler will choose
16456         the wrong Emit call, which generates the wrong data.
16457
16458         (ParameterReference::Emit, ::Store): same.
16459
16460         (FieldExpr::AddressOf): Implement.
16461
16462         * typemanager.cs: TypeManager: made public variable instead of
16463         property.
16464
16465         * driver.cs: document --fatal.
16466
16467         * report.cs (ErrorMessage, WarningMessage): new names for the old
16468         Error and Warning classes.
16469
16470         * cs-parser.jay (member_access): Turn built-in access to types
16471         into a normal simplename
16472
16473 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16474
16475         * expression.cs (Invocation::BetterConversion): Fix to cope
16476         with q being null, since this was introducing a bug.
16477
16478         * expression.cs (ConvertImplicit): Do built-in conversions first.
16479
16480 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16481
16482         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16483
16484 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16485
16486         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16487         I had introduced long ago (what's new ?).
16488
16489         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16490         the work of all the checking. 
16491         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16492         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16493
16494         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16495         that is the right way. 
16496
16497         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16498         overloading resolution. Use everywhere instead of cutting and pasting code.
16499
16500         (Binary::ResolveOperator): Use MakeUnionSet.
16501
16502         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16503         we have to convert to bool types. Not complete yet.
16504
16505 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16506
16507         * typemanager.cs (TypeManager::CSharpName): support ushort.
16508
16509         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16510         to provide an expression that performsn an implicit constant int
16511         conversion (section 6.1.6).
16512         (Expression::ConvertImplicitRequired): Reworked to include
16513         implicit constant expression conversions.
16514
16515         (Expression::ConvertNumericExplicit): Finished.
16516
16517         (Invocation::Emit): If InstanceExpression is null, then it means
16518         that we perform a call on this.
16519
16520 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16521
16522         * expression.cs (Unary::Emit): Remove some dead code.
16523         (Probe): Implement Resolve and Emit for `is'.
16524         (Expression::ConvertImplicitRequired): Attempt to do constant
16525         expression conversions here.  Maybe should be moved to
16526         ConvertImplicit, but I am not sure.
16527         (Expression::ImplicitLongConstantConversionPossible,
16528         Expression::ImplicitIntConstantConversionPossible): New functions
16529         that tell whether is it possible to apply an implicit constant
16530         expression conversion.
16531
16532         (ConvertNumericExplicit): Started work on explicit numeric
16533         conversions.
16534
16535         * cs-parser.jay: Update operator constants.
16536
16537         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16538         (Parameters::GetSignature): Hook up VerifyArgs here.
16539         (Parameters::VerifyArgs): Verifies that no two arguments have the
16540         same name. 
16541
16542         * class.cs (Operator): Update the operator names to reflect the
16543         ones that the spec expects (as we are just stringizing the
16544         operator names).
16545
16546         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16547         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16548         previous usage did only work for our methods.
16549         (Expression::ConvertImplicit): Handle decimal implicit numeric
16550         conversions as well.
16551         (Expression::InternalTypeConstructor): Used to invoke constructors
16552         on internal types for default promotions.
16553
16554         (Unary::Emit): Implement special handling for the pre/post
16555         increment/decrement for overloaded operators, as they need to have
16556         the same semantics as the other operators.
16557
16558         (Binary::ResolveOperator): ditto.
16559         (Invocation::ConversionExists): ditto.
16560         (UserImplicitCast::Resolve): ditto.
16561
16562 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16563
16564         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16565         operator, return after emitting body. Regression tests pass again !
16566
16567         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16568         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16569         (Invocation::OverloadResolve): Ditto.
16570         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16571
16572         * everywhere : update calls to the above methods accordingly.
16573
16574 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16575
16576         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16577
16578         * expression.cs (ExpressionStatement): New base class used for
16579         expressions that can appear in statements, so that we can provide
16580         an alternate path to generate expression that do not leave a value
16581         on the stack.
16582
16583         (Expression::Emit, and all the derivatives): We no longer return
16584         whether a value is left on the stack or not.  Every expression
16585         after being emitted leaves a single value on the stack.
16586
16587         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16588         facilties of ExpressionStatement if possible.
16589
16590         * cs-parser.jay: Update statement_expression.
16591
16592 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16593
16594         * driver.cs: Change the wording of message
16595
16596 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16597
16598         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16599         the type of the expression to the return type of the method if
16600         we have an overloaded operator match ! The regression tests pass again !
16601         (Unary::ResolveOperator): Ditto.
16602
16603         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16604         to find "op_Implicit", not "implicit" ;-)
16605         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16606         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16607
16608         * everywhere : Correct calls to the above accordingly.
16609
16610         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16611         (ConvertImplicit): Do user-defined conversion if it exists.
16612
16613 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16614
16615         * assign.cs: track location.
16616         (Resolve): Use implicit conversions on assignment.
16617
16618         * literal.cs: Oops.  Not good, Emit of short access values should
16619         pass (Bytes) or the wrong argument will be selected.
16620
16621         * expression.cs (Unary::Emit): Emit code for -expr.
16622
16623         (Unary::ResolveOperator): Handle `Substract' for non-constants
16624         (substract from zero from the non-constants).
16625         Deal with Doubles as well. 
16626
16627         (Expression::ConvertImplicitRequired): New routine that reports an
16628         error if no implicit conversion exists. 
16629
16630         (Invocation::OverloadResolve): Store the converted implicit
16631         expressions if we make them
16632
16633 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16634
16635         * class.cs (ConstructorInitializer): Take a Location argument.
16636         (ConstructorBaseInitializer): Same here.
16637         (ConstructorThisInitializer): Same here.
16638
16639         * cs-parser.jay : Update all calls accordingly.
16640
16641         * expression.cs (Unary, Binary, New): Take location argument.
16642         Update accordingly everywhere.
16643
16644         * cs-parser.jay : Update all calls to the above to take a location
16645         argument.
16646
16647         * class.cs : Ditto.
16648
16649 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16650
16651         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16652         (Invocation::BetterConversion): Same here
16653         (Invocation::ConversionExists): Ditto.
16654
16655         (Invocation::ConversionExists): Implement.
16656
16657 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16658
16659         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16660         Also take an additional TypeContainer argument.
16661
16662         * All over : Pass in TypeContainer as argument to OverloadResolve.
16663
16664         * typemanager.cs (CSharpName): Update to check for the string type and return
16665         that too.
16666
16667         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16668         a given method.
16669
16670 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16671
16672         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16673         (Invocation::BetterFunction): Implement.
16674         (Invocation::BetterConversion): Implement.
16675         (Invocation::ConversionExists): Skeleton, no implementation yet.
16676
16677         Okay, things work fine !
16678
16679 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16680
16681         * typemanager.cs: declare and load enum_type, delegate_type and
16682         void_type. 
16683
16684         * expression.cs (Expression::Emit): Now emit returns a value that
16685         tells whether a value is left on the stack or not.  This strategy
16686         might be reveted tomorrow with a mechanism that would address
16687         multiple assignments.
16688         (Expression::report118): Utility routine to report mismatches on
16689         the ExprClass.
16690
16691         (Unary::Report23): Report impossible type/operator combination
16692         utility function.
16693
16694         (Unary::IsIncrementableNumber): Whether the type can be
16695         incremented or decremented with add.
16696         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16697         complemented. 
16698         (Unary::ResolveOperator): Implement ++, !, ~,
16699
16700         (Invocation::Emit): Deal with new Emit convetion.
16701
16702         * All Expression derivatives: Updated their Emit method to return
16703         whether they leave values on the stack or not.
16704
16705         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16706         stack for expressions that are statements. 
16707
16708 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16709
16710         * expression.cs (LValue): New interface.  Must be implemented by
16711         LValue objects.
16712         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16713         LValue interface.
16714
16715         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16716         interface for generating code, simplifies the code.
16717
16718 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16719
16720         * expression.cs (everywhere): Comment out return statements in ::Resolve
16721         methods to avoid the warnings.
16722
16723 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16724
16725         * driver.cs (parse): Report error 2001 if we can not open the
16726         source file.
16727
16728         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16729         not resolve it.
16730
16731         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16732         object. 
16733
16734         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16735         otherwise nested blocks end up with the same index.
16736
16737         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16738
16739         * expression.cs:  Instead of having FIXMEs in the Resolve
16740         functions, throw exceptions so it is obvious that we are facing a
16741         bug. 
16742
16743         * cs-parser.jay (invocation_expression): Pass Location information.
16744
16745         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16746         Use a basename for those routines because .NET does not like paths
16747         on them. 
16748
16749         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16750         already defined.
16751
16752 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16753
16754         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16755         are loading the correct data types (throws an exception if not).
16756         (TypeManager::InitCoreTypes): Use CoreLookupType
16757
16758         * expression.cs (Unary::ResolveOperator): return the child
16759         expression for expressions which are just +expr.
16760         (Unary::ResolveOperator): Return negative literals for -LITERAL
16761         expressions (otherwise they are Unary {Literal}).
16762         (Invocation::Badness): Take into account `Implicit constant
16763         expression conversions'.
16764
16765         * literal.cs (LongLiteral): Implement long literal class.
16766         (IntLiteral): export the `Value' of the intliteral. 
16767
16768 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16769
16770         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16771
16772         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16773         instead of 'Operator'
16774
16775         * expression.cs (Binary::ResolveOperator): Update accordingly.
16776         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16777         and 'Minus'
16778
16779         * cs-parser.jay (unary_expression): Update to use the new names.
16780
16781         * gen-treedump.cs (GetUnary): Same here.
16782
16783         * expression.cs (Unary::Resolve): Implement.
16784         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16785         operators are found instead of making noise ;-)
16786         (Unary::ResolveOperator): New method to do precisely the same thing which
16787         Binary::ResolveOperator does for Binary expressions.
16788         (Unary.method, .Arguments): Add.
16789         (Unary::OperName): Implement.   
16790         (Unary::ForceConversion): Copy and Paste !
16791
16792         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16793         a unary operator.
16794
16795         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16796         for the inbuilt operators. Only overloading works for now ;-)
16797
16798 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16799
16800         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16801         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16802
16803         * expression.cs (This::Emit): Implement. 
16804         (This::Resolve): Implement.
16805         (TypeOf:Resolve): Implement.
16806         (Expression::ResolveSimpleName): Add an implicit this to instance
16807         field references. 
16808         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16809         Bind instance variable to Field expressions.
16810         (FieldExpr::Instance): New field used to track the expression that
16811         represents the object instance.
16812         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16813         binding 
16814         (FieldExpr::Emit): Implement.
16815
16816         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16817         the last instruction contains a return opcode to avoid generating
16818         the last `ret' instruction (this generates correct code, and it is
16819         nice to pass the peverify output).
16820
16821         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16822         initializer for static and instance variables.
16823         (Constructor::Emit): Allow initializer to be null in the case of
16824         static constructors.  Only emit initializer for instance
16825         constructors. 
16826
16827         (TypeContainer::FindMembers): Return a null array if there are no
16828         matches.
16829
16830         Also fix the code for the MemberTypes.Method branch, as it was not
16831         scanning that for operators (or tried to access null variables before).
16832
16833         * assign.cs (Assign::Emit): Handle instance and static fields. 
16834
16835         * TODO: Updated.
16836
16837         * driver.cs: Stop compilation if there are parse errors.
16838
16839         * cs-parser.jay (constructor_declaration): Provide default base
16840         initializer for non-static constructors.
16841         (constructor_declarator): Do not provide a default base
16842         initializers if none was specified.
16843         Catch the fact that constructors should not have parameters.
16844
16845         * class.cs: Do not emit parent class initializers for static
16846         constructors, that should be flagged as an error.
16847
16848 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16849
16850         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16851         Move back code into TypeContainer::Populate.
16852
16853 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16854
16855         * class.cs (TypeContainer::AddConstructor): Fix the check to
16856         compare against Name, not Basename. 
16857         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16858
16859         * cs-parser.jay : Update accordingly.
16860
16861         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16862         for methods, don't forget to look into the operators too.
16863         (RegisterMethodBuilder): Helper method to take care of this for
16864         methods, constructors and operators.
16865         (Operator::Define): Completely revamp.
16866         (Operator.OperatorMethod, MethodName): New fields.
16867         (TypeContainer::Populate): Move the registering of builders into
16868         RegisterMethodBuilder.
16869         (Operator::Emit): Re-write.
16870
16871         * expression.cs (Binary::Emit): Comment out code path to emit method
16872         invocation stuff for the case when we have a user defined operator. I am
16873         just not able to get it right !
16874
16875 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16876
16877         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16878         argument. 
16879
16880         (Expression::MemberLookup): Provide a version that allows to
16881         specify the MemberTypes and BindingFlags. 
16882
16883         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16884         so it was not fetching variable information from outer blocks.
16885
16886         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16887         Beforefieldinit as it was buggy.
16888
16889         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16890         that Ravi put here.  
16891
16892         * class.cs (Constructor::Emit): Only emit if block is not null.
16893         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16894         deal with this by semantically definining it as if the user had
16895         done it.
16896
16897         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16898         constructors as we now "emit" them at a higher level.
16899
16900         (TypeContainer::DefineDefaultConstructor): Used to define the
16901         default constructors if none was provided.
16902
16903         (ConstructorInitializer): Add methods Resolve and Emit. 
16904
16905         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16906
16907 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16908
16909         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16910         the default constructor builder with our hashtable for methodbuilders
16911         to methodcores.
16912
16913         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16914         and argument_count is 0 in which case we have a match.
16915         (Binary::ResolveOperator): More null checking and miscellaneous coding
16916         style cleanup.
16917
16918 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16919
16920         * rootcontext.cs (IsNameSpace): Compare against null.
16921
16922         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16923
16924         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16925         and Unary::Operator.
16926
16927         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16928         accordingly.
16929
16930         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16931         we have overloaded operators.
16932         (Binary::ResolveOperator): Implement the part which does the operator overload
16933         resolution.
16934
16935         * class.cs (Operator::Emit): Implement.
16936         (TypeContainer::Emit): Emit the operators we have too.
16937
16938         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16939         the case when we have a user-defined operator.
16940
16941 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16942
16943         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16944
16945 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16946
16947         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16948         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16949         (Constructor::Emit): Implement.
16950         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16951         if we have no work to do. 
16952         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16953         Emit method.
16954
16955         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16956         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16957
16958         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16959         of parent.parent.
16960
16961 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16962
16963         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16964         in the source.
16965         (Tree::RecordNamespace): Method to do what the name says ;-)
16966         (Tree::Namespaces): Property to get at the namespaces hashtable.
16967
16968         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16969         keep track.
16970
16971         * rootcontext.cs (IsNamespace): Fixed it :-)
16972
16973 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16974
16975         * class.cs (TypeContainer::FindMembers): Add support for
16976         constructors. 
16977         (MethodCore): New class that encapsulates both the shared aspects
16978         of a Constructor and a Method.  
16979         (Method, Constructor): Factored pieces into MethodCore.
16980
16981         * driver.cs: Added --fatal which makes errors throw exceptions.
16982         Load System assembly as well as part of the standard library.
16983
16984         * report.cs: Allow throwing exceptions on errors for debugging.
16985
16986         * modifiers.cs: Do not use `parent', instead use the real type
16987         container to evaluate permission settings.
16988
16989         * class.cs: Put Ravi's patch back in.  He is right, and we will
16990         have to cope with the
16991
16992 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16993
16994         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16995         FamORAssem, not FamANDAssem.
16996
16997 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16998
16999         * driver.cs: Added --parse option that only parses its input files
17000         and terminates.
17001
17002         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17003         incorrect.  IsTopLevel is not used to tell whether an object is
17004         root_types or not (that can be achieved by testing this ==
17005         root_types).  But to see if this is a top-level *class* (not
17006         necessarly our "toplevel" container). 
17007
17008 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17009
17010         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17011         parent instead of a direct call to GetType.
17012
17013 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17014
17015         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17016         Modifiers.TypeAttr. This should just be a call to that method.
17017
17018         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17019         object so that we can determine if we are top-level or not.
17020
17021         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17022         TypeContainer too.
17023
17024         * enum.cs (Enum::Define): Ditto.
17025
17026         * modifiers.cs (FieldAttr): Re-write.
17027
17028         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17029         (TypeContainer::HaveStaticConstructor): New property to provide access
17030         to precisely that info.
17031
17032         * modifiers.cs (MethodAttr): Re-write.
17033         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17034
17035         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17036         of top-level types as claimed.
17037
17038 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17039
17040         * expression.cs (MemberLookup): Fruitless attempt to lookup
17041         constructors.  Maybe I need to emit default constructors?  That
17042         might be it (currently .NET emits this for me automatically).
17043         (Invocation::OverloadResolve): Cope with Arguments == null.
17044         (Invocation::EmitArguments): new function, shared by the new
17045         constructor and us.
17046         (Invocation::Emit): Handle static and instance methods.  Emit
17047         proper call instruction for virtual or non-virtual invocations.
17048         (New::Emit): Implement.
17049         (New::Resolve): Implement.
17050         (MemberAccess:Resolve): Implement.
17051         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17052         to track instances.
17053         (FieldExpr::Resolve): Set type.
17054
17055         * support.cs: Handle empty arguments.
17056                 
17057         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17058         SimpleLookup): Auxiliary routines to help parse a qualifier
17059         identifier.  
17060
17061         Update qualifier_identifier rule.
17062
17063         * codegen.cs: Removed debugging messages.
17064
17065         * class.cs: Make this a global thing, this acts just as a "key" to
17066         objects that we might have around.
17067
17068         (Populate): Only initialize method_builders_to_methods once.
17069
17070         * expression.cs (PropertyExpr): Initialize type from the
17071         PropertyType. 
17072
17073         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17074         Resolve pattern.  Attempt to implicitly convert value to boolean.
17075         Emit code.
17076
17077         * expression.cs: Set the type for the int32/int32 argument case.
17078         (Binary::ResolveOperator): Set the return type to boolean for
17079         comparission operators
17080
17081         * typemanager.cs: Remove debugging print code.
17082
17083         (Invocation::Resolve): resolve type.
17084
17085         * class.cs: Allocate a MemberInfo of the correct size, as the code
17086         elsewhere depends on the test to reflect the correct contents.
17087
17088         (Method::) Keep track of parameters, due to System.Reflection holes
17089
17090         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17091         mapping here.
17092
17093         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17094         of the exact size and return that.
17095
17096         (Class::LookupMethodByBuilder): New function that maps
17097         MethodBuilders to its methods.  Required to locate the information
17098         on methods because System.Reflection bit us again.
17099
17100         * support.cs: New file, contains an interface ParameterData and
17101         two implementations: ReflectionParameters and InternalParameters
17102         used to access Parameter information.  We will need to grow this
17103         as required.
17104
17105         * expression.cs (Invocation::GetParameterData): implement a cache
17106         and a wrapper around the ParameterData creation for methods. 
17107         (Invocation::OverloadResolve): Use new code.
17108
17109 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17110
17111         * class.cs (TypeContainer::EmitField): Remove and move into 
17112         (Field::Define): here and modify accordingly.
17113         (Field.FieldBuilder): New member.
17114         (TypeContainer::Populate): Update accordingly.
17115         (TypeContainer::FindMembers): Implement.
17116
17117 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17118
17119         * statement.cs: (VariableInfo::VariableType): New field to be
17120         initialized with the full type once it is resolved. 
17121
17122 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17123
17124         * parameter.cs (GetParameterInfo): Use a type cache to compute
17125         things only once, and to reuse this information
17126
17127         * expression.cs (LocalVariableReference::Emit): Implement.
17128         (OpcodeCast::Emit): fix.
17129
17130         (ParameterReference::Resolve): Implement.
17131         (ParameterReference::Emit): Implement.
17132
17133         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17134         that are expressions need to stay as Expressions.
17135
17136         * typemanager.cs (CSharpName): Returns the C# name of a type if
17137         possible. 
17138
17139         * expression.cs (Expression::ConvertImplicit): New function that
17140         implements implicit type conversions.
17141
17142         (Expression::ImplicitReferenceConversion): Implements implicit
17143         reference conversions.
17144
17145         (EmptyCast): New type for transparent casts.
17146
17147         (OpcodeCast): New type for casts of types that are performed with
17148         a sequence of bytecodes.
17149
17150         (BoxedCast): New type used for casting value types into reference
17151         types.  Emits a box opcode.
17152
17153         (Binary::DoNumericPromotions): Implements numeric promotions of
17154         and computation of the Binary::Type.
17155
17156         (Binary::EmitBranchable): Optimization.
17157
17158         (Binary::Emit): Implement code emission for expressions.
17159
17160         * typemanager.cs (TypeManager): Added two new core types: sbyte
17161         and byte.
17162
17163 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17164
17165         * class.cs (TypeContainer::FindMembers): Method which does exactly
17166         what Type.FindMembers does, only we don't have to use reflection. No
17167         implementation yet.
17168
17169         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17170         typecontainer objects as we need to get at them.
17171         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17172
17173         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17174         typecontainer object.
17175
17176         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17177         of just a Report object.
17178
17179 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17180
17181         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17182         "remove_"
17183         (TypeContainer::Populate): Now define the delegates of the type too.
17184         (TypeContainer.Delegates): Property to access the list of delegates defined
17185         in the type.
17186
17187         * delegates.cs (Delegate::Define): Implement partially.
17188
17189         * modifiers.cs (TypeAttr): Handle more flags.
17190
17191 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17192
17193         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17194         and not <=
17195         (Operator::Define): Re-write logic to get types by using the LookupType method
17196         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17197         (Indexer::Define): Ditto.
17198         (Event::Define): Ditto.
17199         (Property::Define): Ditto.
17200
17201 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17202
17203         * class.cs (TypeContainer::Populate): Now define operators too. 
17204         (TypeContainer.Operators): New property to access the list of operators
17205         in a type.
17206         (Operator.OperatorMethodBuilder): New member to hold the method builder
17207         for the operator we are defining.
17208         (Operator::Define): Implement.
17209
17210 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17211
17212         * class.cs (Event::Define): Make the prefixes of the accessor methods
17213         addOn_ and removeOn_ 
17214
17215         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17216         of the location being passed in too. Ideally, this should go later since all
17217         error reporting should be done through the Report object.
17218
17219         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17220         (Populate): Iterate thru the indexers we have and define them too.
17221         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17222         for the get and set accessors.
17223         (Indexer::Define): Implement.
17224
17225 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17226
17227         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17228         my previous implementation, did not work.
17229
17230         * typemanager.cs: Add a couple of missing types (the longs).
17231
17232         * literal.cs: Use TypeManager.bool_type instead of getting it.
17233
17234         * expression.cs (EventExpr): New kind of expressions.
17235         (Expressio::ExprClassFromMemberInfo): finish
17236
17237 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17238
17239         * assign.cs: Emit stores to static fields differently.
17240
17241 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17242
17243         * Merge in changes and adjust code to tackle conflicts. Backed out my
17244         code in Assign::Resolve ;-) 
17245
17246 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17247
17248         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17249         instead Report.Error and also pass in the location.
17250         (CSharpParser::Lexer): New readonly property to return the reference
17251         to the Tokenizer object.
17252         (declare_local_variables): Use Report.Error with location instead of plain 
17253         old error.
17254         (CheckDef): Ditto.
17255
17256         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17257         (Operator.CheckBinaryOperator): Ditto.
17258
17259         * cs-parser.jay (operator_declarator): Update accordingly.
17260
17261         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17262         (CheckBinaryOperator): Same here.
17263
17264         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17265         on the name without any prefixes of namespace names etc. This is because we
17266         already might have something already fully qualified like 
17267         'System.Console.WriteLine'
17268
17269         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17270
17271 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17272
17273         * cs-tokenizer.cs (location): Return a string which also contains
17274         the file name.
17275
17276         * expression.cs (ElementAccess): New class for expressions of the
17277         type 'element access.'
17278         (BaseAccess): New class for expressions of the type 'base access.'
17279         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17280         respectively.
17281
17282         * cs-parser.jay (element_access): Implement action.
17283         (base_access): Implement actions.
17284         (checked_expression, unchecked_expression): Implement.
17285
17286         * cs-parser.jay (local_variable_type): Correct and implement.
17287         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17288
17289         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17290
17291         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17292         name and the specifiers.
17293
17294         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17295
17296         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17297         making them all public ;-)
17298
17299         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17300         class anyways.
17301
17302 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17303
17304         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17305         PropertyExprs.
17306         (FieldExpr, PropertyExprs): New resolved expressions.
17307         (SimpleName::MemberStaticCheck): Perform static checks for access
17308         to non-static fields on static methods. Maybe this should be
17309         generalized for MemberAccesses. 
17310         (SimpleName::ResolveSimpleName): More work on simple name
17311         resolution. 
17312
17313         * cs-parser.jay (primary_expression/qualified_identifier): track
17314         the parameter index.
17315
17316         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17317         (EmitContext::EmitBoolExpression): Chain to expression generation
17318         instead of temporary hack.
17319         (::EmitStatementExpression): Put generic expression code generation.
17320
17321         * assign.cs (Assign::Emit): Implement variable assignments to
17322         local variables, parameters and fields.
17323
17324 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17325
17326         * statement.cs (Block::GetVariableInfo): New method, returns the
17327         VariableInfo for a variable name in a block.
17328         (Block::GetVariableType): Implement in terms of GetVariableInfo
17329
17330         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17331         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17332
17333 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17334
17335         * cs-parser.jay (operator_declaration): Continue on my quest : update
17336         to take attributes argument.
17337         (event_declaration): Ditto.
17338         (enum_declaration): Ditto.
17339         (indexer_declaration): Ditto.
17340
17341         * class.cs (Operator::Operator): Update constructor accordingly.
17342         (Event::Event): Ditto.
17343
17344         * delegate.cs (Delegate::Delegate): Same here.
17345
17346         * enum.cs (Enum::Enum): Same here.
17347
17348 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17349
17350         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17351
17352         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17353
17354         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17355         being passed around as an arraylist.
17356         (Attributes::AddAttribute): Method to add attribute sections.
17357
17358         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17359         (struct_declaration): Update accordingly.
17360         (constant_declaration): Update.
17361         (field_declaration): Update.
17362         (method_header): Update.
17363         (fixed_parameter): Update.
17364         (parameter_array): Ditto.
17365         (property_declaration): Ditto.
17366         (destructor_declaration): Ditto.
17367
17368         * class.cs (Struct::Struct): Update constructors accordingly.
17369         (Class::Class): Ditto.
17370         (Field::Field): Ditto.
17371         (Method::Method): Ditto.
17372         (Property::Property): Ditto.
17373         (TypeContainer::OptAttribute): update property's return type.
17374
17375         * interface.cs (Interface.opt_attributes): New member.
17376         (Interface::Interface): Update to take the extra Attributes argument.
17377
17378         * parameter.cs (Parameter::Parameter): Ditto.
17379
17380         * constant.cs (Constant::Constant): Ditto.
17381
17382         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17383         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17384         the attributes as a parameter.
17385         (InterfaceProperty): Update constructor call.
17386         (InterfaceEvent): Ditto.
17387         (InterfaceMethod): Ditto.
17388         (InterfaceIndexer): Ditto.
17389
17390         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17391         pass the attributes too.
17392         (interface_event_declaration): Ditto.
17393         (interface_property_declaration): Ditto.
17394         (interface_method_declaration): Ditto.
17395         (interface_declaration): Ditto.
17396
17397 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17398
17399         * class.cs (Method::Define): Track the "static Main" definition to
17400         create an entry point. 
17401
17402         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17403         EntryPoint if we find it. 
17404
17405         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17406         (EmitContext::ig): Make this variable public.
17407
17408         * driver.cs: Make the default output file be the first file name
17409         with the .exe extension.  
17410
17411         Detect empty compilations
17412
17413         Handle various kinds of output targets.  Handle --target and
17414         rename -t to --dumper.
17415
17416         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17417         methods inherited from Expression return now an Expression.  This
17418         will is used during the tree rewriting as we resolve them during
17419         semantic analysis.
17420
17421         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17422         the spec.  Missing entirely is the information about
17423         accessability of elements of it.
17424
17425         (Expression::ExprClassFromMemberInfo): New constructor for
17426         Expressions that creates a fully initialized Expression based on
17427         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17428         a Type.
17429
17430         (Invocation::Resolve): Begin implementing resolution of invocations.
17431
17432         * literal.cs (StringLiteral):  Implement Emit.
17433
17434 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17435
17436         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17437         member.
17438
17439 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17440
17441         * cs-parser.jay (attribute_arguments): Implement actions.
17442         (attribute): Fix bug in production. Implement action.
17443         (attribute_list): Implement.
17444         (attribute_target): Implement.
17445         (attribute_target_specifier, opt_target_specifier): Implement
17446         (CheckAttributeTarget): New method to check if the attribute target
17447         is valid.
17448         (attribute_section): Implement.
17449         (opt_attributes): Implement.
17450
17451         * attribute.cs : New file to handle attributes.
17452         (Attribute): Class to hold attribute info.
17453
17454         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17455         (attribute_section): Modify production to use 2 different rules to 
17456         achieve the same thing. 1 s/r conflict down !
17457         Clean out commented, useless, non-reducing dimension_separator rules.
17458
17459         * class.cs (TypeContainer.attributes): New member to hold list
17460         of attributes for a type.
17461         (Struct::Struct): Modify to take one more argument, the attribute list.
17462         (Class::Class): Ditto.
17463         (Field::Field): Ditto.
17464         (Method::Method): Ditto.
17465         (Property::Property): Ditto.
17466
17467         * cs-parser.jay (struct_declaration): Update constructor call to
17468         pass in the attributes too.
17469         (class_declaration): Ditto.
17470         (constant_declaration): Ditto.
17471         (field_declaration): Ditto.
17472         (method_header): Ditto.
17473         (fixed_parameter): Ditto.
17474         (parameter_array): Ditto.
17475         (property_declaration): Ditto.
17476
17477         * constant.cs (Constant::Constant): Update constructor similarly.
17478         Use System.Collections.
17479
17480         * parameter.cs (Parameter::Parameter): Update as above.
17481
17482 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17483
17484         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17485         (TypeContainer.delegates): New member to hold list of delegates.
17486
17487         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17488         this time as I seem to be on crack ;-)
17489
17490 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17491
17492         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17493         tell whether an identifier represents a namespace.
17494
17495         * expression.cs (NamespaceExpr): A namespace expression, used only
17496         temporarly during expression resolution.
17497         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17498         utility functions to resolve names on expressions.
17499
17500 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17501
17502         * codegen.cs: Add hook for StatementExpressions. 
17503
17504         * class.cs: Fix inverted test for static flag in methods.
17505
17506 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17507
17508         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17509         to make it coincide with MS' number.
17510         (Operator::CheckBinaryOperator): Ditto.
17511
17512         * ../errors/errors.txt : Remove error numbers added earlier.
17513
17514         * ../errors/cs1019.cs : Test case for error # 1019
17515
17516         * ../errros/cs1020.cs : Test case for error # 1020
17517
17518         * cs-parser.jay : Clean out commented cruft.
17519         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17520         used anywhere - non-reducing rule.
17521         (namespace_declarations): Non-reducing rule - comment out.
17522
17523         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17524         with TypeContainer::AddEnum.
17525
17526         * delegate.cs : New file for delegate handling classes.
17527         (Delegate): Class for declaring delegates.
17528
17529         * makefile : Update.
17530
17531         * cs-parser.jay (delegate_declaration): Implement.
17532
17533 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17534
17535         * class.cs (Event::Define): Implement.
17536         (Event.EventBuilder): New member.
17537
17538         * class.cs (TypeContainer::Populate): Update to define all enums and events
17539         we have.
17540         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17541         readonly fields for all these cases ?
17542
17543 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17544
17545         * class.cs (Property): Revamp to use the convention of making fields readonly.
17546         Accordingly modify code elsewhere.
17547
17548         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17549         the Define method of the Property class.
17550
17551         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17552         trivial bug.
17553         (TypeContainer::Populate): Update to define all the properties we have. Also
17554         define all enumerations.
17555
17556         * enum.cs (Define): Implement.
17557
17558 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17559
17560         * cs-parser.jay (overloadable_operator): The semantic value is an
17561         enum of the Operator class.
17562         (operator_declarator): Implement actions.
17563         (operator_declaration): Implement.
17564
17565         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17566         validity of definitions.
17567         (Operator::CheckBinaryOperator): Static method to check for binary operators
17568         (TypeContainer::AddOperator): New method to add an operator to a type.
17569
17570         * cs-parser.jay (indexer_declaration): Added line to actually call the
17571         AddIndexer method so it gets added ;-)
17572
17573         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17574         already taken care of by the MS compiler ?  
17575
17576 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17577
17578         * class.cs (Operator): New class for operator declarations.
17579         (Operator::OpType): Enum for the various operators.
17580
17581 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17582
17583         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17584         ostensibly handle this in semantic analysis.
17585
17586         * cs-parser.jay (general_catch_clause): Comment out
17587         (specific_catch_clauses, specific_catch_clause): Ditto.
17588         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17589         (catch_args, opt_catch_args): New productions.
17590         (catch_clause): Rewrite to use the new productions above
17591         (catch_clauses): Modify accordingly.
17592         (opt_catch_clauses): New production to use in try_statement
17593         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17594         and re-write the code in the actions to extract the specific and
17595         general catch clauses by being a little smart ;-)
17596
17597         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17598         Hooray, try and catch statements parse fine !
17599
17600 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17601
17602         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17603         string from the hashtable of variables.
17604
17605         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17606         I end up making that mistake ;-)
17607         (catch_clauses): Fixed gross error which made Key and Value of the 
17608         DictionaryEntry the same : $1 !!
17609
17610 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17611
17612         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17613
17614         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17615         when the add and remove accessors are specified. 
17616
17617 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17618
17619         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17620         information about indexer_declarator.
17621         (indexer_declarator): Implement actions.
17622         (parsing_indexer): New local boolean used to keep track of whether
17623         we are parsing indexers or properties. This is necessary because 
17624         implicit_parameters come into picture even for the get accessor in the 
17625         case of an indexer.
17626         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17627
17628         * class.cs (Indexer): New class for indexer declarations.
17629         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17630         (TypeContainer::indexers): New member to hold list of indexers for the
17631         type.
17632
17633 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17634
17635         * cs-parser.jay (add_accessor_declaration): Implement action.
17636         (remove_accessor_declaration): Implement action.
17637         (event_accessors_declaration): Implement
17638         (variable_declarators): swap statements for first rule - trivial.
17639
17640         * class.cs (Event): New class to hold information about event
17641         declarations.
17642         (TypeContainer::AddEvent): New method to add an event to a type
17643         (TypeContainer::events): New member to hold list of events.
17644
17645         * cs-parser.jay (event_declaration): Implement actions.
17646
17647 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17648
17649         * cs-parser.jay (dim_separators): Implement. Make it a string
17650         concatenating all the commas together, just as they appear.
17651         (opt_dim_separators): Modify accordingly
17652         (rank_specifiers): Update accordingly. Basically do the same
17653         thing - instead, collect the brackets here.
17654         (opt_rank_sepcifiers): Modify accordingly.
17655         (array_type): Modify to actually return the complete type string
17656         instead of ignoring the rank_specifiers.
17657         (expression_list): Implement to collect the expressions
17658         (variable_initializer): Implement. We make it a list of expressions
17659         essentially so that we can handle the array_initializer case neatly too.
17660         (variable_initializer_list): Implement.
17661         (array_initializer): Make it a list of variable_initializers
17662         (opt_array_initializer): Modify accordingly.
17663
17664         * expression.cs (New::NType): Add enumeration to help us
17665         keep track of whether we have an object/delegate creation
17666         or an array creation.
17667         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17668         members to hold data about array creation.
17669         (New:New): Modify to update NewType
17670         (New:New): New Overloaded contructor for the array creation
17671         case.
17672
17673         * cs-parser.jay (array_creation_expression): Implement to call
17674         the overloaded New constructor.
17675
17676 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17677
17678         * class.cs (TypeContainer::Constructors): Return member
17679         constructors instead of returning null.
17680
17681 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17682
17683         * typemanager.cs (InitCoreTypes): Initialize the various core
17684         types after we have populated the type manager with the user
17685         defined types (this distinction will be important later while
17686         compiling corlib.dll)
17687
17688         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17689         on Expression Classification.  Now all expressions have a method
17690         `Resolve' and a method `Emit'.
17691
17692         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17693         generation from working.     Also add some temporary debugging
17694         code. 
17695
17696 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17697
17698         * codegen.cs: Lots of code generation pieces.  This is only the
17699         beginning, will continue tomorrow with more touches of polish.  We
17700         handle the fundamentals of if, while, do, for, return.  Others are
17701         trickier and I need to start working on invocations soon.
17702
17703         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17704         s.InitStatement. 
17705
17706         * codegen.cs (EmitContext): New struct, used during code
17707         emission to keep a context.   Most of the code generation will be
17708         here. 
17709
17710         * cs-parser.jay: Add embedded blocks to the list of statements of
17711         this block.  So code generation proceeds in a top down fashion.
17712
17713 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17714
17715         * statement.cs: Add support for multiple child blocks.
17716
17717 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17718
17719         * codegen.cs (EmitCode): New function, will emit the code for a
17720         Block of code given a TypeContainer and its ILGenerator. 
17721
17722         * statement.cs (Block): Standard public readonly optimization.
17723         (Block::Block constructors): Link children. 
17724         (Block::Child): Child Linker.
17725         (Block::EmitVariables): Emits IL variable declarations.
17726
17727         * class.cs: Drop support for MethodGroups here, delay until
17728         Semantic Analysis.
17729         (Method::): Applied the same simplification that I did before, and
17730         move from Properties to public readonly fields.
17731         (Method::ParameterTypes): Returns the parameter types for the
17732         function, and implements a cache that will be useful later when I
17733         do error checking and the semantic analysis on the methods is
17734         performed.
17735         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17736         and made a method, optional argument tells whether this is a class
17737         or a structure to apply the `has-this' bit.
17738         (Method::GetCallingConvention): Implement, returns the calling
17739         convention. 
17740         (Method::Define): Defines the type, a second pass is performed
17741         later to populate the methods.
17742
17743         (Constructor::ParameterTypes): implement a cache similar to the
17744         one on Method::ParameterTypes, useful later when we do semantic
17745         analysis. 
17746
17747         (TypeContainer::EmitMethod):  New method.  Emits methods.
17748
17749         * expression.cs: Removed MethodGroup class from here.
17750
17751         * parameter.cs (Parameters::GetCallingConvention): new method.
17752
17753 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17754
17755         * class.cs (TypeContainer::Populate): Drop RootContext from the
17756         argument. 
17757
17758         (Constructor::CallingConvention): Returns the calling convention.
17759         (Constructor::ParameterTypes): Returns the constructor parameter
17760         types. 
17761
17762         (TypeContainer::AddConstructor): Keep track of default constructor
17763         and the default static constructor.
17764
17765         (Constructor::) Another class that starts using `public readonly'
17766         instead of properties. 
17767
17768         (Constructor::IsDefault): Whether this is a default constructor. 
17769
17770         (Field::) use readonly public fields instead of properties also.
17771
17772         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17773         track of static constructors;  If none is used, turn on
17774         BeforeFieldInit in the TypeAttributes. 
17775
17776         * cs-parser.jay (opt_argument_list): now the return can be null
17777         for the cases where there are no arguments. 
17778
17779         (constructor_declarator): If there is no implicit `base' or
17780         `this', then invoke the default parent constructor. 
17781
17782         * modifiers.cs (MethodAttr): New static function maps a set of
17783         modifiers flags into a MethodAttributes enum
17784         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17785         MethodAttr, TypeAttr to represent the various mappings where the
17786         modifiers are used.
17787         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17788
17789 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17790
17791         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17792         method arguments.
17793
17794         * interface.cs (PopulateIndexer): Implemented the code generator
17795         for interface indexers.
17796
17797 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17798
17799         * interface.cs (InterfaceMemberBase): Now we track the new status
17800         here.  
17801
17802         (PopulateProperty): Implement property population.  Woohoo!  Got
17803         Methods and Properties going today. 
17804
17805         Removed all the properties for interfaces, and replaced them with
17806         `public readonly' fields. 
17807
17808 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17809
17810         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17811         initialize their hashtables/arraylists only when they are needed
17812         instead of doing this always.
17813
17814         * parameter.cs: Handle refs and out parameters.
17815
17816         * cs-parser.jay: Use an ArrayList to construct the arguments
17817         instead of the ParameterCollection, and then cast that to a
17818         Parameter[] array.
17819
17820         * parameter.cs: Drop the use of ParameterCollection and use
17821         instead arrays of Parameters.
17822
17823         (GetParameterInfo): Use the Type, not the Name when resolving
17824         types. 
17825
17826 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17827
17828         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17829         and instead use public readonly fields.
17830
17831         * class.cs: Put back walking code for type containers.
17832
17833 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17834
17835         * class.cs (MakeConstant): Code to define constants.
17836
17837         * rootcontext.cs (LookupType): New function.  Used to locate types 
17838
17839
17840 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17841
17842         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17843         this System.Reflection code is.  Kudos to Microsoft
17844
17845         * typemanager.cs: Implement a type cache and avoid loading all
17846         types at boot time.  Wrap in LookupType the internals.  This made
17847         the compiler so much faster.  Wow.  I rule!
17848
17849         * driver.cs: Make sure we always load mscorlib first (for
17850         debugging purposes, nothing really important).
17851
17852         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17853         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17854
17855         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17856         on namespaces that have been imported using the `using' keyword.
17857
17858         * class.cs (TypeContainer::TypeAttr): Virtualize.
17859         (Class::TypeAttr): Return attributes suitable for this bad boy.
17860         (Struct::TypeAttr): ditto.
17861         Handle nested classes.
17862         (TypeContainer::) Remove all the type visiting code, it is now
17863         replaced with the rootcontext.cs code
17864
17865         * rootcontext.cs (GetClassBases): Added support for structs. 
17866
17867 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17868
17869         * interface.cs, statement.cs, class.cs, parameter.cs,
17870         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17871         Drop use of TypeRefs, and use strings instead.
17872
17873 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17874
17875         * rootcontext.cs: 
17876
17877         * class.cs (Struct::Struct): set the SEALED flags after
17878         checking the modifiers.
17879         (TypeContainer::TypeAttr): new property, returns the
17880         TypeAttributes for a class.  
17881
17882         * cs-parser.jay (type_list): Oops, list production was creating a
17883         new list of base types.
17884
17885         * rootcontext.cs (StdLib): New property.
17886         (GetInterfaceTypeByName): returns an interface by type name, and
17887         encapsulates error handling here.
17888         (GetInterfaces): simplified.
17889         (ResolveTree): Encapsulated all the tree resolution here.
17890         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17891         types. 
17892
17893         * driver.cs: Add support for --nostdlib, to avoid loading the
17894         default assemblies.
17895         (Main): Do not put tree resolution here. 
17896
17897         * rootcontext.cs: Beginning of the class resolution.
17898
17899 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17900
17901         * rootcontext.cs: Provide better error reporting. 
17902
17903         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17904
17905         * rootcontext.cs (CreateInterface): Handle the case where there
17906         are no parent interfaces.
17907
17908         (CloseTypes): Routine to flush types at the end.
17909         (CreateInterface): Track types.
17910         (GetInterfaces): Returns an array of Types from the list of
17911         defined interfaces.
17912
17913         * typemanager.c (AddUserType): Mechanism to track user types (puts
17914         the type on the global type hash, and allows us to close it at the
17915         end). 
17916
17917 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17918
17919         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17920         RecordInterface instead.
17921
17922         * cs-parser.jay: Updated to reflect changes above.
17923
17924         * decl.cs (Definition): Keep track of the TypeBuilder type that
17925         represents this type here.  Not sure we will use it in the long
17926         run, but wont hurt for now.
17927
17928         * driver.cs: Smaller changes to accomodate the new code.
17929
17930         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17931         when done. 
17932
17933         * rootcontext.cs (CreateInterface):  New method, used to create
17934         the System.TypeBuilder type for interfaces.
17935         (ResolveInterfaces): new entry point to resolve the interface
17936         hierarchy. 
17937         (CodeGen): Property, used to keep track of the code generator.
17938
17939 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17940
17941         * cs-parser.jay: Add a second production for delegate_declaration
17942         with `VOID'.
17943
17944         (enum_body): Put an opt_comma here instead of putting it on
17945         enum_body or enum_member_declarations so we can handle trailing
17946         commas on enumeration members.  Gets rid of a shift/reduce.
17947
17948         (type_list): Need a COMMA in the middle.
17949
17950         (indexer_declaration): Tell tokenizer to recognize get/set
17951
17952         * Remove old targets.
17953
17954         * Re-add the parser target.
17955
17956 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17957
17958         * cs-parser.jay: Add precendence rules for a number of operators
17959         ot reduce the number of shift/reduce conflicts in the grammar.
17960
17961 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17962
17963         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17964         and put it here.
17965
17966         Get rid of old crufty code.
17967
17968         * rootcontext.cs: Use this to keep track of the parsed
17969         representation and the defined types available to the program. 
17970
17971         * gen-treedump.cs: adjust for new convention.
17972
17973         * type.cs: Split out the type manager, and the assembly builder
17974         from here. 
17975
17976         * typemanager.cs: the type manager will live here now.
17977
17978         * cil-codegen.cs: And the code generator here. 
17979
17980 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17981
17982         * makefile: Fixed up for easy making.
17983
17984 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17985
17986         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17987         the 
17988
17989         (unary_expression): Expand pre_increment_expression and
17990         post_decrement_expression to reduce a shift/reduce.
17991
17992 2001-07-11  Simon Cozens
17993
17994         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17995
17996         Improve allow_keyword_as_indent name.
17997
17998 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17999
18000         * Adjustments for Beta2. 
18001
18002 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18003
18004         * decl.cs: Added `Define' abstract method.
18005         (InTransit): new property, used to catch recursive definitions. 
18006
18007         * interface.cs: Implement `Define'. 
18008
18009         * modifiers.cs: Map Modifiers.constants to
18010         System.Reflection.TypeAttribute flags.
18011
18012         * class.cs: Keep track of types and user-defined types.
18013         (BuilderInit): New method for creating an assembly
18014         (ResolveType): New function to launch the resolution process, only
18015         used by interfaces for now.
18016
18017         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18018         that are inserted into the name space. 
18019
18020 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18021
18022         * ARGH.  I have screwed up my tree so many times due to the use of
18023         rsync rather than using CVS.  Going to fix this at once. 
18024
18025         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18026         load types.
18027
18028 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18029
18030         * Experiment successful: Use System.Type rather that our own
18031         version of Type.  
18032
18033 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18034
18035         * cs-parser.jay: Removed nsAliases from here.
18036
18037         Use new namespaces, handle `using XXX;' 
18038
18039         * namespace.cs: Reimplemented namespace handling, use a recursive
18040         definition of the class.  Now we can keep track of using clauses
18041         and catch invalid using clauses.
18042
18043 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18044
18045         * gen-treedump.cs: Adapted for all the renaming.
18046
18047         * expression.cs (Expression): this class now has a Type property
18048         which returns an expression Type.
18049
18050         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18051         `Type', as this has a different meaning now in the base
18052
18053 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18054
18055         * interface.cs, class.cs: Removed from all the sources the
18056         references to signature computation, as we can not do method
18057         signature computation during the parsing time, as we are not
18058         trying to solve at that point distinguishing:
18059
18060         class X {
18061                 void a (Blah x) {}
18062                 void a (NS.Blah x) {}
18063         }
18064
18065         Which depending on the context might be valid or not, as we do not
18066         know if Blah is the same thing as NS.Blah at that point.
18067
18068         * Redid everything so the code uses TypeRefs now instead of
18069         Types.  TypeRefs are just temporary type placeholders, that need
18070         to be resolved.  They initially have a pointer to a string and the
18071         current scope in which they are used.  This is used later by the
18072         compiler to resolve the reference to an actual Type. 
18073
18074         * DeclSpace is no longer a CIR.Type, and neither are
18075         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18076         are all DeclSpaces, but no Types. 
18077
18078         * type.cs (TypeRefManager): This implements the TypeRef manager,
18079         which keeps track of all the types that need to be resolved after
18080         the parsing has finished. 
18081
18082 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18083
18084         * ARGH.  We are going to have to store `foreach' as a class rather
18085         than resolving it, as we need to verify error 1579 after name
18086         resolution.   *OR* we could keep a flag that says `This request to
18087         IEnumerator comes from a foreach statement' which we can then use
18088         to generate the error.
18089
18090 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18091
18092         * class.cs (TypeContainer.AddMethod): we now add methods to the
18093         MethodGroup instead of the method hashtable.  
18094
18095         * expression.cs: Add MethodGroup abstraction, which gets us one
18096         step closer to the specification in the way we handle method
18097         declarations.  
18098
18099         * cs-parser.jay (primary_expression): qualified_identifier now
18100         tried to match up an identifier to a local variable reference or
18101         to a parameter reference.
18102
18103         current_local_parameters is now a parser global variable that
18104         points to the current parameters for the block, used during name
18105         lookup.
18106
18107         (property_declaration): Now creates an implicit `value' argument to
18108         the set accessor.
18109
18110 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18111
18112         * parameter.cs: Do not use `param' arguments as part of the
18113         signature, per the spec.
18114
18115 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18116
18117         * decl.cs: Base class for classes, structs and interfaces.  This
18118         is the "Declaration Space" 
18119
18120         * cs-parser.jay: Use CheckDef for checking declaration errors
18121         instead of having one on each function.
18122
18123         * class.cs: Factor out some code for handling error handling in
18124         accordance to the "Declarations" section in the "Basic Concepts"
18125         chapter in the ECMA C# spec.
18126
18127         * interface.cs: Make all interface member classes derive from
18128         InterfaceMemberBase.
18129
18130 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18131
18132         * Many things: all interfaces are parsed and generated in
18133         gen-treedump.  Support for member variables, constructors,
18134         destructors, properties, constants is there.
18135
18136         Beginning of the IL backend, but very little done, just there for
18137         testing purposes. 
18138
18139 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18140
18141         * cs-parser.jay: Fix labeled statement.
18142
18143         * cs-tokenizer.cs (escape): Escape " and ' always.
18144         ref_line, ref_name: keep track of the line/filename as instructed
18145         by #line by the compiler.
18146         Parse #line.
18147
18148 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18149
18150         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18151         to match the values in System.CodeDOM.
18152
18153         Divid renamed to Divide.
18154
18155         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18156         statements. 
18157         (Statements.set): remove.
18158
18159         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18160         statements. 
18161
18162         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18163         falseStatements always have valid values. 
18164
18165         * cs-parser.jay: Use System.CodeDOM now.
18166