renamed to be consistent
[mono.git] / mcs / mcs / ChangeLog
1 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
2
3         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
4         Reduced number of warnings.
5         
6         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
7
8 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
9
10         * driver.cs: Removed message.
11
12         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
13
14 2004-12-08    <vargaz@freemail.hu>
15
16         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
17
18 2004-12-08  Martin Baulig  <martin@ximian.com>
19
20         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
21         instead of a CS3002 for properties and indexer.
22
23 2004-12-08  Martin Baulig  <martin@ximian.com>
24
25         * decl.cs (MemberName.ToString): Make this work again.
26
27 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
28
29         * attribute.cs (Resolve): Add error 591 detection.
30
31         * class.cs (FieldMember.Define): Add error 1547 detection.
32         (Indexer.Define): Add error 620 detection.
33         (Operator.Define): Add error 590 detection.
34
35         * ecore.cs: Missing argument for error 79.
36
37         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
38         detection.
39
40 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
41
42         Fix #70106
43         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
44         only.
45
46 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
47
48         * cs-parser.jay : handle doc comments on implicit/explicit operators.
49           Some operator comments were suppressed.
50         * doc.cs : Implicit/explicit operator name in doc comments are like
51           "op_Explicit(type)~returnType", so added suffix handling.
52
53 2004-12-07  Martin Baulig  <martin@ximian.com>
54
55         * decl.cs
56         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
57         (MemberCore.GetClsCompliantAttributeValue): Likewise.
58         (DeclSpace.ec): New protected field; store the EmitContext here.
59         (DeclSpace.EmitContext): New public property; moved here from
60         `TypeContainer'.
61         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
62         EmitContext.
63
64         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
65         (Enum.Emit): Don't create a new EmitContext.
66
67         * delegate.cs (Delegate.DefineType): Always create the
68         EmitContext.
69
70         * iterators.cs (Iterators.DefineIterator): Create a new
71         EmitContext and store it in `ec'.
72
73 2004-08-24  Martin Baulig  <martin@ximian.com>
74
75         * typemanager.cs
76         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
77         this for accessibility checks.
78         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
79         IsNestedFamilyAccessible.
80         (TypeManager.IsSubclassOf): New method, do what the name actually
81         says.   
82
83 2004-12-06  Raja R Harinath  <rharinath@novell.com>
84
85         Fix crash on cs0657-17.cs.
86         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
87         Use RootContext.Tree.Types, not 'new RootTypes ()'.
88         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
89         the case where the NamespaceEntry gets overwritten.
90
91 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
92
93         Fixed #69195, #56821
94         * ecore.cs (ResolveBoolean): Tiny refactoring.
95
96         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
97         of right expression resolving when left is false constant and
98         operator is LogicalAnd OR true constant and operator is LogicalOr.
99
100         * statement.cs (ResolveUnreachable): Always reports warning.
101
102 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
103
104         * class.cs: Distinguish between 1721 and 1722 (just a little help
105         for the programmer).
106
107 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
108
109         * delegate.cs: Only allow this on new versions of the language. 
110
111 2004-12-02  Duncan Mak  <duncan@ximian.com>
112
113         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
114         Expression class.
115         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
116         here as a static method. Take an additional bool out parameter
117         `must_do_cs1540_check' for signaling to InstanceResolve.
118         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
119         member field from PropertyExpr class and made it an argument of
120         the method instead.
121         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
122         check for MarshalByRefObject, and report CS0122 instead of CS1540.
123         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
124         and `remove_accessor' as well as InstanceResolve: report CS0122
125         where applicable.
126
127         Fixes #70129.
128
129 2004-12-03  Raja R Harinath  <rharinath@novell.com>
130
131         Fix test-327.cs, test-328.cs, and put in early infrastructure
132         for eventually fixing #52697.
133         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
134         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
135         from other methods.
136         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
137         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
138         (VerifyUsing, error246): Update.
139         * rootcontext.cs (RootContext.NamespaceLookup): Just use
140         'NamespaceEntry.LookupNamespaceOrType'.
141
142 2004-12-03  Martin Baulig  <martin@ximian.com>
143
144         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
145         method as our child, call AnonymousMethod.Compatible() on it.
146
147 2004-12-03  Raja R Harinath  <rharinath@novell.com>
148
149         Disable XML documentation support in 'basic' profile.
150         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
151         Redirect XmlElement to System.Object.
152         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
153         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
154         * mcs.exe.sources: Add doc-bootstrap.cs.
155         * doc-bootstrap.cs: New file.  Contains empty stub implementation
156         of doc.cs.
157
158 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
159
160         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
161           comments are allowed.
162
163 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
164
165         * delegate.cs: Add checks for subtypes in paramaters and return values
166         in VerifyMethod () to add support for Covariance/Contravariance
167         in delegates.
168         
169 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
170
171         * report.cs: Remove extra closing parenthesis.
172
173         * convert.cs (Error_CannotImplicitConversion): If the name of the
174         types are the same, provide some extra information.
175
176         * class.cs (FieldBase): Use an unused bit field from the field to
177         encode the `has_offset' property from the FieldMember.  This saves
178         a couple of Ks on bootstrap compilation.
179
180         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
181         method as our child, return the AnonymousMethod resolved
182         expression.
183
184         * expression.cs (New.DoResolve): Allow return values from
185         NewDelegate to also include AnonymousMethods.
186
187         Fixes #70150.
188
189 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
190
191         Fix bug #70102
192         * attribute.cs (Resolve): Improved implementation of params
193         attribute arguments.
194
195         * support.cs (ParameterData): Add HasParams to be faster.
196
197 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
198
199         all things are for /doc support:
200
201         * doc.cs: new file that supports XML documentation generation.
202         * mcs.exe.sources: added doc.cs.
203         * driver.cs:
204           Handle /doc command line option.
205           Report error 2006 instead of 5 for missing file name for /doc.
206           Generate XML documentation when required, after type resolution.
207         * cs-tokenizer.cs:
208           Added support for picking up documentation (/// and /** ... */),
209           including a new XmlCommentState enumeration.
210         * cs-parser.jay:
211           Added lines to fill Documentation element for field, constant,
212           property, indexer, method, constructor, destructor, operator, event
213           and class, struct, interface, delegate, enum.
214           Added lines to warn incorrect comment.
215         * rootcontext.cs :
216           Added Documentation field (passed only when /doc was specified).
217         * decl.cs:
218           Added DocComment, DocCommentHeader, GenerateDocComment() and
219           OnGenerateDocComment() and some supporting private members for
220           /doc feature to MemberCore.
221         * class.cs:
222           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
223         * delegate.cs:
224           Added overriden DocCommentHeader.
225         * enum.cs:
226           Added overriden DocCommentHeader and GenerateDocComment().
227
228 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
229
230         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
231         unwrapping the enumeration values, chain to
232         DoConstantNumericPromotions again, so we can promote things to the
233         fundamental types (takes care of enums that are bytes, sbytes).
234
235         Fixes bug #62054.
236
237 2004-12-01  Raja R Harinath  <rharinath@novell.com>
238
239         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
240         Fix long-standing bug in type-lookup.  Use FindType instead of
241         LookupType when ec.ResolvingTypeTree.
242         (Attribute.ResolveType, Attribute.Resolve)
243         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
244         Update to changes.
245         (Attributes.Search): Remove internal version.  Update.
246         (Attributes.SearchMulti): Update.
247         (Attributes.GetClsCompliantAttribute): Remove.
248         (Attributes.GetIndexerNameAttribute): Remove.
249         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
250         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
251         * class.cs (Indexer.Define): Likewise.
252
253 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
254
255         Fix bug #68790
256         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
257         MarshallByReference members access.
258
259         * expression.cs: Use CheckMarshallByRefAccess;
260         Better error CS0197 message.
261
262         * report.cs: Print whole related error message.
263
264 2004-11-30  Raja R Harinath  <rharinath@novell.com>
265
266         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
267         the current directory to help debugging.
268
269 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
270
271         * class (GetClassBases): Better error 60 report.
272         (EventProperty): Disabled warning 67 detection.
273
274 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
275
276         Fix bug #60324
277         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
278
279         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
280         precise values.
281
282 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
283
284         Fix bug #49488
285         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
286
287         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
288
289 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
290
291         * attribute.cs (Attribute.Resolve): Refine error reporting and
292         report a cs0117 if the identifier does not exist, to distinguish
293         from 0617 which is a miss-use of the actual identifier.
294
295         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
296         between cs0070 and cs0079.
297
298         * class.cs (MemberBase.DoDefine): When reporting a wrong
299         accessibility level, we use MethodCore to compare instead of
300         Method (this was a regression in some refactoring effort).
301
302         So now we correctly report cs0056 again.
303
304         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
305         testing the target_type (which was known to be object_type) and
306         not the source type (which is anonymous_method).
307
308         Fixed reporting of error cs1660.
309
310         * expression.cs (UserCast.Source): Expose the underlying cast.
311
312         * statement.cs (Switch.SwitchGoverningType): Sort the list of
313         allowed types to find a match to int32 first (most common).
314
315         In addition, it ignores any ImplicitUserConversions that did an
316         internal implicit conversion (as the switch statement allows only
317         one integral conversion to exist).
318
319         * class.cs (PartialContainer.Create): rename `name' to
320         `member_name' for clarity.  Then replace the string calls with a
321         call to MemberName.GetPartialName, as now using
322         MemberName.ToString is an error (this is due to the side effects
323         it had, that were fixed in the past).
324
325         This will restore the error reporting on a number of partial class
326         errors that were missusing this (and getting an exception as a
327         results, which is now just a plain textual warning, because
328         yyparse debug output would crash otherwise).
329
330 2004-11-26  Raja R Harinath  <rharinath@novell.com>
331
332         * Makefile (PROGRAM_INSTALL_DIR): Remove.
333
334 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
335
336         * rootcontext.cs (LookupType): Make sure to cache lookups that
337         don't give us a negative result. This saves about 5% of corlib
338         compilation time.
339
340 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
341
342         * report.cs (AbstractMessage.Print): messages are sent to stderr
343
344         * class.cs (TypeContainer.GetClassBases): It is an error to have a
345         non-interface in the list of interfaces (at this point, either
346         parent was properly set, or a base class is being listed in the
347         interfaces section).
348
349         This flags error 1722, and resolves the crash from bug 69259.
350
351 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
352
353         * statement.cs (Using.EmitExpressionFinally): make this work right
354         for valuetypes. Fixes 69926.
355
356 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
357
358         * const.cs (Const.ChangeType): Cope with the "0 literal can be
359         converted to an enum" here, before we try to change the underlying
360         type.  This code exists, but it is a different code path than the
361         one used while encoding constants.
362
363         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
364         old bug: when converting from the null literal to a pointer,
365         return an EmptyCast, not the NullLiteral.
366
367         This fixes #69921, the recent null_type changes probably made this
368         bug more prominent.
369
370         (ImplicitReferenceConversionExists): In addition, resynchronized
371         the code here, so it matches the same code in
372         ImplicitReferenceConversionExists for the `from any class-type S
373         to any interface-type T'.
374         
375
376 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
377
378         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
379
380 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
381
382         * cs-parser.jay: Use verbosity accordingly. 
383
384 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
385
386         * expression.cs (Unary.ResolveOperator): Do not report warning;
387         AddressOf reads from variable.
388         
389         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
390
391 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
392
393         Fix bug #69462
394
395         * attribute.cs (Attributable): Removed CheckTargets.
396         (Attributes.Emit): Explicit attribute targets are tested here.
397
398         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
399         not enabled for interfaces.
400
401         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
402         (GetAssemblyName): Ouch next bug there.
403
404 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
405
406         * expression.cs: Error 275 added.
407         
408 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
409
410         Fix bug #69177 (Implemented decimal constant support)
411
412         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
413         (BinaryFold): Add DecimalConstant.
414
415         * const.cs (Define): Decimal constant 
416         (is not constant.
417         (ChangeType): Add decimal type handling.
418         (LookupConstantValue): Don't set value for decimal type but
419         emit DecimalConstantAttribute. Needed for constant optimization.
420
421         * constant.cs (ToDecimal): New method.
422         (ConvertToDecimal): New method.
423         (IntConstant): Implemented ConvertToDecimal.
424         (DecimalConstant.Emit): Emit optimized version for decimals in
425         int range.
426
427         * expression.cs (ResolveOperator): Changed order of constant
428         reduction to work correctly with native types which have
429         overloaded operators.
430         (ResolveMemberAccess): Extract constant value from attribute
431         for decimal type.
432
433         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
434
435         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
436         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
437         (ChangeType): Decimal is special.
438         (TypeToCoreType): Add decimal type.
439
440 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
441
442         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
443         decimal types.
444
445 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
446
447         * class.cs (EventField.ApplyAttributeBuilder): Fix error
448         test cs1667-5.cs.
449
450 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
451
452         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
453
454         * pending.cs (PendingImplementation): Grab only interfaces.
455
456 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
457
458         * statement.cs (ForeachHelperMethods): Add location member and
459         error 202 detection.
460
461 2004-11-19  Raja R Harinath  <rharinath@novell.com>
462
463         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
464         automatically handled by executable.make.
465         (PROGRAM): Make profile-specific.
466
467 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
468
469         * expression.cs (DoResolveBase): Fixed wrong warning for out
470         variables.
471
472 2004-11-18  Martin Baulig  <martin@ximian.com>
473
474         Merged latest changes into gmcs.  Please keep this comment in
475         here, it makes it easier for me to see what changed in MCS since
476         the last time I merged.
477
478 2004-11-17  Raja R Harinath  <rharinath@novell.com>
479
480         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
481         (TypeHandle.GetMemberCache): New.
482         (TypeHandle.TypeHandle): Update.
483         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
484         (TypeManager.LookupParentInterfacesCache):
485         Rename from LookupInterfaceCache.  Optimize slightly.
486         (TypeManager.MemberLookup_FindMembers): Update.
487         * decl.cs (MemberCache.MemberCache): Set Container to null in the
488         multi-type variant.
489         (AddCacheContents): Rename from AddHashtable.
490         * class.cs (TypeContainer.parent_container): Remove.
491         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
492         (TypeContainer.DoDefineMembers): Don't initialize it.
493         Update to name changes.
494         
495 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
496
497         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
498         that factors the code to check access modifiers on override.  
499
500         (PropertyBase): Use the code here.
501
502         Patch from Lluis S'anchez, fixes bug #69361.
503
504 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
505
506         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
507         routine that is used to report the use of a captured variable
508         whose address has been taken.
509
510         There are two checks: one when variables are being captured and
511         the other check is when the address of a variable is taken. 
512         
513         (because an anonymous methods might be resolved before *or* after
514         the address has been taken) and 
515
516         * expression.cs (Conditional.DoResolve): Remove the special
517         casing that Martin added to trueExpr and falseExpr being both
518         NullLiteral.  We get the right behavior now just by introducing
519         the null_type into the compiler. 
520
521         * convert.cs (ExplicitConversion): Change the code to use
522         null_type instead of testing `expr is NullLiteral'.
523         (ImplicitConversionStandard): use null_type too.
524         (ImplicitReferenceConversionExists): use null_type too.
525         (ImplicitReferenceConversion): use null_type too.
526
527         * literal.cs: The type of `NullLiteral' is now null_type instead
528         of object_type. 
529         (Resolve): Set the type here.
530
531         * typemanager.cs: Introduce null_type.
532
533 2004-11-17  Martin Baulig  <martin@ximian.com>
534
535         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
536         direction, like FindMembers() does.  Fixes #69546, testcase is in
537         test-315.cs.    
538
539 2004-11-16  Martin Baulig  <martin@ximian.com>
540
541         This is based on a patch from Marek Safar, see bug #69082.
542         Fixes bugs #63705 and #67130.
543
544         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
545         method; create a MemberCache for an interface type and cache the
546         result.
547
548         * decl.cs (IMemberContainer.ParentContainer): Removed.
549         (IMemberContainer.ParentCache): New property.
550         (MemberCache.SetupCacheForInterface): Removed.
551         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
552         to create a cache for an interface's "parent".
553
554         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
555         interfaces too.
556
557 2004-11-16  Martin Baulig  <martin@ximian.com>
558
559         Merged back from gmcs; these changes already went into gmcs a
560         couple of weeks ago.
561
562         * typemanager.cs
563         (TypeManager.AddUserType): Removed the `ifaces' argument.
564         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
565         `TypeExpr []'.
566         (TypeManager.AddUserInterface): Removed.
567         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
568         `TypeExpr []'.
569         (TypeManager.GetInterfaces): Likewise.
570         (TypeManager.GetExplicitInterfaces): Likewise.
571
572         * ecore.cs (TypeExpr.GetInterfaces): Removed.
573
574         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
575         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
576
577 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
578
579         * statement.cs: Avoid adding bools to a hashtable.
580
581 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
582
583         * expression.cs (Invocation.OverloadResolve): Flag error if we are
584         calling an unsafe method from a safe location.
585
586 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
587
588         Fix #69167
589         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
590
591 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
592
593         * namespace.cs (VerifyUsing): use GetPartialName instead of
594         ToString. 
595
596 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
597
598         * statement.cs (Return.Resolve): Fix regression in typo: if
599         `in_exc', we have to request a NeedReturnLabel, this was a typo
600         introduced in the anonymous method check-in.  Fixes #69131.
601
602         * Indexers were using the ShortName when defining themselves,
603         causing a regression in the compiler bootstrap when applying the
604         patch from 2004-11-02 (first part), now they use their full name
605         and the bug is gone.
606
607 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
608
609         * driver.cs: Strip the path from the names of embedded resources. Fixes
610         #68519.
611
612 2004-11-04  Raja R Harinath  <rharinath@novell.com>
613
614         Fix error message regression: cs0104-2.cs.
615         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
616         (AliasEntry.Resolve): Update.
617         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
618         'silent' flag.
619         (RootContext.LookupType): Update.
620
621 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
622
623         * cs-parser.jay: Add support for handling accessor modifiers
624         * class: Add support port accessor modifiers and error checking,
625         define PropertyMethod.Define as virtual (not abstract anymore)
626         * ecore.cs: Add checking for proeprties access with access modifiers
627         * iterators.cs: Modify Accessor constructor call based in the modified
628         constructor
629 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
630
631         * expression.cs (StringConcat): Handle being called twice,
632         as when we have a concat in a field init with more than two
633         ctors in the class
634
635 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
636
637         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
638         special case explicit implementations, we should always produce
639         the .property or .event declaration.
640         
641         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
642         since it will not return correct data if people use this
643         unresolved in the presence of using statements (see test-313).
644
645         * class.cs (MethodData.Define): If we are an explicit interface
646         implementation, set the method name to the full name of the
647         interface plus the name of the method.  
648
649         Notice that using the method.MethodName.GetFullName() does not
650         work, as it will only contain the name as declared on the source
651         file (it can be a shorthand in the presence of using statements)
652         and not the fully qualifed type name, for example:
653
654         using System;
655
656         class D : ICloneable {
657                 object ICloneable.Clone ()  {
658                 }
659         }
660
661         Would produce a method called `ICloneable.Clone' instead of
662         `System.ICloneable.Clone'.
663
664         * namespace.cs (Alias.Resolve): Use GetPartialName.
665         
666 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
667
668         * cs-parser.jay: Add error 1055 report.
669
670 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
671
672         * assign.cs (Assign.DoResolve): Only do the transform of
673         assignment into a New if the types are compatible, if not, fall
674         through and let the implicit code deal with the errors and with
675         the necessary conversions. 
676
677 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
678
679         * cs-parser.jay: Add error 1031 report.
680
681         * cs-tokenizer.cs: Add location for error 1038.
682
683 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
684
685         * cs-parser.jay: Add error 1016 report.
686
687 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
688
689         * cs-parser.jay: Add errors 1575,1611 report.
690
691 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
692
693         * cs-parser.jay: Add error 1001 report.
694
695 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
696
697         Fix #68850
698         * attribute.cs (GetMarshal): Add method argument for
699         caller identification.
700
701         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
702         agument for GetMarshal and RuntimeMissingSupport.
703
704 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
705
706         * attribute.cs (ExtractSecurityPermissionSet): Removed
707         TypeManager.code_access_permission_type.
708
709         * typemanager.cs: Removed TypeManager.code_access_permission_type.
710
711 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
712
713         * expression.cs (LocalVariableReference.DoResolveLValue): Check
714         for obsolete use of a variable here.   Fixes regression on errors
715         cs0619-25 and cs0619-26.
716
717 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
718
719         Fix #62358, implemented security attribute encoding.
720
721         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
722         Tests permitted SecurityAction for assembly or other types.
723         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
724         data from SecurityPermissionAttribute to PermisionSet class.
725
726         * class.cs (ApplyAttributeBuilder): Added special handling
727         for System.Security.Permissions.SecurityAttribute based types.
728
729         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
730         special handling for System.Security.Permissions.SecurityAttribute
731         based types.
732
733         * enum.cs (ApplyAttributeBuilder): Added special handling
734         for System.Security.Permissions.SecurityAttribute based types.
735
736         * parameter.cs (ApplyAttributeBuilder): Added special handling
737         for System.Security.Permissions.SecurityAttribute based types.
738
739         * rootcontext.cs: Next 2 core types.
740
741         * typemanager.cs (TypeManager.security_permission_attr_type):
742         Built in type for the SecurityPermission Attribute.
743         (code_access_permission_type): Build in type.
744
745 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
746
747         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
748         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
749         all of this information into
750         EmitContext.EmitCapturedVariableInstance.
751         
752         * codegen.cs (EmitCapturedVariableInstance): move here the
753         funcionality of emitting an ldarg.0 in the presence of a
754         remapping.   This centralizes the instance emit code.
755
756         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
757         then emit a load of this: it means that we have reached the
758         topmost ScopeInfo: the one that contains the pointer to the
759         instance of the class hosting the anonymous method.
760
761         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
762         captures to the topmost CaptureContext.
763
764 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
765
766         * expression.cs (LocalVariableReference): Move the knowledge about
767         the iterators into codegen's EmitCapturedVariableInstance.
768
769 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
770
771         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
772         all code paths return a value from an anonymous method (it is the
773         same as the 161 error, but for anonymous methods).
774
775 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
776
777         The introduction of anonymous methods in the compiler changed
778         various ways of doing things in the compiler.  The most
779         significant one is the hard split between the resolution phase
780         and the emission phases of the compiler.
781
782         For instance, routines that referenced local variables no
783         longer can safely create temporary variables during the
784         resolution phase: they must do so from the emission phase,
785         since the variable might have been "captured", hence access to
786         it can not be done with the local-variable operations from the runtime.
787         
788         * statement.cs 
789
790         (Block.Flags): New flag `IsTopLevel' to indicate that this block
791         is a toplevel block.
792
793         (ToplevelBlock): A new kind of Block, these are the blocks that
794         are created by the parser for all toplevel method bodies.  These
795         include methods, accessors and anonymous methods.
796
797         These contain some extra information not found in regular blocks:
798         A pointer to an optional CaptureContext (for tracking captured
799         local variables and parameters).  A pointer to the parent
800         ToplevelBlock.
801         
802         (Return.Resolve): Catch missmatches when returning a value from an
803         anonymous method (error 1662).
804         Invoke NeedReturnLabel from the Resolve phase instead of the emit
805         phase.
806
807         (Break.Resolve): ditto.
808
809         (SwitchLabel): instead of defining the labels during the
810         resolution phase, we now turned the public ILLabel and ILLabelCode
811         labels into methods called GetILLabelCode() and GetILLabel() that
812         only define the label during the Emit phase.
813
814         (GotoCase): Track the SwitchLabel instead of the computed label
815         (its contained therein).  Emit the code by using
816         SwitchLabel.GetILLabelCode ().
817
818         (LocalInfo.Flags.Captured): A new flag has been introduce to track
819         whether the Local has been captured or not.
820
821         (LocalInfo.IsCaptured): New property, used to tell whether the
822         local has been captured.
823         
824         * anonymous.cs: Vastly updated to contain the anonymous method
825         support.
826
827         The main classes here are: CaptureContext which tracks any
828         captured information for a toplevel block and ScopeInfo used to
829         track the activation frames for various local variables.   
830
831         Each toplevel block has an optional capture context associated
832         with it.  When a method contains an anonymous method both the
833         toplevel method and the anonymous method will create a capture
834         context.   When variables or parameters are captured, they are
835         recorded on the CaptureContext that owns them, for example:
836
837         void Demo () {
838              int a;
839              MyDelegate d = delegate {
840                  a = 1;
841              }
842         }
843
844         Here `a' will be recorded as captured on the toplevel
845         CapturedContext, the inner captured context will not have anything
846         (it will only have data if local variables or parameters from it
847         are captured in a nested anonymous method.
848
849         The ScopeInfo is used to track the activation frames for local
850         variables, for example:
851
852         for (int i = 0; i < 10; i++)
853                 for (int j = 0; j < 10; j++){
854                    MyDelegate d = delegate {
855                         call (i, j);
856                    }
857                 }
858
859         At runtime this captures a single captured variable `i', but it
860         captures 10 different versions of the variable `j'.  The variable
861         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
862         recorded on a child.  
863
864         The toplevel ScopeInfo will also track information like the `this'
865         pointer if instance variables were referenced (this is necessary
866         as the anonymous method lives inside a nested class in the host
867         type of the method). 
868
869         (AnonymousMethod): Expanded to track the Toplevel, implement
870         `AnonymousMethod.Compatible' to tell whether an anonymous method
871         can be converted to a target delegate type. 
872
873         The routine now also produces the anonymous method content
874
875         (AnonymousDelegate): A helper class that derives from
876         DelegateCreation, this is used to generate the code necessary to
877         produce the delegate for the anonymous method that was created. 
878
879         * assign.cs: API adjustments for new changes in
880         Convert.ImplicitStandardConversionExists.
881
882         * class.cs: Adjustments to cope with the fact that now toplevel
883         blocks are of type `ToplevelBlock'. 
884
885         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
886         insteda of standard blocks.
887
888         Flag errors if params arguments are passed to anonymous methods.
889
890         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
891         `CurrentAnonymousMethod' which points to the current Anonymous
892         Method.  The variable points to the AnonymousMethod class that
893         holds the code being compiled.  It is set in the new EmitContext
894         created for the anonymous method.
895
896         (EmitContext.Phase): Introduce a variable and an enumeration to
897         assist in enforcing some rules about when and where we are allowed
898         to invoke certain methods (EmitContext.NeedsReturnLabel is the
899         only one that enfonces this right now).
900
901         (EmitContext.HaveCaptureInfo): new helper method that returns
902         whether we have a CapturedContext initialized.
903
904         (EmitContext.CaptureVariable): New method used to register that a
905         LocalInfo must be flagged for capturing. 
906
907         (EmitContext.CapturedParameter): New method used to register that a
908         parameters must be flagged for capturing. 
909         
910         (EmitContext.CapturedField): New method used to register that a
911         field must be flagged for capturing. 
912
913         (EmitContext.HaveCapturedVariables,
914         EmitContext.HaveCapturedFields): Return whether there are captured
915         variables or fields. 
916
917         (EmitContext.EmitMethodHostInstance): This is used to emit the
918         instance for the anonymous method.  The instance might be null
919         (static methods), this (for anonymous methods that capture nothing
920         and happen to live side-by-side with the current method body) or a
921         more complicated expression if the method has a CaptureContext.
922
923         (EmitContext.EmitTopBlock): Routine that drives the emission of
924         code: it will first resolve the top block, then emit any metadata
925         and then emit the code.  The split is done so that we can extract
926         any anonymous methods and flag any captured variables/parameters.
927         
928         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
929         during this phase, the ILGenerator should not be used as labels
930         and local variables declared here might not be accessible to any
931         code that is part of an anonymous method.  
932
933         Exceptions to this include the temporary variables that are
934         created by some statements internally for holding temporary
935         variables. 
936         
937         (EmitContext.EmitMeta): New routine, in charge of emitting all the
938         metadata for a cb
939
940         (EmitContext.TemporaryReturn): This method is typically called
941         from the Emit phase, and its the only place where we allow the
942         ReturnLabel to be defined other than the EmitMeta.  The reason is
943         that otherwise we would have to duplicate a lot of logic in the
944         Resolve phases of various methods that today is on the Emit
945         phase. 
946
947         (EmitContext.NeedReturnLabel): This no longer creates the label,
948         as the ILGenerator is not valid during the resolve phase.
949
950         (EmitContext.EmitThis): Extended the knowledge in this class to
951         work in anonymous methods in addition to iterators. 
952
953         (EmitContext.EmitCapturedVariableInstance): This emits whatever
954         code is necessary on the stack to access the instance to a local
955         variable (the variable will be accessed as a field).
956
957         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
958         EmitContext.EmitAddressOfParameter): Routines to support
959         parameters (not completed at this point). 
960         
961         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
962         will also remove the parameters.
963
964         * convert.cs (Convert): Define a `ConstantEC' which points to a
965         null.  This is just to prefity some code that uses
966         ImplicitStandardConversion code and do not have an EmitContext
967         handy.
968
969         The idea is to flag explicitly that at that point in time, it is
970         known that the conversion will not trigger the delegate checking
971         code in implicit conversions (which requires a valid
972         EmitContext). 
973
974         Everywhere: pass new EmitContext parameter since
975         ImplicitStandardConversionExists now requires it to check for
976         anonymous method conversions. 
977
978         (Convert.ImplicitStandardConversionExists): If the type of an
979         expression is the anonymous_method_type, and the type is a
980         delegate, we invoke the AnonymousMethod.Compatible method to check
981         whether an implicit conversion is possible. 
982
983         (Convert.ImplicitConversionStandard): Only do implicit method
984         group conversions if the language level is not ISO_1.
985
986         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
987         MethodInfo for the Invoke method.  used by Delegate and
988         AnonymousDelegate.
989
990         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
991         method conversions if the target type is a delegate.
992
993         Removed extra debugging nops.
994
995         (LocalVariableReference): Turn the `local_info' into a public
996         field. 
997
998         Add `prepared' field, the same hack used for FieldExprs to cope
999         with composed assignments, as Local variables do not necessarily
1000         operate purely on the stack as they used to: they can be captured
1001         fields. 
1002
1003         Add `temp' for a temporary result, like fields.
1004
1005         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1006
1007         It now copes with Local variables that are captured and emits the
1008         proper instance variable to load it from a field in the captured
1009         case. 
1010
1011         (ParameterReference.DoResolveBase): During the resolve phase,
1012         capture parameters if we are in an anonymous method.
1013
1014         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1015         anonymous method, use the EmitContext helper routines to emit the
1016         parameter reference.
1017
1018         * iterators.cs: Set RemapToProxy to true/false during the
1019         EmitDispose class.
1020
1021         * parameters.cs (GetParameterByName): New helper method. 
1022
1023         * typemanager.cs (anonymous_method_type) a new type that
1024         represents an anonyous method.  This is always an internal type,
1025         used as a fencepost to test against the anonymous-methodness of an
1026         expression. 
1027         
1028 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1029
1030         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1031         561 report.
1032         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1033
1034 2004-10-18  Martin Baulig  <martin@ximian.com>
1035
1036         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1037         `Type' directly, but call ResolveType() on it.
1038         (Catch.Resolve): Likewise.
1039         (Foreach.Resolve): Likewise.
1040
1041 2004-10-18  Martin Baulig  <martin@ximian.com>
1042
1043         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1044         `Type' directly, but call ResolveType() on it.
1045         (Probe.DoResolve): Likewise.
1046         (ArrayCreation.LookupType): Likewise.
1047         (TypeOf.DoResolve): Likewise.
1048         (SizeOf.DoResolve): Likewise.
1049
1050 2004-10-18  Martin Baulig  <martin@ximian.com>
1051
1052         * expression.cs (Invocation.BetterFunction): Put back
1053         TypeManager.TypeToCoreType().
1054
1055 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1056
1057         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1058         the ResolveType.
1059
1060 2004-10-18  Martin Baulig  <martin@ximian.com>
1061
1062         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1063         `Type' directly, but call ResolveType() on it.
1064
1065 2004-10-18  Martin Baulig  <martin@ximian.com>
1066
1067         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1068         `Type' directly, but call ResolveType() on it.
1069         (MemberBase.DoDefine): Likewise.
1070
1071         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1072         `Type' directly, but call ResolveType() on it.
1073         (ComposedCast.DoResolveAsTypeStep): Likewise.
1074
1075         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1076         `Type' directly, but call ResolveType() on it.
1077
1078 2004-10-17  John Luke  <john.luke@gmail.com>
1079
1080         * class.cs (Operator.GetSignatureForError): use CSharpName
1081
1082         * parameter.cs (Parameter.GetSignatureForError): Returns
1083         correct name even if was not defined.
1084
1085 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1086
1087         Fix #65816.
1088         * class.cs (TypeContainer.EmitContext): New property.
1089         (DefineNestedTypes): Create an emitcontext for each part.
1090         (MethodCore.DoDefineParameters): Use container's emitcontext.
1091         Pass type array to InternalParameters.
1092         (MemberBase.DoDefine): Use container's emitcontext.
1093         (FieldMember.Define): Likewise.
1094         (Event.Define): Likewise.
1095         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1096         Pass type array to InternalParameters.
1097         (SetIndexerMethod.GetParameterInfo): Likewise.
1098         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1099         * delegate.cs (Define): Pass emitcontext to
1100         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1101         array to InternalParameters.
1102         * expression.cs (ParameterReference.DoResolveBase): Pass
1103         emitcontext to GetParameterInfo.
1104         (ComposedCast.DoResolveAsTypeStep): Remove check on
1105         ec.ResolvingTypeTree.
1106         * parameter.cs (Parameter.Resolve): Change argument to
1107         EmitContext.  Use ResolveAsTypeTerminal.
1108         (Parameter.GetSignature): Change argument to EmitContext.
1109         (Parameters.ComputeSignature): Likewise.
1110         (Parameters.ComputeParameterTypes): Likewise.
1111         (Parameters.GetParameterInfo): Likewise.
1112         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1113         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1114         * support.cs (InternalParameters..ctor): Remove variant that takes
1115         a DeclSpace.
1116         * typemanager.cs (system_intptr_expr): New.
1117         (InitExpressionTypes): Initialize it.
1118
1119 2004-10-12  Chris Toshok  <toshok@ximian.com>
1120
1121         * cs-parser.jay: fix location for try_statement and catch_clause.
1122
1123 2004-10-11  Martin Baulig  <martin@ximian.com>
1124
1125         * report.cs: Don't make --fatal abort on warnings, we have
1126         -warnaserror for that.
1127
1128 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1129
1130         More DeclSpace.ResolveType avoidance.
1131         * decl.cs (MemberCore.InUnsafe): New property.
1132         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1133         with newly created EmitContext.
1134         (FieldMember.Define): Likewise.
1135         * delegate.cs (Delegate.Define): Likewise.
1136         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1137         only if normal name-lookup fails.
1138         (TypeExpr.DoResolve): Enable error-checking.
1139         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1140         (SizeOf.DoResolve): Likewise.
1141         (ComposedCast.DoResolveAsTypeStep): Likewise.
1142         (StackAlloc.DoResolve): Likewise.
1143         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1144         (Block.Unsafe): New property.
1145         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1146         (Unsafe): Set 'unsafe' flag of contained block.
1147         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1148         (Fixed.Resolve): Likewise.
1149         (Catch.Resolve): Likewise.
1150         (Using.ResolveLocalVariableDecls): Likewise.
1151         (Foreach.Resolve): Likewise.
1152
1153 2004-10-05  John Luke <john.luke@gmail.com>
1154
1155         * cs-parser.jay: add location to error CS0175
1156
1157 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1158
1159         * ecore.cs (Expression.Constantity): Add support for turning null
1160         into a constant.
1161
1162         * const.cs (Const.Define): Allow constants to be reference types
1163         as long as the value is Null.
1164
1165 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1166
1167         * namespace.cs (NamespaceEntry.Using): No matter which warning
1168         level is set, check if this namespace name has already been added.
1169
1170 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1171
1172         * expression.cs: reftype [!=]= null should always use br[true,false].
1173         # 67410
1174
1175 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1176
1177         Fix #67108
1178         * attribute.cs: Enum conversion moved to 
1179         GetAttributeArgumentExpression to be applied to the all
1180         expressions.
1181
1182 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1183
1184         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1185         * class.c (TypeContainer.DefineType): Flag error if
1186         base types aren't accessible due to access permissions.
1187         * decl.cs (DeclSpace.ResolveType): Move logic to
1188         Expression.ResolveAsTypeTerminal.
1189         (DeclSpace.ResolveTypeExpr): Thin layer over
1190         Expression.ResolveAsTypeTerminal.
1191         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1192         Refactor code into NestedAccess.  Use it.
1193         (DeclSpace.NestedAccess): New.
1194         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1195         argument to silence errors.  Check access permissions.
1196         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1197         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1198         (Cast.DoResolve): Likewise.
1199         (New.DoResolve): Likewise.
1200         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1201         (TypeOf.DoResolve): Likewise.
1202
1203         * expression.cs (Invocation.BetterConversion): Return the Type of
1204         the better conversion.  Implement section 14.4.2.3 more faithfully.
1205         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1206         section 14.4.2.2 explicit.
1207         (Invocation.OverloadResolve): Update.
1208         (Invocation): Remove is_base field.
1209         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1210         (Invocation.Emit): Likewise.
1211
1212 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1213
1214         * README: Update to changes.
1215
1216 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1217
1218         * cs-parser.jay: Reverted 642 warning fix.
1219
1220 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1221
1222         Fix bug #66615
1223         * decl.cs (FindMemberWithSameName): Indexer can have more than
1224         1 argument.
1225
1226 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1227
1228         * expression.cs (LocalVariableReference.DoResolveLValue):
1229         Do not report warning 219 for out values.
1230         (EmptyExpression.Null): New member to avoid extra allocations.
1231
1232 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1233
1234         * cs-parser.jay: Fix wrong warning 642 report.
1235
1236         * cs-tokenizer.cs (CheckNextToken): New helper;
1237         Inspect next character if is same as expected.
1238
1239 2004-09-23  Martin Baulig  <martin@ximian.com>
1240
1241         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1242         (Convert.ImplicitReferenceConversionExists): Likewise.
1243
1244 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1245
1246         * class.cs (Operator.Define): Add error 448 and 559 report.
1247
1248 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1249
1250         * class.cs (MemberBase.IsTypePermitted): New protected
1251         method for checking error CS0610.
1252
1253 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1254
1255         * class.cs (TypeContainer.HasExplicitLayout): New property
1256         Returns whether container has StructLayout attribute set Explicit.
1257         (FieldMember): New abstract class for consts and fields.
1258         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1259         (Field): Reuse FieldMember.
1260
1261         * const.cs (Const): Reuse FieldMember.
1262
1263         * rootcontext.cs: EmitConstants call moved to class.
1264
1265 2004-09-22  Martin Baulig  <martin@ximian.com>
1266
1267         Thanks to Peter Sestoft for this bug report.
1268
1269         * expression.cs (Conditional): If both the `trueExpr' and the
1270         `falseExpr' is a NullLiteral, return a NullLiteral.
1271
1272 2004-09-22  Martin Baulig  <martin@ximian.com>
1273
1274         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1275         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1276         for the "get_Current" call.
1277
1278 2004-09-22  Martin Baulig  <martin@ximian.com>
1279
1280         Marek and me just fixed one of our oldest bugs: #28562 :-)
1281
1282         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1283
1284         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1285         we're an EnumConstant, just return that.
1286         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1287         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1288         to get the value which'll actually be written into the attribute.
1289         However, we have to use GetValue() to access the attribute's value
1290         in the compiler.        
1291
1292 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1293
1294         * constant.cs (Constant.IsNegative): New abstract property
1295         IsNegative.
1296
1297         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1298         (StackAlloc.DoResolve): Reused IsNegative.
1299
1300 2004-09-21  Martin Baulig  <martin@ximian.com>
1301
1302         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1303         if we're used in an iterator, we may be called from different
1304         methods.
1305
1306         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1307         we actually have an exception block.
1308
1309 2004-09-20  John Luke <jluke@cfl.rr.com>
1310
1311         * class.cs, cs-parser.jay: Improve the error report for 1520:
1312         report the actual line where the error happens, not where the
1313         class was declared.
1314
1315         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1316         Pass location information that was available elsewhere.
1317
1318 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1319
1320         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1321         runtime to delay sign assemblies.
1322
1323 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1324
1325         * cs-parser.jay: Do not report the stack trace, this is barely
1326         used nowadays.
1327
1328 2004-08-22  John Luke  <john.luke@gmail.com>
1329  
1330         * driver.cs : check that a resource id is not already used
1331         before adding it, report CS1508 if it is, bug #63637
1332
1333 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1334
1335         * ecore.cs: Removed dead code.
1336
1337 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1338
1339         * class.cs: Do not report warning CS0067 on the interfaces.
1340
1341 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1342
1343         * cs-parser.jay: Add error 504 report.
1344
1345 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1346
1347         * rootcontext.cs: WarningLevel is 4 by default now.
1348
1349         * statement.cs (Fixed.Resolve): Do not null
1350         VariableInfo.
1351
1352 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1353
1354         Fixed bug #55780
1355         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1356         deep search when property is not virtual.
1357         (PropertyExpr.ResolveAccessors): Make one call for both
1358         accessors.
1359
1360 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1361
1362         Fixed bug #65766
1363         * statement.cs: Error 152 report constains also location.
1364
1365 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1366
1367         Fixed bug #65766
1368         * const.cs: Explicitly set constant as static.
1369
1370 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1371
1372         Fixed bug #64226
1373         * cs-parser.jay: Add error 1017 report.
1374
1375 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1376
1377         Fixed bug #59980, #64224
1378         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1379
1380         * typemanager.cs (IsSpecialMethod): Simplified
1381
1382 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1383
1384         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1385         condition with better params.
1386
1387 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1388
1389         Fixed bug #65238
1390         * attribute.cs (Resolve): Property has to have both
1391         accessors.
1392
1393 2004-09-14  Martin Baulig  <martin@ximian.com>
1394
1395         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1396
1397 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1398
1399         Fixed bug #61902
1400         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1401         called and is obsolete then this member suppress message
1402         when call is inside next [Obsolete] method or type.
1403
1404         * expression.cs: Use TestObsoleteMethodUsage member.
1405
1406 2004-09-14  Martin Baulig  <martin@ximian.com>
1407
1408         * cs-parser.jay: Sync a bit with the GMCS version.
1409
1410 2004-09-14  Martin Baulig  <martin@ximian.com>
1411
1412         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1413         (CSharpParser.yacc_verbose_flag): New public field.
1414
1415         * genericparser.cs: Removed.
1416
1417 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1418
1419         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1420
1421 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1422
1423         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1424
1425 2004-09-10  Martin Baulig  <martin@ximian.com>
1426
1427         Backported my MemberName changes from GMCS into MCS.
1428
1429         - we are now using a special `MemberName' class instead of using
1430         strings; in GMCS, the `MemberName' also contains the type
1431         arguments.
1432
1433         - changed the grammar rules a bit:
1434           * the old `member_name' is now a `namespace_or_type_name':
1435             The rule is that we use `namespace_or_type_name' everywhere
1436             where we expect either a "member name" (GetEnumerator) or a
1437             "member name" with an explicit interface name
1438             (IEnumerable.GetEnumerator).
1439             In GMCS, the explicit interface name may include type arguments
1440             (IEnumerable<T>.GetEnumerator).
1441           * we use `member_name' instead of just `IDENTIFIER' for
1442             "member names":
1443             The rule is that we use `member_name' wherever a member may
1444             have type parameters in GMCS.       
1445
1446         * decl.cs (MemberName): New public class.
1447         (MemberCore.MemberName): New public readonly field.
1448         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1449         (DeclSpace): Likewise.
1450
1451         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1452         * enum.cs (Enum.ctor): Likewise.
1453
1454         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1455         MemberName.     
1456         (AliasEntry.ctor): Take a MemberName, not an Expression.
1457         (AliasEntry.UsingAlias): Likewise.
1458
1459         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1460         (IMethodData.MemberName): Changed type from string to MemberName.
1461         (MemberBase.ExplicitInterfaceName): Likewise.
1462         (AbstractPropertyEventMethod.SetupName): Make this private.
1463         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1464         argument; compute the member name here.
1465         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1466         on the `member.MemberName' and the `prefix'.
1467
1468         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1469         not `type_name'.
1470         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1471         thus, we get a `MemberName' instead of a `string'.  These
1472         declarations may have type parameters in GMCS.
1473         (interface_method_declaration, delegate_declaration): Likewise.
1474         (class_declaration, interface_declaration): Likewise.
1475         (method_header): Use `namespace_or_type_name' instead of
1476         `member_name'.  We may be an explicit interface implementation.
1477         (property_declaration, event_declaration): Likewise.
1478         (member_name): This is now just an `IDENTIFIER', not a
1479         `namespace_or_type_name'.
1480         (type_name, interface_type): Removed.
1481         (namespace_or_type_name): Return a MemberName, not an Expression.
1482         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1483         call GetTypeExpression() on the MemberName to get an expression.
1484         (IndexerDeclaration.interface_type): Changed type from string to
1485         MemberName.
1486         (MakeName): Operate on MemberName's instead of string's.
1487
1488 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1489
1490         Fix bug #55770.
1491         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1492         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1493         lookup to avoid symbols introduced by 'using'.
1494         * rootcontext.cs (NamespaceLookup): Update.
1495
1496 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1497
1498         * class.cs (TypeContainer.DoDefineMembers): Do not call
1499         DefineDefaultConstructor for static classes.
1500
1501 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1502
1503         * attribute.cs (Attribute.Resolve): Add error 653 report.
1504
1505         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1506         report.
1507         (Method.ApplyAttributeBuilder): Add error 685 report.
1508         (Operator.Define): Add error 564 report.
1509
1510         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1511
1512         * expression.cs (Invocation.DoResolve): Add error
1513         245 and 250 report.
1514
1515         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1516         error 674 report.
1517
1518 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1519
1520         * class.cs (ConstructorInitializer.Resolve):
1521         Wrong error number (515->516).
1522
1523 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1524
1525         * class.cs (Indexer.Define): Add error 631 report.
1526
1527 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1528
1529         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1530
1531 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1532
1533         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1534
1535 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1536
1537         * cs-parser.jay: Added error CS0241 report.
1538
1539 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1540
1541         * cs-parser.jay (fixed_statement): Introduce a scope for the
1542         declaration in the 'fixed' statement.
1543
1544 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1545
1546         * cs-parser.jay: Added CS0230 error report.
1547
1548 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1549
1550         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1551
1552 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1553
1554         * expression.cs (Argument.Resolve): Added error CS0192 and
1555         CS0199 report.
1556
1557 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1558
1559         C# 2.0 #pragma warning feature
1560
1561         * cs-tokenizer.cs (PreProcessPragma): New method; 
1562         Handles #pragma directive.
1563
1564         * report.cs (WarningRegions): New class; Support
1565         class for #pragma warning directive. It tests whether
1566         warning is enabled for a given line.
1567
1568 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1569
1570         * const.cs: Add more descriptive error report, tahnks to
1571         Sebastien. 
1572
1573 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1574
1575         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1576
1577 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1578
1579         * expression.cs: Apply patch from Ben: Remove dead code from
1580         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1581         as that code just threw an exception anwyays.
1582
1583         * const.cs: Remove the call to the turnintoconstant, for details
1584         see bug: #63144
1585         
1586         * literal.cs: The type of the null-literal is the null type;  So
1587         we use a placeholder type (literal.cs:System.Null, defined here)
1588         for it.
1589
1590         * expression.cs (Conditional.DoResolve): Remove some old code that
1591         is no longer needed, conversions have been fixed.
1592
1593         (ArrayCreationExpression.DoResolve): Return false if we fail to
1594         resolve the inner expression.
1595
1596 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1597
1598         Fix test-290.cs.
1599         * cs-parser.jay (delegate_declaration): Record a delegate
1600         declaration as a type declaration.
1601         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1602
1603 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1604
1605         * parameter.cs: Do not crash if the type can not be resolved. 
1606
1607         * expression.cs: Report errors with unsafe pointers, fixes #64896
1608
1609 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1610
1611         * expression.cs: Pointer arith always needs to do a conv.i
1612         if the operand is a long. fix 65320
1613
1614 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1615
1616         Fixed cs0619-37.cs, cs0619-38.cs
1617
1618         * enum.cs (GetObsoleteAttribute): Removed.
1619
1620         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1621         on Enum member is double staged. The first is tested member
1622         and then enum.
1623
1624 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1625
1626         Fixed #56986, #63631, #65231
1627
1628         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1629         adds member to name container.
1630         (TypeContainer.AddToTypeContainer): New method, adds type to
1631         name container.
1632         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1633         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1634         AddOperator): Simplified by reusing AddToMemberContainer.
1635         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1636         instead of field.
1637         (Method.CheckForDuplications): Fixed implementation to test all
1638         possibilities.
1639         (MemberBase): Detection whether member is explicit interface
1640         implementation is now in constructor.
1641         (MemberBase.UpdateMemberName): Handles IndexerName.
1642         (Accessor): Changed to keep also location information.
1643         (AbstractPropertyEventMethod): Is derived from MemberCore.
1644         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1645         will be emited or not.
1646         (PropertyBase.AreAccessorsDuplicateImplementation):
1647         Tests whether accessors are not in collision with some method.
1648         (Operator): Is derived from MethodCore to simplify common
1649         operations.
1650
1651         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1652         must be performed.
1653         (DeclSpace.AddToContainer): Adds the member to defined_names
1654         table. It tests for duplications and enclosing name conflicts.
1655
1656         * enum.cs (EnumMember): Clean up to reuse the base structures
1657
1658 2004-09-03  Martin Baulig  <martin@ximian.com>
1659
1660         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1661         into TypeContainer, to make partial classes work again.
1662
1663 2004-09-03  Martin Baulig  <martin@ximian.com>
1664
1665         * rootcontext.cs (RootContext.V2): Removed.
1666
1667 2004-03-23  Martin Baulig  <martin@ximian.com>
1668
1669         * expression.cs (Invocation.OverloadResolve): Added `bool
1670         may_fail' argument and use it instead of the Location.IsNull() hack.
1671
1672 2004-09-03  Martin Baulig  <martin@ximian.com>
1673
1674         Merged latest changes into gmcs.  Please keep this comment in
1675         here, it makes it easier for me to see what changed in MCS since
1676         the last time I merged.
1677
1678 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1679
1680         Fix #61128.
1681         * expression.cs (BetterConversion): Don't allow either conversion 
1682         to be null.  Remove redundant implicit conversion test when 'q ==
1683         null' -- when this function is invoked, we already know that the
1684         implicit conversion exists.
1685         (BetterFunction): Assume that 'best' is non-null.  Remove
1686         redundant reimplementation of IsApplicable when 'best' is null.
1687         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1688         number of arguments.
1689         (IsAncestralType): Extract from OverloadResolve.
1690         (OverloadResolve): Make robust to the MethodGroupExpr being
1691         unsorted.  Implement all the logic of Section 14.5.5.1, and
1692         support overloading of methods from multiple applicable types.
1693         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1694
1695         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1696         (RealError, Warning): Append type of report to related symbol.
1697
1698 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1699
1700         * enum.cs: Fixed CLS-Compliance checks for enum members.
1701         Error tests cs3008-8.cs, cs3014-8.cs
1702
1703 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1704
1705         Fixed bug #62342, #63102
1706         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1707         like ImplementMethod.
1708
1709 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1710
1711         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1712         Fixed bug #65170.
1713
1714 2004-09-02  Martin Baulig  <martin@ximian.com>
1715
1716         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1717         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1718         on the MethodBase.
1719
1720 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1721
1722         C# 2.0 Static classes implemented
1723
1724         * class.cs (TypeContainer): instance_constructors,
1725         initialized_fields, initialized_static_fields,
1726         default_constructor, base_inteface_types are protected to be
1727         accessible from StaticClass.
1728         (TypeContainer.DefineDefaultConstructor): New virtual method
1729         for custom default constructor generating
1730         (StaticClass): New class to handle "Static classes" feature.
1731
1732         * cs-parser.jay: Handle static keyword on class like instance
1733         of StaticClass.
1734
1735         * driver.cs: Added "/langversion" command line switch with two
1736         options (iso-1, default).
1737
1738 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1739
1740         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1741
1742 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1743
1744         * delegate.cs: Style.
1745
1746 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1747
1748         * delegate.cs: Add seperate instance expr field for miguel.
1749
1750 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1751
1752         * PointerArithmetic (Resolve): make sure we are not doing
1753         pointer arith on void*. Also, make sure we are resolved
1754         by not setting eclass until resolve.
1755
1756         All callers: Make sure that PointerArithmetic gets resolved.
1757
1758 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1759
1760         * ArrayCreation (LookupType): If the type does not resolve 
1761         to an array, give an error.
1762
1763 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1764
1765         * statement.cs (Try.Resolve): Fixed bug #64222
1766
1767 2004-08-27  Martin Baulig  <martin@ximian.com>
1768
1769         * class.cs
1770         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1771         crash here.     
1772
1773 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1774
1775         * ecore.cs (Constantify): Get underlying type via
1776         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1777         Windows in special cases.
1778
1779 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1780
1781         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1782         for obtaining also private methods.
1783         (GetRemoveMethod): Used GetRemoveMethod (true)
1784         for obtaining also private methods.
1785
1786 2004-08-24  Martin Baulig  <martin@ximian.com>
1787
1788         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1789         MethodAttributes.HideBySig for operators.
1790
1791 2004-08-23  Martin Baulig  <martin@ximian.com>
1792
1793         Back to the old error reporting system :-)
1794
1795         * report.cs (Message): Removed.
1796         (Report.MessageData, ErrorData, WarningData): Removed.
1797         (Report.Error, Warning): Back to the old system.
1798
1799 2004-08-23  Martin Baulig  <martin@ximian.com>
1800
1801         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1802
1803         * class.cs (TypeContainer.ParentContainer): New public virtual
1804         method; replaces the explicit interface implementation.
1805         (ClassPart.ParentContainer): Override.
1806
1807 2004-08-23  Martin Baulig  <martin@ximian.com>
1808
1809         * statement.cs (Switch): Added support for constant switches; see
1810         #59428 or test-285.cs.
1811
1812 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1813
1814         Fixed bug #62740.
1815         * statement.cs (GetEnumeratorFilter): Removed useless
1816         logic because C# specs is strict. GetEnumerator must be
1817         public.
1818
1819 2004-08-22  Martin Baulig  <martin@ximian.com>
1820
1821         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1822         a switch and may break, reset the barrier.  Fixes #59867.
1823
1824 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1825
1826         CLS-Compliance speed up (~5% for corlib)
1827
1828         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1829         New method. Tests container for CLS-Compliant names
1830
1831         * class.cs (TypeContainer.VerifyClsName): New method.
1832         Checks whether container name is CLS Compliant.
1833         (Constructor): Implements IMethodData.
1834
1835         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1836         low-case table for CLS Compliance test.
1837         (MemberCache.VerifyClsParameterConflict): New method.
1838         Checks method parameters for CS3006 error.
1839
1840         * enum.cs (EnumMember): Is derived from MemberCore.
1841         (Enum.VerifyClsName): Optimized for better performance.
1842
1843 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1844
1845         * report.cs: Renamed Error_T to Error and changed all
1846         references.
1847
1848 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1849
1850         * class.cs (TypeContainer.IndexerArrayList): New inner class
1851         container for indexers.
1852         (TypeContainer.DefaultIndexerName): New constant for default
1853         indexer name. Replaced all "Item" with this constant.
1854         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1855
1856         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1857         DefaultMemberAttribute constructor.
1858
1859 2004-08-05  Martin Baulig  <martin@ximian.com>
1860
1861         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1862         Fix bug #59429.
1863
1864 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1865
1866         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1867         multi platforms problem.
1868
1869         * compiler.csproj: Included shared files.
1870
1871 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1872
1873         Fix bug 60333, 55971 in the more general way
1874         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1875         Added arg_type argument for constant conversion.
1876         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1877
1878 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1879
1880         Fix bug #59760
1881         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1882         OperatorArrayList, MethodCoreArrayList for typecontainer
1883         containers. Changed class member types to these new types.
1884         (MethodArrayList.DefineMembers): Added test for CS0659.
1885
1886 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1887
1888         * cfold.cs: Synchronize the folding with the code in expression.cs
1889         Binary.DoNumericPromotions for uint operands.
1890
1891         * attribute.cs: Revert patch from Raja, it introduced a regression
1892         while building Blam-1.2.1 (hard to isolate a test case).
1893
1894 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1895
1896         Fix for #55382
1897         * class.cs:
1898         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1899         name collision.
1900         (MethodCore.parent_method): New member. The method we're overriding
1901         if this is an override method.
1902         (MethodCore.CheckBase): Moved from Method class and made common.
1903         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1904         private.
1905         (MethodCore.CheckForDuplications): New abstract method. For custom
1906         member duplication search in a container
1907         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1908         method and its return type.
1909         (Event.conflict_symbol): New member. Symbol with same name in the
1910         parent class.
1911
1912         * decl.cs:
1913         (MemberCache.FindMemberWithSameName): New method. The method
1914         is looking for conflict with inherited symbols.
1915
1916 2004-08-04  Martin Baulig  <martin@ximian.com>
1917
1918         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1919
1920         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1921
1922 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1923
1924         * report.cs (Message): New enum for better error, warning reference in
1925         the code.
1926         (MessageData): New inner abstract class. It generally handles printing of
1927         error and warning messages.
1928         Removed unused Error, Warning, Message methods.
1929
1930 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1931
1932         Fix for cs0592-8.cs test
1933         * attribute.cs
1934         (Attributable.ValidAttributeTargets): Made public.
1935         (Attribute.ExplicitTarget): New member for explicit target value.
1936         (Attribute.CheckTargets): Now we translate explicit attribute
1937         target to Target here.
1938
1939 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1940
1941         * ecore.cs (MethodGroupExpr): new IsBase property.
1942
1943         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1944
1945         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1946         rather than an instance expr.
1947
1948         (DelegateCreation.Emit): Use the method group rather than
1949         the instance expression. Also, if you have base.Foo as the
1950         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1951
1952         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1953
1954         (NewDelegate.DoResolve): Only check for the existance of Invoke
1955         if the method is going to be needed. Use MethodGroupExpr.
1956
1957         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1958
1959         * expression.cs: For pointer arith., make sure to use
1960         the size of the type, not the size of the pointer to
1961         the type.
1962
1963 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1964
1965         Fix for #60722
1966         * class.cs (Class): Added error CS0502 test.
1967
1968 2004-08-03  John Luke  <jluke@cfl.rr.com>
1969             Raja R Harinath  <rharinath@novell.com>
1970
1971         Fix for #60997.
1972         * attribute.cs (Attribute.complained_before): New flag.
1973         (Attribute.ResolveType, Attribute.Resolve),
1974         (Attribute.DefinePInvokeMethod): Set it.
1975         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1976         
1977 2004-08-03  Martin Baulig  <martin@ximian.com>
1978
1979         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1980         use a user-defined operator; we still need to do numeric
1981         promotions in case one argument is a builtin type and the other
1982         one has an implicit conversion to that type.  Fixes #62322.
1983
1984 2004-08-02  Martin Baulig  <martin@ximian.com>
1985
1986         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1987         (LocalInfo.IsThis): New public property.
1988         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1989
1990 2004-08-01  Martin Baulig  <martin@ximian.com>
1991
1992         * class.cs (TypeContainer.GetClassBases): Don't set the default
1993         here since we may get called from GetPartialBases().
1994         (TypeContainer.DefineType): If GetClassBases() didn't return a
1995         parent, use the default one.
1996
1997 2004-07-30  Duncan Mak  <duncan@ximian.com>
1998
1999         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2000
2001 2004-07-30  Martin Baulig  <martin@ximian.com>
2002
2003         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2004
2005         * class.cs (SourceMethod): New public class, derive from the
2006         symbol writer's ISourceMethod.
2007         (Method): Use the new symbol writer API.
2008
2009         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2010         as argument and use the new symbol writer.
2011
2012         * location.cs
2013         (SourceFile): Implement the symbol writer's ISourceFile.
2014         (Location.SymbolDocument): Removed.
2015         (Location.SourceFile): New public property.
2016
2017         * symbolwriter.cs: Use the new symbol writer API.
2018
2019 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2020
2021         * Makefile (install-local): Remove.  Functionality moved to
2022         executable.make.
2023
2024 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2025
2026         * Makefile: Install mcs.exe.config file together with mcs.exe.
2027         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2028         correct runtime version.
2029         
2030 2004-07-25  Martin Baulig  <martin@ximian.com>
2031
2032         * class.cs
2033         (TypeContainer.RegisterOrder): Removed, this was unused.
2034         (TypeContainer, interface_order): Removed.
2035         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2036         TypeContainer as argument since we can also be called with a
2037         `PartialContainer' for a partial class/struct/interface.
2038         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2039         of checking whether we're an `Interface' - we could be a
2040         `PartialContainer'.
2041         (PartialContainer.Register): Override; call
2042         AddClass()/AddStruct()/AddInterface() on our parent.
2043
2044         * cs-parser.jay (interface_member_declaration): Add things to the
2045         `current_container', not the `current_class'.
2046
2047         * rootcontext.cs (RegisterOrder): The overloaded version which
2048         takes an `Interface' was unused, removed.
2049
2050         * typemanager.cs (TypeManager.LookupInterface): Return a
2051         `TypeContainer', not an `Interface'.
2052         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2053         contain a `PartialContainer' for an interface, so check it's
2054         `Kind' to figure out what it is.
2055
2056 2004-07-25  Martin Baulig  <martin@ximian.com>
2057
2058         * class.cs (Class.DefaultTypeAttributes): New public constant.
2059         (Struct.DefaultTypeAttributes): Likewise.
2060         (Interface.DefaultTypeAttributes): Likewise.
2061         (PartialContainer.TypeAttr): Override this and add the
2062         DefaultTypeAttributes.
2063
2064 2004-07-25  Martin Baulig  <martin@ximian.com>
2065
2066         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2067         we can just use the `Parent' field instead.
2068
2069 2004-07-25  Martin Baulig  <martin@ximian.com>
2070
2071         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2072
2073 2004-07-25  Martin Baulig  <martin@ximian.com>
2074
2075         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2076         our parts before defining any methods.
2077         (TypeContainer.VerifyImplements): Make this virtual.
2078         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2079         on our PartialContainer.
2080
2081 2004-07-25  Martin Baulig  <martin@ximian.com>
2082
2083         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2084
2085         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2086         argument, we can just use the `Parent' field instead.
2087
2088         * class.cs
2089         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2090         (MemberBase.DoDefine): Likewise.
2091
2092 2004-07-24  Martin Baulig  <martin@ximian.com>
2093
2094         * decl.cs (MemberCore.Parent): New public field.
2095         (DeclSpace.Parent): Moved to MemberCore.
2096
2097         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2098         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2099         parent's .ctor.
2100         (FieldBase, Field, Operator): Likewise.
2101         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2102         (EventField, Event): Likewise.
2103
2104 2004-07-23  Martin Baulig  <martin@ximian.com>
2105
2106         * class.cs (PartialContainer): New public class.
2107         (ClassPart): New public class.
2108         (TypeContainer): Added support for partial classes.
2109         (TypeContainer.GetClassBases): Splitted some of the functionality
2110         out into GetNormalBases() and GetPartialBases().
2111
2112         * cs-tokenizer.cs (Token.PARTIAL): New token.
2113         (Tokenizer.consume_identifier): Added some hacks to recognize
2114         `partial', but only if it's immediately followed by `class',
2115         `struct' or `interface'.
2116
2117         * cs-parser.jay: Added support for partial clases.
2118
2119 2004-07-23  Martin Baulig  <martin@ximian.com>
2120
2121         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2122         a `DeclSpace' and also made it readonly.
2123         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2124         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2125         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2126
2127         * cs-parser.jay: Pass the `current_class', not the
2128         `current_container' (at the moment, this is still the same thing)
2129         to a new Method, Property, Event, Indexer or Constructor.
2130
2131 2004-07-23  Martin Baulig  <martin@ximian.com>
2132
2133         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2134         and removed the `current_interface' one.
2135         (struct_declaration, class_declaration, interface_declaration):
2136         Set `current_class' to the newly created class/struct/interface;
2137         set their `Bases' and call Register() before parsing their body.
2138
2139 2004-07-23  Martin Baulig  <martin@ximian.com>
2140
2141         * class.cs (Kind): New public enum.
2142         (TypeContainer): Made this class abstract.
2143         (TypeContainer.Kind): New public readonly field.
2144         (TypeContainer.CheckDef): New public method; moved here from
2145         cs-parser.jay.
2146         (TypeContainer.Register): New public abstract method.
2147         (TypeContainer.GetPendingImplementations): New public abstract
2148         method.
2149         (TypeContainer.GetClassBases): Removed the `is_class' and
2150         `is_iface' parameters.
2151         (TypeContainer.DefineNestedTypes): Formerly known as
2152         DoDefineType().
2153         (ClassOrStruct): Made this class abstract.
2154
2155         * tree.cs (RootTypes): New public type. 
2156
2157 2004-07-20  Martin Baulig  <martin@ximian.com>
2158
2159         * tree.cs (Tree.RecordNamespace): Removed.
2160         (Tree.Namespaces): Removed.
2161
2162         * rootcontext.cs (RootContext.IsNamespace): Removed.
2163
2164         * cs-parser.jay (namespace_declaration): Just create a new
2165         NamespaceEntry here.
2166
2167 2004-07-20  Martin Baulig  <martin@ximian.com>
2168
2169         * statement.cs (ExceptionStatement): New abstract class.  This is
2170         now used as a base class for everyone who's using `finally'.
2171         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2172         our local variables before using them.
2173
2174         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2175         virtual method.  This is used by Yield.Resolve() to "steal" an
2176         outer block's `finally' clauses.
2177         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2178         argument.
2179
2180         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2181         version which takes an ExceptionStatement.  This version must be
2182         used to create exception branchings.
2183
2184         * iterator.cs
2185         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2186         (Iterator.EmitMoveNext): Added exception support; protect the
2187         block with a `fault' clause, properly handle 'finally' clauses.
2188         (Iterator.EmitDispose): Run all the `finally' clauses here.
2189
2190 2004-07-20  Martin Baulig  <martin@ximian.com>
2191
2192         * iterator.cs: This is the first of a set of changes in the
2193         iterator code.  Match the spec more closely: if we're an
2194         IEnumerable, then GetEnumerator() must be called.  The first time
2195         GetEnumerator() is called, it returns the current instance; all
2196         subsequent invocations (if any) must create a copy.
2197
2198 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2199
2200         * expression.cs: Resolve the constant expression before returning
2201         it. 
2202
2203 2004-07-19  Martin Baulig  <martin@ximian.com>
2204
2205         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2206         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2207         the return type of the new EmitContext.
2208
2209 2004-07-18  Martin Baulig  <martin@ximian.com>
2210
2211         * class.cs (Property.Define): Fix iterators.
2212
2213         * iterators.cs (Iterator.Define): Moved the
2214         `container.AddInterator (this)' call here from the .ctor; only do
2215         it if we resolved successfully.
2216
2217 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2218
2219         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2220         `true' for preprocessing directives that we parse.  The return
2221         value indicates whether we should return to regular tokenizing or
2222         not, not whether it was parsed successfully.
2223
2224         In the past if we were in: #if false ... #line #endif, we would
2225         resume parsing after `#line'.  See bug 61604.
2226
2227         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2228         building: IsEnumType should return true only for enums, not for
2229         enums or System.Enum itself.  This fixes #61593.
2230
2231         Likely what happened is that corlib was wrong: mcs depended on
2232         this bug in some places.  The bug got fixed, we had to add the
2233         hack, which caused bug 61593.
2234
2235         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2236         that was a workaround for the older conditions.
2237
2238 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2239
2240         * assign.cs: IAssignMethod has a new interface, as documented
2241         inline. All assignment code now uses this new api.
2242
2243         * ecore.cs, expression.cs: All classes which implement
2244         IAssignMethod now use the new interface.
2245
2246         * expression.cs (Invocation): add a hack to EmitCall so that
2247         IndexerAccess can be the target of a compound assignment without
2248         evaluating its arguments twice.
2249
2250         * statement.cs: Handle changes in Invocation api.
2251
2252 2004-07-16  Martin Baulig  <martin@ximian.com>
2253
2254         * iterators.cs: Rewrote this.  We're now using one single Proxy
2255         class for both the IEnumerable and the IEnumerator interface and
2256         `Iterator' derives from Class so we can use the high-level API.
2257
2258         * class.cs (TypeContainer.AddIterator): New method.
2259         (TypeContainer.DoDefineType): New protected virtual method, which
2260         is called from DefineType().
2261         (TypeContainer.DoDefineMembers): Call DefineType() and
2262         DefineMembers() on all our iterators.
2263         (TypeContainer.Emit): Call Emit() on all our iterators.
2264         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2265
2266         * codegen.cs (EmitContext.CurrentIterator): New public field.
2267
2268 2004-07-15  Martin Baulig  <martin@ximian.com>
2269
2270         * typemanager.cs
2271         (TypeManager.not_supported_exception_type): New type.   
2272
2273 2004-07-14  Martin Baulig  <martin@ximian.com>
2274
2275         * iterators.cs: Use real error numbers.
2276
2277 2004-07-14  Martin Baulig  <martin@ximian.com>
2278
2279         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2280         requires this to be a System.Collection.IEnumerable and not a
2281         class implementing that interface.
2282         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2283
2284 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2285
2286         * class.cs: Fixed previous fix, it broke some error tests.
2287
2288 2004-07-12  Martin Baulig  <martin@ximian.com>
2289
2290         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2291         Fixes #61293.
2292
2293 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2294
2295         * assign.cs (LocalTemporary): Add new argument: is_address,If
2296         `is_address' is true, then the value that we store is the address
2297         to the real value, and not the value itself.
2298         
2299         * ecore.cs (PropertyExpr): use the new local temporary
2300         stuff to allow us to handle X.Y += z (where X is a struct)
2301
2302 2004-07-08  Martin Baulig  <martin@ximian.com>
2303
2304         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2305         not always return, just like we're doing in Using.Resolve().
2306
2307 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2308
2309         * cs-parser.jay (fixed_statement): flag this as Pinned.
2310
2311 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2312
2313         * typemanager.cs (TypeManager): Removed MakePinned method, this
2314         mechanism is replaced with the .NET 2.x compatible mechanism of
2315         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2316
2317         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2318         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2319         `IsFixed' property which has a different meaning.
2320
2321 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2322
2323         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2324         visible from inside a nested class, not just the names of the
2325         immediately enclosing class.
2326         Fix for bug #60730.
2327
2328 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2329
2330         * expression.cs (BetterConversion): Remove buggy special-case
2331         handling of "implicit constant expression conversions".  At this
2332         point, we already know that the conversion is possible -- we're
2333         only checking to see which is better.
2334
2335 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2336
2337         * cs-parser.jay: Added error CS0210 test.
2338
2339 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2340
2341         * cs-parser.jay: Added error CS0134 test.
2342
2343 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2344
2345         Fix bug #52507
2346         * cs-parser.jay: Added error CS0145 test.
2347
2348 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2349
2350         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2351
2352 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2353         
2354         * expression.cs (StackAlloc.Resolve): The argument may not
2355         be a constant; deal with this case.
2356         
2357 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2358
2359         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2360         GetIndexerAttributeValue.
2361         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2362
2363         * class.cs (Indexer.Define): Added error tests for CS0415,
2364         CS0609.
2365
2366 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2367
2368         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2369         property code.
2370
2371 2004-06-23  Martin Baulig  <martin@ximian.com>
2372
2373         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2374         neither return nor throw, reset the barrier as well.  Fixes #60457.
2375
2376 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2377
2378         * class.cs : EventAttributes is now set to None by default.
2379           This fixes bug #60459.
2380
2381 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2382
2383         Fix bug #60219
2384         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2385         Don't throw exception but return null (it's sufficient now).
2386
2387 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2388
2389         * typemanager.cs (GetArgumentTypes): Faster implementation.
2390
2391 2004-06-18  Martin Baulig  <martin@ximian.com>
2392
2393         * attribute.cs (Attribute.Resolve): Check whether we're an
2394         EmptyCast which a Constant child.  Fixes #60333.
2395
2396 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2397
2398         * statement.cs (EmitCollectionForeach): Account for the fact that
2399         not all valuetypes are in areas which we can take the address of.
2400         For these variables, we store to a temporary variable. Also, make
2401         sure that we dont emit a `callvirt' on a valuetype method.
2402
2403 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2404
2405         * expression.cs (StackAlloc.DoReSolve): Added test for
2406         negative parameter (CS0247).
2407
2408 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2409
2410         Fix bug #59792
2411         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2412
2413 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2414
2415         Fix bug #59781
2416         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2417         ulong.
2418
2419 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2420
2421         Fix bug #58254 & cs1555.cs, cs1556.cs
2422         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2423
2424 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2425
2426         * cs-parser.jay: Added error CS1669 test for indexers.
2427
2428 2004-06-11  Martin Baulig  <martin@ximian.com>
2429
2430         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2431         call this twice: for params and varargs methods.
2432
2433 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2434
2435         * class.cs:
2436         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2437
2438 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2439
2440         * attribute.cs (Attribute.GetValidTargets): Made public.
2441
2442         * class.cs: 
2443         (AbstractPropertyEventMethod): New class for better code sharing.
2444         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2445         CS1667 report.
2446         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2447
2448 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2449
2450         Fix bug #59477.
2451         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2452         that the call to Resolve is part of a MemberAccess.
2453         (Expression.Resolve): Use it for SimpleName resolution.
2454         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2455         Add 'intermediate' boolean argument.
2456         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2457         error message when the SimpleName can be resolved ambiguously
2458         between an expression and a type.
2459         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2460         public.
2461         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2462         call on the left-side.
2463
2464 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2465
2466         * class.cs:
2467         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2468
2469 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2470
2471         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2472
2473 2004-06-11  Martin Baulig  <martin@ximian.com>
2474
2475         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2476         varargs methods if applicable.
2477
2478 2004-06-11  Martin Baulig  <martin@ximian.com>
2479
2480         * expression.cs (Invocation.EmitCall): Don't use
2481         `method.CallingConvention == CallingConventions.VarArgs' since the
2482         method could also have `CallingConventions.HasThis'.
2483
2484 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2485
2486         * class.cs (Event.GetSignatureForError): Implemented.
2487         Fixed crash in error test cs3010.cs
2488
2489 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2490
2491         * cs-tokenizer.cs: Change the way we track __arglist to be
2492         consistent with the other keywords.
2493
2494 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2495
2496         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2497         tomorrow.
2498
2499 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2500
2501         * codegen.cs: Check that all referenced assemblies have a strongname
2502         before strongnaming the compiled assembly. If not report error CS1577.
2503         Fix bug #56563. Patch by Jackson Harper.
2504         * typemanager.cs: Added a method to return all referenced assemblies.
2505         Fix bug #56563. Patch by Jackson Harper.
2506
2507 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2508
2509         * class.cs:
2510         (Method.ApplyAttributeBuilder): Moved and added conditional
2511         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2512
2513         * delegate.cs:
2514         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2515
2516 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2517
2518         Fixed #59640
2519         * class.cs: (EventField.attribute_targets): Changed default target.
2520
2521 2004-06-08  Martin Baulig  <martin@ximian.com>
2522
2523         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2524
2525 2004-06-08  Martin Baulig  <martin@ximian.com>
2526
2527         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2528
2529 2004-06-07  Martin Baulig  <martin@ximian.com>
2530
2531         Added support for varargs methods.
2532
2533         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2534         keyword.
2535
2536         * cs-parser.jay: Added support for `__arglist'.
2537
2538         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2539
2540         * expression.cs (Argument.AType): Added `ArgList'.
2541         (Invocation): Added support for varargs methods.
2542         (ArglistAccess): New public class.
2543         (Arglist): New public class.
2544
2545         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2546
2547         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2548         a method's top-level block if the method has varargs.
2549
2550         * support.cs (ReflectionParameters, InternalParameters): Added
2551         support for varargs methods.    
2552
2553 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2554
2555         * class.cs: Provide location in indexer error report.
2556
2557         * driver.cs: Use standard names.
2558
2559         * namespace.cs: Catch the use of using after a namespace has been
2560         declared also on using aliases.
2561
2562 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2563
2564         Bug #50820.
2565         * typemanager.cs (closure_private_ok, closure_invocation_type)
2566         (closure_qualifier_type, closure_invocation_assembly)
2567         (FilterWithClosure): Move to ...
2568         (Closure): New internal nested class.
2569         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2570         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2571         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2572         (MemberLookup, MemberLookupFailed): Use it.
2573         * expression.cs (New.DoResolve): Treat the lookup for the
2574         constructor as being qualified by the 'new'ed type.
2575         (Indexers.GetIndexersForTypeOrInterface): Update.
2576
2577 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2578
2579         * attribute.cs
2580         (GetConditionalAttributeValue): New method. Returns
2581         condition of ConditionalAttribute.
2582         (SearchMulti): New method.  Returns all attributes of type 't'.
2583         Use it when attribute is AllowMultiple = true.
2584         (IsConditionalMethodExcluded): New method.
2585
2586         * class.cs
2587         (Method.IsExcluded): Implemented. Returns true if method has conditional
2588         attribute and the conditions is not defined (method is excluded).
2589         (IMethodData): Extended interface for ConditionalAttribute support.
2590         (PropertyMethod.IsExcluded): Implemented.
2591
2592         * decl.cs
2593         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2594
2595         * expression.cs
2596         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2597         on the method.
2598
2599 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2600
2601         * expression.cs (ArrayCreationExpression): Make this just an
2602         `expression'. It can't be a statement, so the code here was
2603         dead.
2604
2605 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2606
2607         Fixed #59072
2608         * typemanager.cs (GetFullNameSignature): New method for
2609         MethodBase types.
2610
2611 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2612
2613         Fixed #56452
2614         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2615         Use this method when MethodBuilder is null.
2616         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2617         Added test for error CS0626 (MONO reports error for this situation).
2618         (IMethodData.GetSignatureForError): Extended interface.
2619
2620 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2621
2622         * attribute.cs
2623         (AttributeTester.GetObsoleteAttribute): Returns instance of
2624         ObsoleteAttribute when type is obsolete.
2625
2626         * class.cs
2627         (TypeContainer.VerifyObsoleteAttribute): Override.
2628         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2629         (MethodCode.VerifyObsoleteAttribute): Override.
2630         (MemberBase.VerifyObsoleteAttribute): Override.
2631
2632         * decl.cs
2633         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2634         and report proper error.
2635
2636         *delegate.cs
2637         Delegate.VerifyObsoleteAttribute): Override.
2638
2639         * ecore.cs
2640         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2641         and report proper error.
2642         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2643
2644         * enum.cs
2645         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2646         and enum member.
2647
2648         * expression.cs
2649         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2650         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2651         Added test for ObsoleteAttribute.
2652
2653         * statement.cs
2654         (Catch): Derived from Statement.
2655
2656 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2657  
2658         Fixed bug #59071 & cs0160.cs
2659  
2660         * statement.cs (Try.Resolve): Check here whether order of catch
2661         clauses matches their dependencies.
2662
2663 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2664
2665         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2666         caused a regression: #59343.  Referencing nested classes from an
2667         assembly stopped working.
2668
2669 2004-05-31  Martin Baulig  <martin@ximian.com>
2670
2671         MCS is now frozen for beta 2.
2672
2673 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2674
2675         * convert.cs: add a trivial cache for overload operator resolution.
2676
2677 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2678
2679         * decl.cs: If possible, use lookuptypedirect here. We can only do
2680         this if there is no `.' after the namespace. Avoids using
2681         LookupType, which does lots of slow processing.
2682         (FindNestedType) New method, does what it says :-).
2683         * namespace.cs: use LookupTypeDirect.
2684         * rootcontext.cs: use membercache, if possible.
2685         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2686
2687 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2688
2689         * expression.cs:
2690         According to the spec, 
2691
2692         In a member access of the form E.I, if E is a single identifier,
2693         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2694         field, property, localvariable, or parameter with the same type as
2695         the meaning of E as a type-name (§3.8), then both possible
2696         meanings of E are permitted.
2697
2698         We did not check that E as a simple-name had the same type as E as
2699         a type name.
2700
2701         This trivial check gives us 5-7% on bootstrap time.
2702
2703 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2704
2705         * expression.cs (Invocation.OverloadResolve): Avoid the
2706         use of hashtables and boxing here by allocating on demand.
2707
2708 2004-05-30  Martin Baulig  <martin@ximian.com>
2709
2710         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2711         we're doing a silent lookup.  Don't try to lookup nested types in
2712         TypeManager.object_type (thanks to Ben Maurer).
2713
2714 2004-05-30  Martin Baulig  <martin@ximian.com>
2715
2716         Committing a patch from Ben Maurer.
2717
2718         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2719
2720 2004-05-29  Martin Baulig  <martin@ximian.com>
2721
2722         * class.cs (IMethodData.ShouldIgnore): New method.
2723
2724         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2725         `Location' argument, we don't need it anywhere.  Use
2726         `IMethodData.ShouldIgnore ()' instead of
2727         `MethodData.GetMethodFlags ()'.
2728         (TypeManager.AddMethod): Removed.
2729         (TypeManager.AddMethod2): Renamed to AddMethod.
2730
2731 2004-05-29  Martin Baulig  <martin@ximian.com>
2732
2733         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2734
2735         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2736         converting from a class type S to an interface type and we already
2737         have an object on the stack, don't box it again.  Fixes #52578.
2738
2739 2004-05-29  Martin Baulig  <martin@ximian.com>
2740
2741         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2742         Added support for `params' parameters.  Fixes #59267.
2743
2744 2004-05-29  Martin Baulig  <martin@ximian.com>
2745
2746         * literal.cs (NullPointer): Provide a private .ctor which sets
2747         `type' to TypeManager.object_type.  Fixes #59048.
2748
2749 2004-05-29  Martin Baulig  <martin@ximian.com>
2750
2751         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2752         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2753
2754         * ecore.cs (EventExpr.instance_expr): Make the field private.
2755
2756 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2757
2758         Fixed bug #50080 & cs0214-2.cs
2759         * expression.cs (Cast.DoResolve): Check unsafe context here.
2760         
2761         * statement.cs (Resolve.DoResolve): Likewise.
2762
2763 2004-05-26  Martin Baulig  <martin@ximian.com>
2764
2765         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2766
2767         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2768         (RootContext.LookupType): Pass down the `silent' flag.
2769
2770 2004-05-25  Martin Baulig  <martin@ximian.com>
2771
2772         * expression.cs
2773         (MethodGroupExpr.IdenticalTypeName): New public property.
2774         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2775         expression actually refers to a type.
2776
2777 2004-05-25  Martin Baulig  <martin@ximian.com>
2778
2779         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2780         for #56176 and made it actually work.
2781
2782 2004-05-25  Martin Baulig  <martin@ximian.com>
2783
2784         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2785         (FieldExpr, PropertyExpr): Override and implement
2786         CacheTemporaries.  Fixes #52279.
2787
2788 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2789
2790         * location.cs: In the new compiler listing a file twice is a
2791         warning, not an error.
2792
2793 2004-05-24  Martin Baulig  <martin@ximian.com>
2794
2795         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2796         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2797
2798 2004-05-24  Martin Baulig  <martin@ximian.com>
2799
2800         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2801         walking the `using' list.  Fixes #53921.
2802
2803 2004-05-24  Martin Baulig  <martin@ximian.com>
2804
2805         * const.cs (Const.LookupConstantValue): Added support for
2806         EmptyCast's; fixes #55251.
2807
2808 2004-05-24  Martin Baulig  <martin@ximian.com>
2809
2810         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2811         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2812         which does the CS0135 check.  The reason is that we first need to
2813         check whether the variable actually exists.
2814
2815 2004-05-24  Martin Baulig  <martin@ximian.com>
2816
2817         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2818         than RootContext.LookupType() to find the explicit interface
2819         type.  Fixes #58584.
2820
2821 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2822
2823         * Makefile: Simplify.  Use executable.make.
2824         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2825
2826 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2827
2828         * decl.cs:
2829         * enum.cs:
2830         Use the invariant culture when doing String.Compare for CLS case
2831         sensitivity.
2832         
2833 2004-05-23  Martin Baulig  <martin@ximian.com>
2834
2835         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2836         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2837
2838         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2839         
2840 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2841
2842         * class.cs (MemberBase.Define): Reuse MemberType member for 
2843         resolved type. Other methods can use it too.
2844
2845 2004-05-23  Martin Baulig  <martin@ximian.com>
2846
2847         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2848         the variable also exists in the current block (otherwise, we need
2849         to report a CS0103).  Fixes #58670.
2850
2851 2004-05-23  Martin Baulig  <martin@ximian.com>
2852
2853         * flowanalysis.cs (Reachability.Reachable): Compute this
2854         on-the-fly rather than storing it as a field.
2855
2856 2004-05-23  Martin Baulig  <martin@ximian.com>
2857
2858         * flowanalysis.cs (Reachability.And): Manually compute the
2859         resulting `barrier' from the reachability.      
2860        
2861 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2862
2863         Fix bug #57835
2864         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2865         instance of ObsoleteAttribute when symbol is obsolete.
2866
2867         * class.cs
2868         (IMethodData): Extended interface for ObsoleteAttribute support.
2869
2870 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2871
2872         * attribute.cs: Fix bug #55970
2873
2874 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2875
2876         Fix bug #52705
2877         * attribute.cs
2878         (GetObsoleteAttribute): New method. Creates the instance of
2879         ObsoleteAttribute.
2880         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2881         ObsoleteAttribute when member is obsolete.
2882         (AttributeTester.Report_ObsoleteMessage): Common method for
2883         Obsolete error/warning reporting.
2884
2885         * class.cs
2886         (TypeContainer.base_classs_type): New member for storing parent type.
2887
2888         * decl.cs
2889         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2890         for this MemberCore.
2891
2892 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2893
2894         * attribute.cs, const.cs: Fix bug #58590
2895
2896 2004-05-21  Martin Baulig  <martin@ximian.com>
2897
2898         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2899         out parameters if the end of the method is unreachable.  Fixes
2900         #58098. 
2901
2902 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2903
2904         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2905         Hari was right, why extra method.
2906
2907 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2908
2909         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2910
2911 2004-05-20  Martin Baulig  <martin@ximian.com>
2912
2913         Merged this back from gmcs to keep the differences to a minumum.
2914
2915         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
2916         instead of a Declspace.
2917         (Attribute.ResolveType): Likewise.
2918         (Attributes.Search): Likewise.
2919         (Attributes.Contains): Likewise.
2920         (Attributes.GetClsCompliantAttribute): Likewise.
2921
2922         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
2923         argument.
2924         (MethodData.ApplyAttributes): Take an EmitContext instead of a
2925         DeclSpace.
2926
2927 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2928
2929         Fix bug #58688 (MCS does not report error when the same attribute
2930         is assigned twice)
2931
2932         * attribute.cs (Attribute.Emit): Distinction between null and default.
2933
2934 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2935
2936         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2937         of a top-level attribute without an attribute target.
2938         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2939         Make non-static.
2940         (Attribute.Conditional_GetConditionName), 
2941         (Attribute.Obsolete_GetObsoleteMessage): Update.
2942         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2943         part of ScanForIndexerName.
2944         (Attribute.CanIgnoreInvalidAttribute): New function.
2945         (Attribute.ScanForIndexerName): Move to ...
2946         (Attributes.ScanForIndexerName): ... here.
2947         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2948         (Attributes.Search): New internal variant that can choose not to
2949         complain if types aren't resolved.  The original signature now
2950         complains.
2951         (Attributes.GetClsCompliantAttribute): Use internal variant, with
2952         complaints suppressed.
2953         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2954         only if it not useful.
2955         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2956         top-level for attributes that are shared between the assembly
2957         and a top-level class.
2958         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2959         * class.cs: Update to reflect changes.
2960         (DefineIndexers): Fuse loops.
2961         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2962         a couple more variants of attribute names.
2963
2964 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2965
2966         Fix bug #52585 (Implemented explicit attribute declaration)
2967
2968         * attribute.cs:
2969         (Attributable.ValidAttributeTargets): New abstract method. It gets
2970         list of valid attribute targets for explicit target declaration.
2971         (Attribute.Target): It holds target itself.
2972         (AttributeSection): Removed.
2973         (Attribute.CheckTargets): New method. It checks whether attribute
2974         target is valid for the current element.
2975
2976         * class.cs:
2977         (EventProperty): New class. For events that are declared like
2978         property (with add and remove accessors).
2979         (EventField): New class. For events that are declared like field.
2980         class.cs
2981
2982         * cs-parser.jay: Implemented explicit attribute target declaration.
2983
2984         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2985         Override ValidAttributeTargets.
2986
2987         * parameter.cs:
2988         (ReturnParameter): Class for applying custom attributes on 
2989         the return type.
2990         (ParameterAtribute): New class. Class for applying custom
2991         attributes on the parameter type.
2992
2993 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2994
2995         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
2996         definitions. 
2997
2998         (Method): Allow UNSAFE here.
2999
3000         * modifiers.cs: Support unsafe reporting.
3001
3002 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3003
3004         * decl.cs: Fix bug #58478.
3005
3006 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3007
3008         * statement.cs: When checking for unreachable code on an EmptyStatement,
3009         set the location. Fixes bug #58488.
3010
3011 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3012
3013         * driver.cs: Add -pkg handling.
3014
3015         From Gonzalo: UseShelLExecute=false
3016
3017 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3018
3019         * attribute.cs:
3020         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3021         for attribute.
3022         (Attribute.IsClsCompliaceRequired): Moved to base for better
3023         accesibility.
3024         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3025         when attribute is AttributeUsageAttribute.
3026         (Attribute.GetValidTargets): Simplified.
3027         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3028         attribute for this type.
3029         (Attribute.ApplyAttributes): Method renamed to Emit and make
3030         non-static.
3031         (GlobalAttributeSection): New class for special handling of global
3032         attributes (assembly, module).
3033         (AttributeSection.Emit): New method.
3034
3035         * class.cs: Implemented Attributable abstract methods.
3036         (MethodCore.LabelParameters): Moved to Parameter class.
3037         (Accessor): Is back simple class.
3038         (PropertyMethod): Implemented Attributable abstract class.
3039         (DelegateMethod): Implemented Attributable abstract class.
3040         (Event): New constructor for disctintion between normal Event
3041         and Event with accessors.
3042
3043         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3044
3045         * codegen.cs, const.cs, decl.cs, delegate.cs:
3046         (CommonAssemblyModulClass): Implemented Attributable abstract class
3047         and simplified.
3048
3049         * enum.cs: Implement IAttributeSupport interface.
3050         (EnumMember): New class for emum members. Implemented Attributable
3051         abstract class
3052
3053         * parameter.cs:
3054         (ParameterBase): Is abstract.
3055         (ReturnParameter): New class for easier [return:] attribute handling.
3056
3057         * typemanager.cs: Removed builder_to_attr.
3058
3059 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3060
3061         Fix bug #57151.
3062         * attribute.cs (Attribute.GetPositionalValue): New function.
3063         * class.cs (TypeContainer.VerifyMembers): New function.
3064         (TypeContainer.Emit): Use it.
3065         (ClassOrStruct): New base class for Class and Struct.
3066         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3067         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3068         class.
3069         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3070         then each non-static field should have a FieldOffset attribute.
3071         Otherwise, none of the fields should have a FieldOffset attribute.
3072         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3073         and FieldOffset attributes.
3074         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3075         (TypeManager.field_offset_attribute_type): New core types.
3076         (TypeManager.InitCoreTypes): Initialize them.
3077
3078 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3079
3080         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3081         Return correct type.
3082         From bug #58270.
3083
3084 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3085
3086         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3087         be implicitly converted to ulong.
3088         
3089         * expression.cs: The logic for allowing operator &, | and ^ worked
3090         was wrong, it worked before because we did not report an error in
3091         an else branch.  Fixes 57895.
3092
3093         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3094         allow volatile fields to be reference types.
3095
3096 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3097
3098         * driver.cs: Add support for /debug-
3099
3100 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3101
3102         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3103         Add a 'complain' parameter to silence errors.
3104         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3105         silently overlooked type-resolutions.
3106         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3107         to reflect changes.
3108         (Attributes.Search): New function.
3109         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3110         (Attributes.GetAttributeFullName): Remove hack.
3111         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3112         Update to reflect changes.
3113         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3114         Use Attributes.Search instead of nested loops.
3115
3116 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3117
3118         * decl.cs:
3119         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3120         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3121         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3122
3123         * report.cs: (Report.Warning): Renamed to Warning_T because of
3124         parameter collision.
3125
3126 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3127
3128         * expression.cs (MemberAccess.ResolveMemberAccess):
3129         Exit with non-zero status after Report.Error.
3130         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3131         Likewise.
3132         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3133
3134 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3135
3136         * support.cs: Don't hang when the file is empty.
3137
3138 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3139
3140         * support.cs: In SeekableStreamReader, compute the preamble size of the
3141           underlying stream. Position changes should take into account that initial
3142           count of bytes.
3143
3144 2004-05-03  Todd Berman  <tberman@sevenl.net>
3145
3146         * driver.cs: remove unused GetSysVersion function.
3147
3148 2004-05-03  Todd Berman  <tberman@sevenl.net>
3149
3150         * driver.cs: Remove the hack from saturday, as well as the hack
3151         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3152         link_paths to get that bit proper.
3153
3154 2004-05-01  Todd Berman  <tberman@sevenl.net>
3155
3156         * driver.cs: Try a LoadFrom before a Load, this checks the current
3157         path. This is currently a bug in mono that is be fixed, however, this
3158         provides a workaround for now. This will be removed when the bug
3159         is fixed.
3160
3161 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3162
3163         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3164         incomplete key pairs (#57941).
3165
3166 2004-05-01  Todd Berman  <tberman@sevenl.net>
3167
3168         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3169         from the GAC
3170
3171 2004-04-30  Jackson Harper  <jackson@ximian.com>
3172
3173         * codegen.cs: Open keys readonly.
3174         
3175 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3176
3177         * typemanager.cs: don't report cyclic struct layout when a struct
3178         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3179         which has 2 Pango.Rectangle fields.
3180
3181 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3182
3183         * expression.cs: Handle IntPtr comparisons with IL code
3184         rather than a method call.
3185
3186 2004-04-29  Martin Baulig  <martin@ximian.com>
3187
3188         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3189         the list of PropertyInfo's in class hierarchy and find the
3190         accessor.  Fixes #56013.
3191
3192 2004-04-29  Martin Baulig  <martin@ximian.com>
3193
3194         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3195
3196 2004-04-29  Martin Baulig  <martin@ximian.com>
3197
3198         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3199
3200         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3201
3202 2004-04-29  Martin Baulig  <martin@ximian.com>
3203
3204         * class.cs (ConstructorInitializer.Resolve): Check whether the
3205         parent .ctor is accessible.  Fixes #52146.
3206
3207 2004-04-29  Martin Baulig  <martin@ximian.com>
3208
3209         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3210
3211         * statement.cs (Using.EmitLocalVariableDecls): Use
3212         TypeManager.idisposable_type, not typeof (IDisposable).
3213         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3214
3215 2004-04-29  Martin Baulig  <martin@ximian.com>
3216
3217         * class.cs (Event.Define): Don't emit the field and don't set
3218         RTSpecialName and SpecialName for events on interfaces.  Fixes
3219         #57703. 
3220
3221 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3222
3223         Refactor Attribute.ApplyAttributes.
3224         * attribute.cs (Attributable): New base class for objects that can
3225         have Attributes applied on them.
3226         (Attribute): Make AttributeUsage fields public.
3227         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3228         (Attribute.IsInternalCall): New property.
3229         (Attribute.UsageAttr): Convert to a public read-only property.
3230         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3231         (Attribute.ResolveType, Attribute.Resolve)
3232         (Attribute.ScanForIndexerName): Update to reflect changes.
3233         (Attribute.CheckAttributeTarget): Re-format.
3234         (Attribute.ApplyAttributes): Refactor, to various
3235         Attributable.ApplyAttributeBuilder methods.
3236         * decl.cs (MemberCore): Make Attributable.
3237         * class.cs (Accessor): Make Attributable.
3238         (MethodData.ApplyAttributes): Use proper attribute types, not
3239         attribute names.
3240         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3241         (TypeContainer.ApplyAttributeBuilder)
3242         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3243         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3244         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3245         (Operator.ApplyAttributeBuilder): New factored-out methods.
3246         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3247         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3248         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3249         * parameter.cs (ParameterBase): New Attributable base class
3250         that can also represent Return types.
3251         (Parameter): Update to the changes.
3252
3253 2004-04-29  Jackson Harper  <jackson@ximian.com>
3254
3255         * driver.cs: Prefer the corlib system version when looking for
3256         assemblies in the GAC. This is still a hack, but its a better hack
3257         now.
3258         
3259 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3260
3261         * decl.cs, enum.cs: Improved error 3005 reporting.
3262   
3263         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3264         (related_symbols): New private member for list of symbols
3265         related to reported error/warning.
3266         
3267         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3268
3269 2004-04-29  Martin Baulig  <martin@ximian.com>
3270
3271         * ecore.cs (Expression.Constantify): If we're an enum and
3272         TypeManager.TypeToCoreType() doesn't give us another type, use
3273         t.UnderlyingSystemType.  Fixes #56178.  
3274
3275 2004-04-29  Martin Baulig  <martin@ximian.com>
3276
3277         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3278         interfaces and for each interface, only add members directly
3279         declared in that interface.  Fixes #53255.
3280
3281 2004-04-28  Martin Baulig  <martin@ximian.com>
3282
3283         * expression.cs (ConditionalLogicalOperator): Use a temporary
3284         variable for `left' to avoid that we evaluate it more than once;
3285         bug #52588.
3286
3287 2004-04-28  Martin Baulig  <martin@ximian.com>
3288
3289         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3290         `void[]' (CS1547).
3291
3292 2004-04-28  Martin Baulig  <martin@ximian.com>
3293
3294         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3295         void (CS1547).
3296
3297         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3298         whether the type is not void (CS1547).
3299
3300 2004-04-28  Martin Baulig  <martin@ximian.com>
3301
3302         * expression.cs (Unary.DoResolveLValue): Override this and report
3303         CS0131 for anything but Operator.Indirection.
3304
3305 2004-04-28  Martin Baulig  <martin@ximian.com>
3306
3307         Committing a patch from Ben Maurer; see bug #50820.
3308
3309         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3310         check for classes.
3311
3312         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3313         classes.        
3314
3315 2004-04-28  Martin Baulig  <martin@ximian.com>
3316
3317         Committing a patch from Ben Maurer; see bug #50820.
3318
3319         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3320         check for classes.
3321
3322         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3323         classes.        
3324
3325 2004-04-28  Martin Baulig  <martin@ximian.com>
3326
3327         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3328         (Block.AddLabel): Call DoLookupLabel() to only search in the
3329         current block.
3330
3331 2004-04-28  Martin Baulig  <martin@ximian.com>
3332
3333         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3334         comparing StringConstants and NullLiterals in Equality and Inequality.
3335
3336 2004-04-28  Jackson Harper  <jackson@ximian.com>
3337
3338         * driver.cs: Attempt to load referenced assemblies from the
3339         GAC. This is the quick and dirty version of this method that
3340         doesnt take into account versions and just takes the first
3341         canidate found. Will be good enough for now as we will not have more
3342         then one version installed into the GAC until I update this method.
3343
3344 2004-04-28  Martin Baulig  <martin@ximian.com>
3345
3346         * typemanager.cs (TypeManager.CheckStructCycles): New public
3347         static method to check for cycles in the struct layout.
3348
3349         * rootcontext.cs (RootContext.PopulateTypes): Call
3350         TypeManager.CheckStructCycles() for each TypeContainer.
3351         [Note: We only need to visit each type once.]
3352
3353 2004-04-28  Martin Baulig  <martin@ximian.com>
3354
3355         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3356
3357         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3358         success and added `out object value'.  Use a `bool resolved' field
3359         to check whether we've already been called rather than
3360         `ConstantValue != null' since this breaks for NullLiterals.
3361
3362 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3363
3364         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3365         setting of this flag, since the 'set' method may be non-public.
3366
3367 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3368
3369         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3370         check on current_vector.Block.
3371
3372 2004-04-27  Martin Baulig  <martin@ximian.com>
3373
3374         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3375         a field initializer.  Fixes #56459.
3376
3377 2004-04-27  Martin Baulig  <martin@ximian.com>
3378
3379         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3380         we're not attempting to use an indexer.  Fixes #52154.
3381
3382 2004-04-27  Martin Baulig  <martin@ximian.com>
3383
3384         * statement.cs (Return): Don't create a return label if we don't
3385         need it; reverts my change from January 20th.  Thanks to Ben
3386         Maurer for this.
3387
3388 2004-04-27  Martin Baulig  <martin@ximian.com>
3389
3390         According to the spec, `goto' can only leave a nested scope, but
3391         never enter it.
3392
3393         * statement.cs (Block.LookupLabel): Only lookup in the current
3394         block, don't recurse into parent or child blocks.
3395         (Block.AddLabel): Check in parent and child blocks, report
3396         CS0140/CS0158 if we find a duplicate.
3397         (Block): Removed this indexer for label lookups.
3398         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3399         this already does the error reporting for us.
3400
3401         * flowanalysis.cs
3402         (FlowBranching.UsageVector.Block): New public variable; may be null.
3403         (FlowBranching.CreateSibling): Added `Block' argument.
3404         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3405         label for the target of a `goto' and check whether we're not
3406         leaving a `finally'.
3407
3408 2004-04-27  Martin Baulig  <martin@ximian.com>
3409
3410         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3411         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3412         just for returns).
3413
3414 2004-04-27  Martin Baulig  <martin@ximian.com>
3415
3416         * statement.cs (Block.AddLabel): Also check for implicit blocks
3417         and added a CS0158 check.
3418
3419 2004-04-27  Martin Baulig  <martin@ximian.com>
3420
3421         * flowanalysis.cs (FlowBranchingLoop): New class.
3422         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3423         UsageVector's instead of an ArrayList.
3424         (FlowBranching.Label): Likewise.
3425         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3426         (FlowBranching.AddBreakVector): New method.
3427
3428 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3429
3430         * attribute.cs: Small regression fix: only convert the type if we
3431         the type is different, fixes System.Drawing build.
3432
3433 2004-04-27  Martin Baulig  <martin@ximian.com>
3434
3435         * attribute.cs (Attribute.Resolve): If we have a constant value
3436         for a named field or property, implicity convert it to the correct
3437         type.
3438
3439 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3440
3441         * statement.cs (Block.Block): Implicit blocks share
3442         'child_variable_names' fields with parent blocks.
3443         (Block.AddChildVariableNames): Remove.
3444         (Block.AddVariable): Mark variable as "used by a child block" in
3445         every surrounding block.
3446         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3447         been used in a child block, complain about violation of "Invariant
3448         meaning in blocks" rule.
3449         * cs-parser.jay (declare_local_variables): Don't use
3450         AddChildVariableNames.
3451         (foreach_statement): Don't create an implicit block: 'foreach'
3452         introduces a scope.
3453
3454 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3455
3456         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3457         converting from 0L to ulong.  Fixes 57522.
3458
3459 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3460
3461         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3462         derived class hides via 'new' keyword field from base class (test-242.cs).
3463         TODO: Handle this in the more general way.
3464         
3465         * class.cs (CheckBase): Ditto.
3466
3467 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3468
3469         * decl.cs (caching_flags): New member for storing cached values
3470         as bit flags.
3471         (MemberCore.Flags): New enum where bit flags for caching_flags
3472         are defined.
3473         (MemberCore.cls_compliance): Moved to caching_flags.
3474         (DeclSpace.Created): Moved to caching_flags.
3475
3476         * class.cs: Use caching_flags instead of DeclSpace.Created
3477         
3478 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3479
3480         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3481         if we are only a derived class, not a nested class.
3482
3483         * typemanager.cs: Same as above, but do this at the MemberLookup
3484         level (used by field and methods, properties are handled in
3485         PropertyExpr).   Allow for the qualified access if we are a nested
3486         method. 
3487
3488 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3489
3490         * class.cs: Refactoring.
3491         (IMethodData): New inteface; Holds links to parent members
3492         to avoid member duplication (reduced memory allocation).
3493         (Method): Implemented IMethodData interface.
3494         (PropertyBase): New inner classes for get/set methods.
3495         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3496         (Event): New inner classes for add/remove methods.
3497         (Event.DelegateMethod): Implemented IMethodData interface.
3498
3499         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3500         EmitContext (related to class.cs refactoring).
3501
3502 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3503
3504         * delegate.cs (Delegate.VerifyApplicability): If the number of
3505         arguments are the same as the number of parameters, first try to
3506         verify applicability ignoring  any 'params' modifier on the last
3507         parameter.
3508         Fixes #56442.
3509
3510 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3511
3512         * class.cs (TypeContainer.AddIndexer): Use
3513         'ExplicitInterfaceName' to determine if interface name was
3514         explicitly specified.  'InterfaceType' is not initialized at this time.
3515         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3516         Indexers array is already in the required order.  Initialize
3517         'IndexerName' only if there are normal indexers.
3518         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3519         (TypeContainer.Emit): Emit DefaultMember attribute only if
3520         IndexerName is initialized.
3521         Fixes #56300.
3522
3523 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3524
3525         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3526         Fixes #57007
3527
3528 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3529
3530         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3531         attributes.
3532         Fix for #56456.
3533
3534         * attribute.cs (Attribute.Resolve): Check for duplicate named
3535         attributes.
3536         Fix for #56463.
3537
3538 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3539
3540         * iterators.cs (MarkYield): track whether we are in an exception,
3541         and generate code accordingly.  Use a temporary value to store the
3542         result for our state.
3543
3544         I had ignored a bit the interaction of try/catch with iterators
3545         since their behavior was not entirely obvious, but now it is
3546         possible to verify that our behavior is the same as MS .NET 2.0
3547
3548         Fixes 54814
3549
3550 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3551
3552         * iterators.cs: Avoid creating temporaries if there is no work to
3553         do. 
3554
3555         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3556         Enumerations, use TypeManager.EnumToUnderlying and call
3557         recursively. 
3558
3559         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3560         bug #57013
3561
3562         (This.Emit): Use EmitContext.EmitThis to emit our
3563         instance variable.
3564
3565         (This.EmitAssign): Ditto.
3566
3567         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3568         codepaths, we will move all the functionality into
3569         Mono.CSharp.This 
3570
3571         (FieldExpr.EmitAssign): Ditto.
3572
3573         This fixes several hidden bugs that I uncovered while doing a code
3574         review of this today.
3575
3576         * codegen.cs (EmitThis): reworked so the semantics are more clear
3577         and also support value types "this" instances.
3578
3579         * iterators.cs: Changed so that for iterators in value types, we
3580         do not pass the value type as a parameter.  
3581
3582         Initialization of the enumerator helpers is now done in the caller
3583         instead of passing the parameters to the constructors and having
3584         the constructor set the fields.
3585
3586         The fields have now `assembly' visibility instead of private.
3587
3588 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3589
3590         * expression.cs (Argument.Resolve): Check if fields passed as ref
3591         or out are contained in a MarshalByRefObject.
3592
3593         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3594         another compiler type.
3595
3596 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3597
3598         * class.cs (Indexer.Define): use the new name checking method.
3599         Also, return false on an error.
3600         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3601         (is_identifier_[start/part]_character): make static.
3602
3603 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3604
3605         * expression.cs (Binary.ResolveOperator): Do no append strings
3606         twice: since we can be invoked more than once (array evaluation)
3607         on the same concatenation, take care of this here.  Based on a fix
3608         from Ben (bug #56454)
3609
3610 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3611
3612         * codegen.cs: Fix another case where CS1548 must be reported (when 
3613         delay-sign isn't specified and no private is available #56564). Fix
3614         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3615         error when MCS is used on the MS runtime and we need to delay-sign 
3616         (which seems unsupported by AssemblyBuilder - see #56621).
3617
3618 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3619
3620         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3621         (TypeManager.ComputeNamespaces): Faster implementation for
3622         Microsoft runtime.
3623
3624         * compiler.csproj: Updated AssemblyName to mcs.
3625
3626 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3627
3628         * rootcontext.cs: Add new types to the boot resolution.
3629
3630         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3631         MulticastDelegate is not allowed.
3632
3633         * typemanager.cs: Add new types to lookup: System.TypedReference
3634         and ArgIterator.
3635
3636         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3637         check for TypedReference or ArgIterator, they are not allowed. 
3638
3639         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3640         makes us properly catch 1510 in some conditions (see bug 56016 for
3641         details). 
3642
3643 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3644
3645         * CryptoConvert.cs: update from corlib version
3646         with endian fixes.
3647
3648 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3649
3650         * class.cs (Indexer.Define): Check indexername declaration
3651
3652 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3653
3654         * attribute.cs (IsClsCompliant): Fixed problem with handling
3655         all three states (compliant, not-compliant, undetected).
3656
3657 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3658
3659         * attribute.cs (Attribute): Location is now public.
3660         (Resolve): Store resolved arguments (pos_values) in attribute class.
3661         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3662         (GetClsCompliantAttributeValue): New method that gets
3663         CLSCompliantAttribute value.
3664         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3665         if exists else null.
3666         (AttributeTester): New class for CLS-Compliant verification routines.
3667
3668         * class.cs (Emit): Add CLS-Compliant verification.
3669         (Method.GetSignatureForError): Implemented.
3670         (Constructor.GetSignatureForError): Implemented
3671         (Constructor.HasCompliantArgs): Returns if constructor has
3672         CLS-Compliant arguments.
3673         (Constructor.Emit): Override.
3674         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3675         is needed to test only parameters.
3676         (FieldBase.GetSignatureForError): Implemented.
3677         (TypeContainer): New member for storing base interfaces.
3678         (TypeContainer.FindMembers): Search in base interfaces too.
3679
3680         * codegen.cs (GetClsComplianceAttribute): New method that gets
3681         assembly or module CLSCompliantAttribute value.
3682         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3683         for assembly.
3684         (ModuleClass.Emit): Add error 3012 test.
3685
3686         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3687
3688         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3689         state for all decl types.
3690         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3691         if CLS-Compliant tests are required.
3692         (IsClsCompliaceRequired): New method. Analyze whether code
3693         must be CLS-Compliant.
3694         (IsExposedFromAssembly): New method. Returns true when MemberCore
3695         is exposed from assembly.
3696         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3697         value or gets cached value.
3698         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3699         is explicitly marked with CLSCompliantAttribute.
3700         (IsIdentifierClsCompliant): New abstract method. This method is
3701         used to testing error 3005.
3702         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3703         for identifier and parameters CLS-Compliant testing.
3704         (VerifyClsCompliance): New method. The main virtual method for
3705         CLS-Compliant verifications.
3706         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3707         null. I don't know why is null (too many public members !).
3708         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3709         and get value of first CLSCompliantAttribute that found.
3710
3711         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3712         (VerifyClsCompliance): Override and add extra tests.
3713
3714         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3715         clscheck- disable CLS-Compliant verification event if assembly is has
3716         CLSCompliantAttribute(true).
3717
3718         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3719         ApllyAttribute is now called in emit section as in the other cases.
3720         Possible future Emit integration.
3721         (IsIdentifierClsCompliant): New override.
3722         (VerifyClsCompliance): New override.
3723         (GetEnumeratorName): Returns full enum name.
3724
3725         * parameter.cs (GetSignatureForError): Implemented.
3726
3727         * report.cs (WarningData): New struct for Warning message information.
3728         (LocationOfPreviousError): New method.
3729         (Warning): New method. Reports warning based on the warning table.
3730         (Error_T): New method. Reports error based on the error table.
3731
3732         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3733         verifications are done here.
3734
3735         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3736
3737         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3738         CLSCompliantAttribute.
3739         (all_imported_types): New member holds all imported types from other
3740         assemblies.
3741         (LoadAllImportedTypes): New method fills static table with exported types
3742         from all referenced assemblies.
3743         (Modules): New property returns all assembly modules.
3744
3745 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3746
3747         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3748         throwing a parser error.
3749
3750         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3751         which removes the hardcoded get_/set_ prefixes for properties, as
3752         IL allows for the properties to be named something else.  
3753
3754         Bug #56013
3755
3756         * expression.cs: Do not override operand before we know if it is
3757         non-null.  Fix 56207
3758
3759 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3760
3761         * typemanager.cs: support for pinned variables.
3762
3763 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3764
3765         * decl.cs, typemanager.cs: Avoid using an arraylist
3766         as a buffer if there is only one result set.
3767
3768 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3769
3770         * expression.cs: Make sure you cant call a static method
3771         with an instance expression, bug #56174.
3772
3773 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3774
3775         * class.cs (IsDuplicateImplementation): Improve error reporting to
3776         flag 663 (method only differs in parameter modifier).
3777
3778         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3779         in preprocessor directives.
3780
3781         * location.cs (LookupFile): Allow for the empty path.
3782
3783         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3784         better approach for some of that patch, but its failing with the
3785         CharSet enumeration.  For now try/catch will do.
3786
3787         * typemanager.cs: Do not crash if a struct does not have fields.
3788         Fixes 56150.
3789
3790 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3791
3792         * expression.cs: cs0213, cant fix a fixed expression.
3793         fixes 50231.
3794
3795 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3796
3797         * cs-parser.jay: detect invalid embeded statements gracefully.
3798         bug #51113.
3799
3800 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3801
3802         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3803         As a regex:
3804         s/
3805         the invocation type may not be a subclass of the tye of the item/
3806         The type of the item must be a subclass of the invocation item.
3807         /g
3808
3809         Fixes bug #50820.
3810
3811 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3812
3813         * attribute.cs: Added methods to get a string and a bool from an
3814         attribute. Required to information from AssemblyKeyFileAttribute,
3815         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3816         * codegen.cs: Modified AssemblyName creation to include support for
3817         strongnames. Catch additional exceptions to report them as CS1548.
3818         * compiler.csproj: Updated include CryptoConvert.cs.
3819         * compiler.csproj.user: Removed file - user specific configuration.
3820         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3821         Mono.Security assembly. The original class is maintained and tested in
3822         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3823         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3824         like CSC 8.0 (C# v2) supports.
3825         * Makefile: Added CryptoConvert.cs to mcs sources.
3826         * rootcontext.cs: Added new options for strongnames.
3827
3828 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3829
3830         * driver.cs: For --expect-error, report error code `2'
3831         if the program compiled with no errors, error code `1' if
3832         it compiled with an error other than the one expected.
3833
3834 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3835
3836         * compiler.csproj: Updated for Visual Studio .NET 2003.
3837         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3838         * compiler.sln: Updated for Visual Studio .NET 2003.
3839
3840 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3841
3842         * expression.cs: Fix bug #47234. We basically need to apply the
3843         rule that we prefer the conversion of null to a reference type
3844         when faced with a conversion to 'object' (csc behaviour).
3845
3846 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3847
3848         * statement.cs: Shorter form for foreach, eliminates
3849         a local variable. r=Martin.
3850
3851 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3852
3853         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3854         checks if we can use brtrue/brfalse to test for 0.
3855         * expression.cs: use the above in the test for using brtrue/brfalse.
3856         cleanup code a bit.
3857
3858 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3859
3860         * expression.cs: Rewrite string concat stuff. Benefits:
3861
3862         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3863         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3864         rather than a concat chain.
3865
3866         * typemanager.cs: Add lookups for more concat overloads.
3867
3868 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3869
3870         * expression.cs: Emit shorter il code for array init.
3871
3872         newarr
3873         dup
3874         // set 1
3875
3876         // set 2
3877
3878         newarr
3879         stloc.x
3880
3881         ldloc.x
3882         // set 1
3883
3884         ldloc.x
3885         // set 2
3886
3887 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3888
3889         * statement.cs: Before, two switch blocks would be merged if the
3890         total size of the blocks (end_item - begin_item + 1) was less than
3891         two times the combined sizes of the blocks.
3892
3893         Now, it will only merge if after the merge at least half of the
3894         slots are filled.
3895
3896         fixes 55885.
3897
3898 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3899
3900         * class.cs : csc build fix for GetMethods(). See bug #52503.
3901
3902 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3903
3904         * expression.cs: Make sure fp comparisons work with NaN.
3905         This fixes bug #54303. Mig approved this patch a long
3906         time ago, but we were not able to test b/c the runtime
3907         had a related bug.
3908
3909 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3910
3911         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3912
3913 2004-03-19  Martin Baulig  <martin@ximian.com>
3914
3915         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3916         error here and not in our caller.
3917
3918 2004-03-19  Martin Baulig  <martin@ximian.com>
3919
3920         * interface.cs: Completely killed this file.
3921         (Interface): We're now a TypeContainer and live in class.cs.
3922
3923         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3924         argument; we're now also called for interfaces.
3925         (TypeContainer.DefineMembers): Allow this method being called
3926         multiple times.
3927         (TypeContainer.GetMethods): New public method; formerly known as
3928         Interface.GetMethod().  This is used by PendingImplementation.
3929         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3930         it's now private and non-static.
3931         (Interface): Moved this here; it's now implemented similar to
3932         Class and Struct.
3933         (Method, Property, Event, Indexer): Added `bool is_interface'
3934         argument to their .ctor's.
3935         (MemberBase.IsInterface): New public field.
3936
3937         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3938         instances instead of InterfaceMethod, InterfaceProperty, etc.
3939         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3940         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3941
3942 2004-03-19  Martin Baulig  <martin@ximian.com>
3943
3944         * class.cs (MethodCore.IsDuplicateImplementation): New private
3945         method which does the CS0111 checking.
3946         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3947         Use IsDuplicateImplementation().
3948
3949 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3950
3951         * decl.cs (FindMemberToOverride): New method to find the correct
3952         method or property to override in the base class.
3953         * class.cs
3954             - Make Method/Property use the above method to find the
3955               version in the base class.
3956             - Remove the InheritableMemberSignatureCompare as it is now
3957               dead code.
3958
3959         This patch makes large code bases much faster to compile, as it is
3960         O(n) rather than O(n^2) to do this validation.
3961
3962         Also, it fixes bug 52458 which is that nested classes are not
3963         taken into account when finding the base class member.
3964
3965         Reviewed/Approved by Martin.
3966
3967 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3968
3969         * interface.cs: In all interface classes removed redundant
3970         member initialization.
3971
3972 2004-03-16  Martin Baulig  <martin@ximian.com>
3973
3974         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3975
3976 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3977
3978         * decl.cs (DefineTypeAndParents): New helper method to define a
3979         type's containers before the type itself is defined;  This is a
3980         bug exposed by the recent changes to Windows.Forms when an
3981         implemented interface was defined inside a class that had not been
3982         built yet.   
3983
3984         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3985
3986         (Check): Loop correctly to report errors modifiers
3987         (UNSAFE was not in the loop, since it was the same as TOP).
3988
3989         * interface.cs: Every interface member now takes a ModFlags,
3990         instead of a "is_new" bool, which we set on the base MemberCore. 
3991
3992         Every place where we called "UnsafeOk" in the interface, now we
3993         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3994         the unsafe settings from the member declaration instead of the
3995         container interface. 
3996
3997         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3998
3999         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4000         `set_indexer_name' to the pending bits (one per type).
4001
4002         We fixed a bug today that was picking the wrong method to
4003         override, since for properties the existing InterfaceMethod code
4004         basically ignored the method name.  Now we make sure that the
4005         method name is one of the valid indexer names.
4006
4007 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4008  
4009         * support.cs (SeekableStreamReader): Keep track of stream byte
4010         positions and don't mix them with character offsets to the buffer.
4011
4012         Patch from Gustavo Giráldez
4013
4014 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4015
4016         * interface.cs (InterfaceSetGetBase): Removed double member
4017         initialization, base class does it as well.
4018
4019 2004-03-13  Martin Baulig  <martin@ximian.com>
4020
4021         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4022         when compiling corlib.
4023
4024 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4025
4026         * convert.cs (ExplicitConversion): We were reporting an error on
4027         certain conversions (object_type source to a value type, when the
4028         expression was `null') before we had a chance to pass it through
4029         the user defined conversions.
4030
4031         * driver.cs: Replace / and \ in resource specifications to dots.
4032         Fixes 50752
4033
4034         * class.cs: Add check for duplicate operators.  Fixes 52477
4035
4036 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4037
4038         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4039         that are in the middle of the statements, not only at the end.
4040         Fixes #54987
4041
4042         * class.cs (TypeContainer.AddField): No longer set the
4043         `HaveStaticConstructor' flag, now we call it
4044         `UserDefineStaticConstructor' to diferentiate the slightly
4045         semantic difference.
4046
4047         The situation is that we were not adding BeforeFieldInit (from
4048         Modifiers.TypeAttr) to classes that could have it.
4049         BeforeFieldInit should be set to classes that have no static
4050         constructor. 
4051
4052         See:
4053
4054         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4055
4056         And most importantly Zoltan's comment:
4057
4058         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4059
4060         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4061          before its static fields are used', i.e. initialization does not need
4062          to be triggered by the first access to the type. Setting this flag
4063          helps the JIT to compile better code, since it can run the static
4064          constructor at JIT time, and does not need to generate code to call it
4065          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4066          this flag for lots of classes like String. 
4067          
4068          csc sets this flag if the type does not have an explicit static 
4069          constructor. The reasoning seems to be that if there are only static
4070          initalizers for a type, and no static constructor, then the programmer
4071          does not care when this initialization happens, so beforefieldinit
4072          can be used.
4073          
4074          This bug prevents the AOT compiler from being usable, since it 
4075          generates so many calls to mono_runtime_class_init that the AOT code
4076          is much slower than the JITted code. The JITted code is faster, 
4077          because it does not generate these calls if the vtable is type is
4078          already initialized, which is true in the majority of cases. But the
4079          AOT compiler can't do this."
4080
4081 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4082
4083         * class.cs (MethodData.Emit): Refactor the code so symbolic
4084         information is generated for destructors;  For some reasons we
4085         were taking a code path that did not generate symbolic information
4086         before. 
4087
4088 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4089
4090         * class.cs: Create a Constructor.CheckBase method that
4091         takes care of all validation type code. The method
4092         contains some code that was moved from Define.
4093
4094         It also includes new code that checks for duplicate ctors.
4095         This fixes bug #55148.
4096
4097 2004-03-09  Joshua Tauberer <tauberer@for.net>
4098
4099         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4100         a { ... }-style array creation invokes EmitStaticInitializers
4101         which is not good for reference-type arrays.  String, decimal
4102         and now null constants (NullCast) are not counted toward
4103         static initializers.
4104
4105 2004-03-05  Martin Baulig  <martin@ximian.com>
4106
4107         * location.cs (SourceFile.HasLineDirective): New public field;
4108         specifies whether the file contains or is referenced by a "#line"
4109         directive.
4110         (Location.DefineSymbolDocuments): Ignore source files which
4111         either contain or are referenced by a "#line" directive.        
4112
4113 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4114
4115         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4116         direct access to our parent, so check the method inline there.
4117
4118 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4119
4120         * expression.cs (Invocation.EmitCall): Miguel's last commit
4121         caused a regression. If you had:
4122
4123             T t = null;
4124             t.Foo ();
4125
4126         In Foo the implict this would be null.
4127
4128 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4129
4130         * expression.cs (Invocation.EmitCall): If the method is not
4131         virtual, do not emit a CallVirt to it, use Call.
4132
4133         * typemanager.cs (GetFullNameSignature): Improve the method to
4134         cope with ".ctor" and replace it with the type name.
4135
4136         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4137         as an argument the ConstructorBuilder where it is being defined,
4138         to catch the recursive constructor invocations.
4139
4140 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4141
4142         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4143         routines to check if a type is an enumerable/enumerator allow
4144         classes that implement the IEnumerable or IEnumerator interfaces.
4145
4146         * class.cs (Property, Operator): Implement IIteratorContainer, and
4147         implement SetYields.
4148
4149         (Property.Define): Do the block swapping for get_methods in the
4150         context of iterators.   We need to check if Properties also
4151         include indexers or not.
4152
4153         (Operator): Assign the Block before invoking the
4154         OperatorMethod.Define, so we can trigger the Iterator code
4155         replacement. 
4156
4157         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4158         Property and Operator classes are not created when we parse the
4159         declarator but until we have the block completed, so we use a
4160         singleton SimpleIteratorContainer.Simple to flag whether the
4161         SetYields has been invoked.
4162
4163         We propagate this setting then to the Property or the Operator to
4164         allow the `yield' to function.
4165
4166 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4167
4168         * codegen.cs: Implemented attribute support for modules.
4169         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4170         Assembly/Module functionality.
4171
4172         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4173         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4174         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4175
4176 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4177
4178         * interface.cs (FindMembers): The operation is performed on all base
4179         interfaces and not only on the first. It is required for future CLS Compliance patch.
4180
4181 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4182
4183         * statement.cs, codegen.cs:
4184         This patch deals with patterns such as:
4185
4186         public class List : IEnumerable {
4187
4188                 public MyEnumerator GetEnumerator () {
4189                         return new MyEnumerator(this);
4190                 }
4191
4192                 IEnumerator IEnumerable.GetEnumerator () {
4193                         ...
4194                 }
4195                 
4196                 public struct MyEnumerator : IEnumerator {
4197                         ...
4198                 }
4199         }
4200
4201         Before, there were a few things we did wrong:
4202         1) we would emit callvirt on a struct, which is illegal
4203         2) we emited ldarg when we needed to emit ldarga
4204         3) we would mistakenly call the interface methods on an enumerator
4205         type that derived from IEnumerator and was in another assembly. For example:
4206
4207         public class MyEnumerator : IEnumerator
4208
4209         Would have the interface methods called, even if there were public impls of the
4210         method. In a struct, this lead to invalid IL code.
4211
4212 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4213
4214         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4215           renamed to Emit.
4216
4217         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4218
4219 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4220
4221         * cs-parser.jay: Fix small regression: we were not testing V2
4222         compiler features correctly.
4223
4224         * interface.cs: If the emit context is null, then create one
4225
4226 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4227
4228         * decl.cs (GetSignatureForError): New virtual method to get full name
4229           for error messages.
4230
4231         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4232           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4233
4234         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4235           Duplicated members and code in these classes has been removed.
4236           Better encapsulation in these classes.
4237
4238 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4239
4240         * assign.cs (Assign.DoResolve): When dealing with compound
4241         assignments, there is a new rule in ECMA C# 2.4 (might have been
4242         there before, but it is documented here) that states that in:
4243
4244         a op= b;
4245
4246         If b is of type int, and the `op' is a shift-operator, then the
4247         above is evaluated as:
4248
4249         a = (int) a op b 
4250
4251         * expression.cs (Binary.ResolveOperator): Instead of testing for
4252         int/uint/long/ulong, try to implicitly convert to any of those
4253         types and use that in pointer arithmetic.
4254
4255         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4256         method to print information for from the type, not from the
4257         null-method we were given.
4258
4259 2004-02-01  Duncan Mak  <duncan@ximian.com>
4260
4261         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4262         parsing for cmd, fixes bug #53694.
4263
4264 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4265
4266         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4267         in the member name duplication tests. Property and operator name duplication
4268         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4269
4270 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4271
4272         * interface.cs (PopulateMethod): Fixed crash when interface method
4273         returns not existing type (error test cs0246-3.cs).
4274
4275 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4276
4277         * cs-parser.jay (interface_accessors): Re-write actions to also
4278         store attributes attached to get and set methods. Fix spelling
4279         while at it.
4280
4281         (inteface_property_declaration): Modify accordingly.
4282
4283         (InterfaceAccessorInfo): New helper class to store information to pass
4284         around between rules that use interface_accessors.
4285
4286         * interface.cs (Emit): Apply attributes on the get and set
4287         accessors of properties and indexers too.
4288
4289         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4290         right MethodBuilder when applying attributes to the get and set accessors.
4291
4292 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4293
4294         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4295
4296 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4297
4298         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4299
4300 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4301
4302         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4303         changes that treat `yield' specially when present before `break'
4304         or `return' tokens.
4305
4306         * cs-tokenizer.cs: yield is no longer a keyword.
4307
4308 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4309
4310         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4311         setting for default constructors.
4312         For default constructors are almost every time set wrong Modifier. The
4313         generated IL code has been alright. But inside mcs this values was
4314         wrong and this was reason why several of my CLS Compliance tests
4315         failed.
4316
4317 2004-01-22  Martin Baulig  <martin@ximian.com>
4318
4319         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4320         not a QualifiedIdentifier.  This is what `type_name_expression'
4321         was previously doing.
4322         (type_name_expression): Removed; the code is now in
4323         `namespace_or_type_name'.
4324         (qualified_identifier): Removed, use `namespace_or_type_name'
4325         instead.
4326         (QualifiedIdentifier): Removed this class.      
4327
4328 2004-01-22  Martin Baulig  <martin@ximian.com>
4329
4330         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4331         not a string as alias name.
4332
4333 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4334
4335         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4336         #52730 bug, and instead compute correctly the need to use a
4337         temporary variable when requesting an address based on the
4338         static/instace modified of the field and the constructor.
4339  
4340 2004-01-21  Martin Baulig  <martin@ximian.com>
4341
4342         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4343         class and namespace before looking up aliases.  Fixes #52517.
4344
4345 2004-01-21  Martin Baulig  <martin@ximian.com>
4346
4347         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4348         assinged in a 'try'; fixes exception4.cs.
4349
4350 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4351         * class.cs : Implemented parameter-less constructor for TypeContainer
4352
4353         * decl.cs: Attributes are now stored here. New property OptAttributes
4354
4355         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4356
4357         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4358
4359 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4360
4361         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4362           (CSharpSignature): New method for indexer and property signature.
4363
4364 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4365
4366         * pending.cs (IsVirtualFilter): Faster implementation.
4367
4368 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4369
4370         * typemanager.cs: Avoid inclusion of same assembly more than once.
4371
4372 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4373
4374         * cs-parser.jay: Fixed problem where the last assembly attribute
4375           has been applied also to following declaration (class, struct, etc.)
4376           
4377 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4378
4379         * class.cs: Added error CS0538, CS0539 reporting.
4380         Fixed crash on Microsoft runtime when field type is void.
4381
4382         * cs-parser.jay: Added error CS0537 reporting.
4383
4384         * pending.cs: Added error CS0535 reporting.
4385         Improved error report for errors CS0536, CS0534.
4386
4387 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4388
4389         Merge a few bits from the Anonymous Method MCS tree.
4390
4391         * statement.cs (ToplevelBlock): New class for toplevel methods,
4392         will hold anonymous methods, lifted variables.
4393
4394         * cs-parser.jay: Create toplevel blocks for delegates and for
4395         regular blocks of code. 
4396
4397 2004-01-20  Martin Baulig  <martin@ximian.com>
4398
4399         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4400         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4401         and `NeedExplicitReturn'; added `IsLastStatement'.
4402         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4403         have a `ReturnLabel' or we're not unreachable.
4404
4405         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4406         child's reachability; don't just override ours with it.  Fixes
4407         #58058 (lluis's example).
4408         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4409         InFinally(), InLoop(), InSwitch() and
4410         BreakCrossesTryCatchBoundary() methods.
4411
4412         * statement.cs (Return): Do all error checking in Resolve().
4413         Unless we are the last statement in a top-level block, always
4414         create a return label and jump to it.
4415         (Break, Continue): Do all error checking in Resolve(); also make
4416         sure we aren't leaving a `finally'.
4417         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4418         statement in a top-level block.
4419         (Block.Flags): Added `IsDestructor'.
4420         (Block.IsDestructor): New public property.
4421
4422 2004-01-20  Martin Baulig  <martin@ximian.com>
4423
4424         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4425
4426 2004-01-20  Martin Baulig  <martin@ximian.com>
4427
4428         * statement.cs (Statement.ResolveUnreachable): New public method.
4429         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4430         (Block.Resolve): Resolve unreachable statements.
4431
4432 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4433
4434         * expression.cs: We need to fix the case where we do
4435         not have a temp variable here.
4436
4437         * assign.cs: Only expression compound assignments need
4438         temporary variables.
4439
4440 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4441
4442         * flowanalysis.cs: Reduce memory allocation in a few ways:
4443           - A block with no variables should not allocate a bit
4444             vector for itself.
4445           - A method with no out parameters does not need any tracking
4446             for assignment of the parameters, so we need not allocate
4447             any data for it.
4448           - The arrays:
4449                 public readonly Type[] VariableTypes;
4450                 public readonly string[] VariableNames;
4451             Are redundant. The data is already stored in the variable
4452             map, so we need not allocate another array for it.
4453           - We need to add alot of checks for if (params | locals) == null
4454             due to the first two changes.
4455
4456 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4457
4458         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4459         implement IMemoryLocation, we store a copy on a local variable and
4460         take the address of it.  Patch from Benjamin Jemlich
4461
4462         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4463         to use a special "type_name_expression" rule which reduces the
4464         number of "QualifiedIdentifier" classes created, and instead
4465         directly creates MemberAccess expressions.
4466
4467 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4468
4469         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4470         that fixes #52853.  Null literal assignment to ValueType
4471
4472         * class.cs (MethodData.Emit): Instead of checking the name of the
4473         method to determine if its a destructor, create a new derived
4474         class from Method called Destructor, and test for that.  
4475
4476         * cs-parser.jay: Create a Destructor object instead of a Method.  
4477
4478         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4479
4480         Fixes: 52933
4481
4482 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4483
4484         * expression.cs (Binary.ResolveOperator): Perform an implicit
4485         conversion from MethodGroups to their delegate types on the
4486         Addition operation.
4487
4488         * delegate.cs: Introduce a new class DelegateCreation that is the
4489         base class for `NewDelegate' and `ImplicitDelegateCreation',
4490         factor some code in here.
4491
4492         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4493         conversion from MethodGroups to compatible delegate types. 
4494
4495         * ecore.cs (Expression.Resolve): Do not flag error 654
4496         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4497         we allow conversions from MethodGroups to delegate types now.
4498
4499         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4500         assignments in v2 either.
4501
4502 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4503
4504         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4505         static read-only fields in ctors.
4506
4507         Applied patch from Benjamin Jemlich 
4508
4509         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4510
4511 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4512
4513         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4514         here to return true, as they can be used like this:
4515
4516                 (XXX) int.MEMBER ()
4517
4518         Fixed 49836 and all the other dups
4519
4520 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4521
4522         * driver.cs: Implement /win32res and /win32icon.
4523
4524 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4525
4526         * cs-parser.jay: Add a rule to improve error handling for the
4527         common mistake of placing modifiers after the type.
4528
4529 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4530
4531         * cs-parser.jay (interface_event_declaration): Catch
4532         initialization of events on interfaces, and report cs0068
4533
4534         * cs-parser.jay (interface_event_declaration): Catch
4535         initialization of events. 
4536
4537         * ecore.cs: Better report missing constructors.
4538
4539         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4540         the error reporting done in the wrong place.  Fix.
4541
4542         * expression.cs (Binary.ResolveOperator): Catch the 
4543         operator + (E x, E y) error earlier, and later allow for implicit
4544         conversions in operator +/- (E e, U x) from U to the underlying
4545         type of E.
4546
4547         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4548         52596, if the container class is abstract, the default constructor
4549         is protected otherwise its public (before, we were always public).
4550
4551         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4552         fixed statement.
4553
4554         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4555         Jemlich that fixes bug #52597, MCS was generating invalid code for
4556         idisposable structs.   Thanks to Ben for following up with this
4557         bug as well.
4558
4559 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4560
4561         * driver.cs: Allow assemblies without code to be generated, fixes
4562         52230.
4563
4564 2004-01-07  Nick Drochak <ndrochak@gol.com>
4565
4566         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4567
4568 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4569
4570         * cs-parser.jay: Add rules to improve error reporting if fields or
4571         methods are declared at the namespace level (error 116)
4572
4573         * Add rules to catch event add/remove
4574
4575 2004-01-04  David Sheldon <dave-mono@earth.li>
4576
4577   * expression.cs: Added matching ")" to error message for 
4578   CS0077
4579
4580 2004-01-03 Todd Berman <tberman@gentoo.org>
4581
4582         * ecore.cs, attribute.cs:
4583         Applying fix from #52429.
4584
4585 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4586
4587         * ecore.cs, expression.cs, statement.cs:
4588         Total rewrite of how we handle branching. We
4589         now handle complex boolean expressions with fewer
4590         jumps. As well if (x == 0) no longer emits a ceq.
4591
4592         if (x is Foo) is much faster now, because we generate
4593         better code.
4594
4595         Overall, we get a pretty big improvement on our benchmark
4596         tests. The code we generate is smaller and more readable.
4597
4598         I did a full two-stage bootstrap. The patch was reviewed
4599         by Martin and Miguel.
4600
4601 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4602
4603         * cs-parser.jay: Make primary_expression not take a QI.
4604         we dont need this because the member_access rule covers
4605         us here. So we replace the rule with just IDENTIFIER.
4606
4607         This has two good effects. First, we remove a s/r conflict.
4608         Second, we allocate many fewer QualifiedIdentifier objects.
4609
4610 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4611
4612         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4613         set the correct information via SRE. This prevents
4614         hanging on the MS runtime. Fixes #29374.
4615
4616 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4617
4618         * convert.cs: correctly handle conversions to value types
4619         from Enum and ValueType as unboxing conversions.
4620
4621         Fixes bug #52569. Patch by Benjamin Jemlich.
4622
4623 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4624
4625         * expression.cs (BetterConversion): Prefer int -> uint
4626         over int -> ulong (csc's behaviour). This fixed bug #52046.
4627
4628 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4629
4630         * decl.cs (MemberCache.FindMembers): now returns a
4631         MemberInfo [].
4632
4633         * typemanager.cs: In general, go with with ^^.
4634         (CopyNewMethods): take an IList.
4635         (RealMemberLookup): Only allocate an arraylist
4636         if we copy from two sets of methods.
4637
4638         This change basically does two things:
4639         1) Fewer array lists allocated due to CopyNewMethods.
4640         2) the explicit cast in MemberList costed ALOT.
4641
4642 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4643
4644         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4645         a hashtable to avoid needless string allocations when an identifier is
4646         used more than once (the common case).
4647
4648 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4649
4650         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4651         is broken, it will not return anything. So, we
4652         have to use the information we have in mcs to
4653         do the task.
4654
4655         * typemanager.cs: Add a cache for GetInterfaces,
4656         since this will now be used more often (due to ^^)
4657
4658         (GetExplicitInterfaces) New method that gets the
4659         declared, not effective, interfaces on a type
4660         builder (eg, if you have interface IFoo, interface
4661         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4662         { IBar }.
4663
4664         This patch makes MCS able to bootstrap itself on
4665         Windows again.
4666
4667 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4668
4669         * expression.cs: Remove the Nop's that Miguel put
4670         in by mistake.
4671
4672 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4673
4674         * report.cs, codegen.cs: Give the real stack trace to
4675         the error when an exception is thrown.
4676
4677 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4678
4679         * decl.cs: only allocate hashtables for ifaces if 
4680         it is an iface!
4681
4682 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4683
4684         * expression.cs: fix the error from cs0121-2.cs
4685         (a parent interface has two child interfaces that
4686         have a function with the same name and 0 params
4687         and the function is called through the parent).
4688
4689 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4690
4691         * class.cs, rootcontext.cs, typmanager.cs: do not
4692         leak pointers.
4693
4694 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4695
4696         * codegen.cs: remove stack for the ec flow branching.
4697         It is already a linked list, so no need.
4698
4699 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4700
4701         * Makefile: Allow custom profiler here.
4702
4703 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4704
4705         * typemanager.cs (LookupType):
4706           - Use a static char [], because split takes
4707             a param array for args, so it was allocating
4708             every time.
4709           - Do not store true in a hashtable, it boxes.
4710
4711 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4712
4713         * flowanalysis.cs: bytify common enums.
4714
4715 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4716
4717         * modifiers.cs: Add a new set of flags for the
4718         flags allowed on explicit interface impls.
4719         * cs-parser.jay: catch the use of modifiers in
4720         interfaces correctly.
4721         * class.cs: catch private void IFoo.Blah ().
4722
4723         All related to bug #50572.
4724
4725 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4726
4727         * decl.cs: Rewrite the consistant accessability checking.
4728         Accessability is not linear, it must be implemented in
4729         a tableish way. Fixes #49704.
4730
4731 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4732
4733         * expression.cs: Handle negation in a checked context.
4734         We must use subtraction from zero. Fixes #38674.
4735
4736 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4737
4738         * class.cs: Ignore static void main in DLLs.
4739         * rootcontext.cs: Handle the target type here,
4740         since we are have to access it from class.cs
4741         * driver.cs: account for the above.
4742
4743 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4744
4745         * report.cs: Give line numbers and files if available.
4746
4747 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4748
4749         * driver.cs: Implement /addmodule.
4750
4751         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4752         ModuleBuilders.
4753
4754 2003-12-20  Martin Baulig  <martin@ximian.com>
4755
4756         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4757         (FieldBase.IsAssigned): Removed this field.
4758         (FieldBase.SetAssigned): New public method.
4759         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4760
4761 2003-12-20  Martin Baulig  <martin@ximian.com>
4762
4763         * expression.cs (LocalVariableReference.DoResolve): Don't set
4764         `vi.Used' if we're called from DoResolveLValue().
4765
4766         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4767         returns the usage vector it just merged into the current one -
4768         pass this one to UsageWarning().
4769         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4770         of the `EmitContext', don't call this recursively on our children.
4771
4772 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4773
4774         * driver.cs: Implement /target:module.
4775
4776 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4777
4778         * support.cs (CharArrayHashtable): New helper class.
4779
4780         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4781         char arrays, not strings, so we can avoid creating a string in
4782         consume_identifier if the identifier is a keyword.
4783
4784 2003-12-16  Martin Baulig  <martin@ximian.com>
4785
4786         * statement.cs (LocalInfo.Assigned): Removed this property.
4787         (LocalInfo.Flags): Removed `Assigned'.
4788         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4789         and uses flow analysis.
4790         (Block.UsageWarning): Made this method private.
4791         (Block.Resolve): Call UsageWarning() if appropriate.
4792
4793         * expression.cs (LocalVariableReference.DoResolve): Always set
4794         LocalInfo.Used here.
4795
4796 2003-12-13  Martin Baulig  <martin@ximian.com>
4797
4798         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4799         any value here; we're now using flow analysis to figure out
4800         whether a statement/block returns a value.
4801
4802 2003-12-13  Martin Baulig  <martin@ximian.com>
4803
4804         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4805         working again.
4806         (FlowBranching.MergeFinally): Don't call
4807         `branching.CheckOutParameters()' here, this is called in
4808         MergeTopBlock().
4809         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4810         when adding the `finally' vector.       
4811
4812 2003-12-13  Martin Baulig  <martin@ximian.com>
4813
4814         * flowanalysis.cs
4815         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4816         actually work and also fix #48962.
4817
4818 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4819
4820         * decl.cs: Do not check System.Object for nested types,
4821         since we know it does not have any. Big bang for buck:
4822
4823         BEFORE:
4824            Run 1:   8.35 seconds
4825            Run 2:   8.32 seconds
4826            corlib:  17.99 seconds
4827         AFTER:
4828            Run 1:   8.17 seconds
4829            Run 2:   8.17 seconds
4830            corlib:  17.39 seconds
4831
4832 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4833
4834         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4835         time we are returning 0 members, so we save alot here.
4836
4837 2003-12-11  Martin Baulig  <martin@ximian.com>
4838
4839         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4840         `MergeChild()', also just take the `FlowBranching' as argument;
4841         call Merge() on it and return the result.
4842         (FlowBranching.Merge): We don't need to do anything if we just
4843         have one sibling.
4844
4845 2003-12-11  Martin Baulig  <martin@ximian.com>
4846
4847         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4848         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4849         Maurer for this idea.
4850
4851 2003-12-11  Martin Baulig  <martin@ximian.com>
4852
4853         * flowanalysis.cs (MergeResult): This class is now gone; we now
4854         use the `UsageVector' for this.  The reason for this is that if a
4855         branching just has one sibling, we don't need to "merge" them at
4856         all - that's the next step to do.
4857         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4858         `MergeResult'.
4859
4860 2003-12-11  Martin Baulig  <martin@ximian.com>
4861
4862         Reworked flow analyis and made it more precise and bug-free.  The
4863         most important change is that we're now using a special `Reachability'
4864         class instead of having "magic" meanings of `FlowReturns'.  I'll
4865         do some more cleanups and optimizations and also add some more
4866         documentation this week.
4867
4868         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4869         largely reworked this class.
4870         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4871         the new `Reachability' class instead of having "magic" values here.
4872         (FlowBranching): We're now using an instance of `Reachability'
4873         instead of having separate `Returns', `Breaks' etc. fields.
4874
4875         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4876         based on flow analysis; ignore the return value of block.Emit ().
4877
4878 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4879
4880         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4881         if they are private.
4882
4883 2003-12-09  Martin Baulig  <martin@ximian.com>
4884
4885         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4886         call them directly on the UsageVector.
4887
4888 2003-12-09  Martin Baulig  <martin@ximian.com>
4889
4890         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4891         Changed return type from `FlowReturns' to `Reachability'.
4892
4893 2003-12-09  Martin Baulig  <martin@ximian.com>
4894
4895         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4896         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4897         `Reachable' fields with a single `Reachability' one.
4898
4899 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4900
4901         * class.cs (FindMembers): Remove foreach's.
4902
4903         Bootstrap times:
4904
4905         BEFORE
4906                 Run 1:   8.74 seconds
4907                 Run 2:   8.71 seconds
4908
4909         AFTER
4910                 Run 1:   8.64 seconds
4911                 Run 2:   8.58 seconds
4912
4913
4914 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4915
4916         * cs-parser.jay:
4917         * gen-treedump.cs:
4918         * statement.cs:
4919         This patch does a few things:
4920                 1. EmptyStatement is now a singleton, so it is never reallocated.
4921                 2. All blah is EmptyStatement constructs have been changed to
4922                    blah == EmptyStatement.Value, which is much faster and valid
4923                    now that EmptyStatement is a singleton.
4924                 3. When resolving a block, rather than allocating a new array for
4925                    the non-empty statements, empty statements are replaced with
4926                    EmptyStatement.Value
4927                 4. Some recursive functions have been made non-recursive.
4928         Mainly the performance impact is from (3), however (1) and (2) are needed for
4929         this to work. (4) does not make a big difference in normal situations, however
4930         it makes the profile look saner.
4931
4932         Bootstrap times:
4933
4934         BEFORE
4935         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4936         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4937         Total memory allocated: 56397 KB
4938
4939         AFTER
4940         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4941         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4942         Total memory allocated: 55666 KB
4943
4944 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4945
4946         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4947         than the hashtable in a hashtable version
4948
4949         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4950         we always end up concating a string. This results in a huge perf
4951         loss, because many strings have to be tracked by the GC. In this
4952         patch, we first use a hashtable that works with two keys, so that
4953         the strings do not need to be concat'ed.
4954
4955         Bootstrap times:
4956         BEFORE
4957                 Run 1:   8.74 seconds
4958                 Run 2:   8.71 seconds
4959
4960         AFTER
4961                 Run 1:   8.65 seconds
4962                 Run 2:   8.56 seconds
4963
4964 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4965
4966         * Makefile: Add a new target `do-time' that does a quick and simple
4967         profile, leaving easy to parse output.
4968
4969 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4970
4971         * codegen.cs (Init): Create the dynamic assembly with 
4972         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4973
4974 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4975
4976         * support.cs: Make the PtrHashtable use only one
4977         instance of its comparer.
4978
4979 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4980
4981         * typemanager.cs: Fix lookup of GetNamespaces.
4982
4983 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4984
4985         * expression.cs: Removed redundant line.
4986
4987         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4988         ArrayLists, use for loops with bounds.  
4989
4990         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4991         arraylist.
4992
4993         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4994         arraylists, use for loop with bounds.
4995
4996         The above three changes give us a 0.071 second performance
4997         improvement out of 3.294 seconds down to 3.223.  On my machine
4998         the above changes reduced the memory usage by 1,387 KB during
4999         compiler bootstrap.
5000
5001         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5002         QualifiedIdentifiers.  Before we created a new string through
5003         concatenation, and mostly later on, the result would be
5004         manipulated by DecomposeQI through string manipulation.
5005
5006         This reduced the compiler memory usage for bootstrapping from
5007         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5008         compile times in 0.05 seconds.
5009
5010 2003-11-28  Dick Porter  <dick@ximian.com>
5011
5012         * support.cs: Do string compares with the Invariant culture.
5013
5014         * rootcontext.cs: 
5015         * gen-treedump.cs: 
5016         * expression.cs: 
5017         * driver.cs: 
5018         * decl.cs: 
5019         * codegen.cs: 
5020         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5021         the comparison is done with the Invariant culture.
5022
5023 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5024
5025         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5026         GetEnumerator method.
5027
5028         (ProbeCollectionType): Iterate starting at the most specific type
5029         upwards looking for a GetEnumerator
5030
5031         * expression.cs: Shift count can be up to 31 for int/uint and 63
5032         for long/ulong.
5033
5034 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5035
5036         * statement.cs (Block.LookupLabel): Also look for the label on the
5037         children blocks.  Use a hash table to keep track of visited
5038         nodes. 
5039
5040         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5041         we actually did transform the other operand, otherwise fall back
5042         to the common codepath that casts to long.
5043
5044         * cs-tokenizer.cs: Use the same code pattern as the int case.
5045         Maybe I should do the parsing myself, and avoid depending on the
5046         Parse routines to get this done.
5047
5048 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5049
5050         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5051         which fixes bug 51347.  This time test it.
5052
5053         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5054         attributes for example can not tell the difference between these.
5055         The difference was only a syntax feature of the language. 
5056
5057         * attribute.cs: Apply attributes to delegates.
5058
5059         * delegate.cs: Call the apply attributes method.
5060
5061 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5062
5063         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5064         comparing 0 vs Byte.MinValue, not the value
5065
5066         (ImplicitConversionRequired): When reporting a conversion error,
5067         use error 31 to print out the constant error instead of the
5068         simpler 29.
5069
5070         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5071         which fixes bug 51347.
5072
5073 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5074
5075         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5076         which fixes the -warnaserror command line option.
5077
5078 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5079
5080         * cfold.cs (DoNumericPromotions): During constant folding of
5081         additions on UIntConstant, special case intconstants with
5082         IntConstants like we do on the expression binary operator. 
5083
5084 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5085
5086         * convert.cs (ImplicitReferenceConversion): We were missing a case
5087         (System.Enum are not value types or class types, so we need to
5088         classify them separatedly).
5089
5090         * driver.cs: We do not support error 2007.
5091
5092 2003-11-12 Jackson Harper <jackson@ximian.com>
5093
5094         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5095         system directory. Also use the full file name so users can
5096         libraries names mscorlib-o-tron.dll in a non system dir.
5097
5098 2003-11-10  Martin Baulig  <martin@ximian.com>
5099
5100         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5101         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5102         calling `ResolveType()' on them, directly assign their `Type'.
5103
5104 2003-11-08  Martin Baulig  <martin@ximian.com>
5105
5106         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5107         return value and the `out parent' parameter.
5108         (TypeContainer.DefineType): Moved the CS0644 check into
5109         GetClassBases().  Don't pass the interface types to the
5110         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5111         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5112
5113         * ecore.cs (TypeExpr.IsAttribute): New property.
5114         (TypeExpr.GetInterfaces): New method.
5115
5116         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5117         TypeExpr instead of a Type.
5118         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5119         (Interface.DefineType): Don't pass the interface types to the
5120         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5121         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5122
5123         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5124         instead of a `Type[]'.
5125         (TypeManager.RegisterBuilder): Likewise.
5126         (TypeManager.AddUserInterface): Likewise.
5127         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5128         `Type[]' and also return a `TypeExpr[]'.
5129         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5130
5131 2003-11-08  Martin Baulig  <martin@ximian.com>
5132
5133         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5134         Expression.     
5135
5136 2003-11-08  Martin Baulig  <martin@ximian.com>
5137
5138         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5139         TypeManager.ResolveExpressionTypes().
5140
5141         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5142         instead of an Expression.
5143         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5144         (TypeExpression): New public class; formerly known as `TypeExpr'.
5145
5146         * expression.cs (ComposedCast): Derive from TypeExpr.
5147
5148         * typemanager.cs (TypeManager.system_*_expr): These are now
5149         TypExpr's instead of Expression's.
5150         (TypeManager.ResolveExpressionTypes): New public static function;
5151         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5152         of them.        
5153
5154 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5155
5156         * expression.cs (New.DoResolve): Do not dereference value that
5157         might be a null return.
5158
5159         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5160         sure that the constant value has the right type.  Fixes an
5161         unreported bug, similar to 50425.
5162
5163         * const.cs (Const.LookupConstantValue): Call
5164         ImplicitStandardConversionExists before doing a conversion to
5165         avoid havng the TypeManager.ChangeType do conversions.
5166
5167         Reduced the number of casts used
5168
5169         (Const.ChangeType): New routine to enable reuse of the constant
5170         type changing code from statement.
5171
5172         * typemanager.cs (ChangeType): Move common initialization to
5173         static global variables.
5174
5175         Fixes #50425.
5176
5177         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5178         every value type to go through, even if it was void.  Fix that. 
5179
5180         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5181         character of the define, and the is_identifier_part_character for
5182         the rest of the string.
5183
5184 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5185
5186         * expression.cs (UnaryMutator.EmitCode): When I updated
5187         LocalVariableReference.DoResolve, I overdid it, and dropped an
5188         optimization done on local variable references.
5189
5190 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5191
5192         * ecore.cs: Convert the return from Ldlen into an int.
5193
5194 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5195
5196         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5197         the accessibility, this is a special case for toplevel non-public
5198         classes (internal for instance).
5199
5200 2003-10-20  Nick Drochak <ndrochak@gol.com>
5201
5202         * ecore.cs: Fix typo and build.  Needed another right paren.
5203
5204 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5205
5206         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5207         `internal' case regular and protected, but not allowing protected
5208         to be evaluated later.  Bug 49840
5209
5210 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5211
5212         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5213         to kb.Nlast, and not the kb.nFirst to isolate the switch
5214         statement.
5215
5216         Extract the underlying type, so enumerations of long/ulong are
5217         treated like long/ulong.
5218
5219 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5220
5221         * expression.cs (New): Overload the meaning of RequestedType to
5222         track the possible creation of the NewDelegate type, since
5223         DoResolve is invoked more than once for new constructors on field
5224         initialization.
5225
5226         See bugs: #48800 and #37014
5227
5228         * cs-parser.jay (declare_local_constants): Take an arraylist
5229         instead of a single constant.
5230
5231         (local_constant_declaration): It should take a
5232         constant_declarators, not a constant_declarator.  Fixes 49487
5233
5234         * convert.cs: Fix error report.
5235
5236 2003-10-13 Jackson Harper <jackson@ximian.com>
5237
5238         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5239         bug #49611
5240
5241 2003-10-09  Martin Baulig  <martin@ximian.com>
5242
5243         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5244         to the .ctor.
5245         (MethodCore.DoDefineParameters): Removed the TypeContainer
5246         argument; use the DeclSpace which was passed to the .ctor instead.
5247         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5248         TypeContainer; we only need a DeclSpace here.
5249
5250 2003-10-09  Martin Baulig  <martin@ximian.com>
5251
5252         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5253         to the .ctor.
5254         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5255         EmitContext's .ctor.    
5256
5257 2003-10-09  Martin Baulig  <martin@ximian.com>
5258
5259         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5260         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5261         AsAccessible(), moved them as well.
5262
5263         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5264
5265 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5266
5267         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5268
5269 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5270
5271         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5272         generation for >=, as spotted by Paolo, bug 48679.  
5273         Patch from David Waite.
5274
5275         * cs-tokenizer.cs: Add handling for #pragma.
5276
5277         * cs-parser.jay: Allow for both yield and yield return in the
5278         syntax.  The anti-cobolization of C# fight will go on!
5279
5280         * class.cs (TypeBuilder.DefineType): Catch error condition here
5281         (Parent.DefineType erroring out and returning null).
5282
5283         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5284         coping with enumerations variables, we were mistakenly processing
5285         them as a regular value type instead of built-in types.  Fixes the
5286         bug #48063
5287
5288         * typemanager.cs (IsBuiltinOrEnum): New method.
5289
5290 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5291
5292         * cs-parser.jay: Upgrade: yield now needs the return clause.
5293
5294 2003-09-19  Martin Baulig  <martin@ximian.com>
5295
5296         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5297         `MemberCache parent' argument.  Normally, an interface doesn't
5298         have a parent type except System.Object, but we use this in gmcs
5299         for generic type parameters.
5300
5301 2003-09-18  Martin Baulig  <martin@ximian.com>
5302
5303         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5304         on `type.IsInterface'; don't check whether the type has a parent
5305         to determine whether it's an interface.
5306
5307 2003-09-15  Martin Baulig  <martin@ximian.com>
5308
5309         * class.cs (TypeContainer.DefineType): Added an error flag to
5310         avoid reporting duplicate CS0146's ("class definition is
5311         circular.").
5312
5313         * driver.cs (Driver.MainDriver): Abort if
5314         RootContext.ResolveTree() reported any errors.
5315
5316 2003-09-07  Martin Baulig  <martin@ximian.com>
5317
5318         * report.cs (Error, Warning): Added overloaded versions which take
5319         a `params object[] args' and call String.Format().
5320
5321 2003-09-07  Martin Baulig  <martin@ximian.com>
5322
5323         * decl.cs (DeclSpace..ctor): Don't call
5324         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5325         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5326         (DeclSpace.RecordDecl): New method.
5327
5328         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5329
5330 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5331
5332         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5333         value attributes to be applied to ParameterBuilders.
5334
5335         * class.cs (MethodCore.LabelParameters): Make static and more
5336         generic so that it can be used from other places - like interface
5337         methods, for instance.
5338
5339         * interface.cs (Interface.Emit): Call LabelParameters before
5340         emitting attributes on the InterfaceMethod.
5341
5342 2003-08-26  Martin Baulig  <martin@ximian.com>
5343
5344         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5345         resolving aliases; fixes #47927.
5346
5347 2003-08-26  Martin Baulig  <martin@ximian.com>
5348
5349         * statement.cs (Using.DoResolve): This is internally emitting a
5350         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5351         do not always return.  Fixes #47681.
5352
5353 2003-08-26  Martin Baulig  <martin@ximian.com>
5354
5355         * decl.cs (MemberCore): Moved WarningNotHiding(),
5356         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5357         into MemberBase.
5358         (AdditionResult): Make this nested in DeclSpace.
5359         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5360         argument; call NamespaceEntry.Define() unless we're nested in a
5361         class or struct.
5362
5363         * namespace.cs (Namespace.DefineName): New public function.  This
5364         is called from DeclSpace's .ctor to add 
5365         (Namespace.Lookup): Include DeclSpaces in the lookup.
5366
5367         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5368
5369         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5370
5371 2003-08-25  Martin Baulig  <martin@ximian.com>
5372
5373         * convert.cs (Convert.ExplicitReferenceConversion): When
5374         converting from an interface type to a class, unbox if the target
5375         type is a struct type.  Fixes #47822.
5376
5377 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5378
5379         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5380         #47854.
5381
5382 2003-08-22  Martin Baulig  <martin@ximian.com>
5383
5384         * class.cs (TypeManager.DefineType): When defining a nested type,
5385         call DefineType() on our parent; fixes #47801.
5386
5387 2003-08-22  Martin Baulig  <martin@ximian.com>
5388
5389         * class.cs (MethodData.Define): While checking if a method is an
5390         interface implementation, improve the test a bit more to fix #47654.
5391
5392 2003-08-22  Martin Baulig  <martin@ximian.com>
5393
5394         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5395         correctly; fixes #47722.
5396
5397 2003-08-22  Martin Baulig  <martin@ximian.com>
5398
5399         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5400         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5401
5402         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5403
5404 2003-08-22  Martin Baulig  <martin@ximian.com>
5405
5406         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5407         can only be assigned in static constructors.  Fixes #47161.
5408
5409 2003-08-22  Martin Baulig  <martin@ximian.com>
5410
5411         Rewrote and improved the flow analysis code.
5412
5413         * flowbranching.cs (FlowBranching): Make this class abstract.
5414         (FlowBranching.CreateBranching): New static function to create a
5415         new flow branching.
5416         (FlowBranchingBlock, FlowBranchingException): New classes.
5417         (FlowBranching.UsageVector.Type): New public readonly field.
5418         (FlowBranching.UsageVector.Breaks): Removed the setter.
5419         (FlowBranching.UsageVector.Returns): Removed the setter.
5420         (FlowBranching.UsageVector): Added Break(), Return(),
5421         NeverReachable() and Throw() methods to modify the reachability.
5422         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5423         done by FlowBranching.Merge().
5424         (FlowBranching.UsageVector.MergeChild): New method; merges the
5425         merge result into the current vector.
5426         (FlowBranching.Merge): New abstract method to merge a branching.
5427
5428 2003-08-12  Martin Baulig  <martin@ximian.com>
5429
5430         * expression.cs (Indirection.CacheTemporaries): Create the
5431         LocalTemporary with the pointer type, not its element type.
5432
5433 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5434
5435         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5436         token was a keyword or not.
5437
5438         Add `error' options where an IDENTIFIER was expected;  Provide
5439         CheckToken and CheckIdentifierToken convenience error reporting
5440         functions. 
5441
5442         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5443
5444         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5445         NameSpaceEntry NameSpaceEntry.
5446
5447         (LookupInterfaceOrClass): Avoid creating a full qualified name
5448         from namespace and name: avoid doing lookups when we know the
5449         namespace is non-existant.   Use new Tree.LookupByNamespace which
5450         looks up DeclSpaces based on their namespace, name pair.
5451
5452         * driver.cs: Provide a new `parser verbose' to display the
5453         exception thrown during parsing.  This is turned off by default
5454         now, so the output of a failure from mcs is more graceful.
5455
5456         * namespace.cs: Track all the namespaces defined in a hashtable
5457         for quick lookup.
5458
5459         (IsNamespace): New method
5460
5461 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5462
5463         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5464         we know that we need to concatenate (full typename can never be
5465         null). 
5466
5467         * class.cs: ditto.
5468
5469         * statement.cs: Use a bitfield;  Do not initialize to null things
5470         which are done by the constructor by default.
5471
5472         * cs-parser.jay: bug fix, parameter was 4, not 3.
5473
5474         * expression.cs: Just use the property;
5475
5476         * statement.cs: No need for GetVariableInfo method.
5477
5478 2003-08-08  Martin Baulig  <martin@ximian.com>
5479
5480         * flowanalysis.cs (FlowReturns): This is now nested in the
5481         `FlowBranching' class.
5482         (MyBitVector): Moved this here from statement.cs.
5483         (FlowBranching.SiblingType): New enum type.
5484         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5485
5486 2003-08-07  Martin Baulig  <martin@ximian.com>
5487
5488         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5489         `FlowBranching' class and called `BranchingType'.
5490
5491 2003-08-07  Martin Baulig  <martin@ximian.com>
5492
5493         * flowanalysis.cs: Moved all the control flow analysis code into
5494         its own file.
5495
5496 2003-08-07  Martin Baulig  <martin@ximian.com>
5497
5498         * assign.cs (Assign.DoResolve): `target' must either be an
5499         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5500         #37319.
5501
5502 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5503
5504         * expression.cs (BinaryMethod): This kind of expression is created by the
5505         Binary class if it determines that the operator has to be handled
5506         by a method.
5507
5508         (BinaryDelegate): This kind of expression is created if we are
5509         dealing with a + or - operator on delegates.
5510
5511         (Binary): remove method, argumetns, and DelegateOperator: when
5512         dealing with methods, 
5513
5514         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5515
5516         * statement.cs (Block): use bitfields for the three extra booleans
5517         we had in use.   Remove unused topblock parameter.
5518
5519         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5520
5521         * assign.cs: Drop extra unneeded tests.
5522
5523 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5524
5525         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5526
5527         * statement.cs (Foreach): Use VariableStorage instead of
5528         LocalBuilders.   
5529
5530         * codegen.cs (VariableStorage): New class used by clients that
5531         require a variable stored: locals or fields for variables that
5532         need to live across yield.
5533
5534         Maybe provide a convenience api for EmitThis+EmitLoad?
5535
5536         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5537         these bad boys.
5538
5539 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5540
5541         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5542         RemapParameterLValue): New methods that are used to turn a
5543         precomputed FieldInfo into an expression like this:
5544
5545                 instance.FieldInfo
5546
5547         The idea is to use this instead of making LocalVariableReference
5548         have more than one meaning.
5549
5550         * cs-parser.jay: Add error production to BASE.
5551
5552         * ecore.cs: Deal with TypeManager.GetField returning null, which
5553         is now a valid return value.
5554
5555         (FieldExprNoAddress): New expression for Fields whose address can
5556         not be taken.
5557
5558         * expression.cs (LocalVariableReference): During the resolve
5559         phases, create new expressions if we are in a remapping context.
5560         Remove code that dealt with remapping here.
5561
5562         (ParameterReference): same.
5563
5564         (ProxyInstance): New expression, like the `This' expression, but
5565         it is born fully resolved.  We know what we are doing, so remove
5566         the errors that are targeted to user-provided uses of `this'.
5567
5568         * statement.cs (Foreach): our variable is now stored as an
5569         Expression;  During resolution, follow the protocol, dont just
5570         assume it will return this.
5571
5572 2003-08-06  Martin Baulig  <martin@ximian.com>
5573
5574         * support.cs (SeekableStreamReader.cs): New public class.
5575
5576         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5577         SeekableStreamReader instead of the normal StreamReader.
5578
5579 2003-08-04  Martin Baulig  <martin@ximian.com>
5580
5581         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5582         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5583         deambiguate casts and delegate invocations.
5584         (parenthesized_expression): Use the new tokens to ensure this is
5585         not a cast of method invocation.
5586
5587         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5588         when reading a `)' and Deambiguate_CloseParens () was previously
5589         called.
5590
5591         * expression.cs (ParenthesizedExpression): New class.  This is
5592         just used for the CS0075 test.
5593         (Binary.DoResolve): Check for CS0075.   
5594
5595 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5596
5597         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5598         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5599         reference comparison.
5600
5601         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5602         examine the ReturnType for equality - this is necessary in the
5603         cases of implicit and explicit operators whose signature also
5604         includes the return type.
5605
5606 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5607
5608         * namespace.cs: Cache the result of the namespace computation,
5609         instead of computing it every time.
5610
5611 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5612
5613         * decl.cs: Use a global arraylist that we reuse over invocations
5614         to avoid excesive memory consumption.  Reduces memory usage on an
5615         mcs compile by one meg (45 average).
5616
5617         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5618         private, work around that.
5619
5620 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5621
5622         * literal.cs (IntLiteral): Define Zero and One static literals. 
5623
5624         * cs-parser.jay (integer_literal): use static literals to reduce
5625         memory usage for the most used literals (0, 1 and -1).  211kb
5626         reduced in memory usage.
5627
5628         Replace all calls to `new ArrayList' with `new
5629         ArrayList(4)' which is a good average number for most allocations,
5630         and also requires only 16 bytes of memory for its buffer by
5631         default. 
5632
5633         This reduced MCS memory usage in seven megabytes for the RSS after
5634         bootstrapping.
5635
5636 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5637
5638         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5639         handle params methods the correct way by forming only one
5640         applicable set with params and normal methods in them. Earlier we
5641         were looking at params methods only if we found no normal methods
5642         which was not the correct thing to do.
5643
5644         (Invocation.BetterFunction): Take separate arguments indicating
5645         when candidate and the best method are params methods in their
5646         expanded form.
5647
5648         This fixes bugs #43367 and #46199.
5649
5650         * attribute.cs: Documentation updates.
5651
5652         (CheckAttribute): Rename to CheckAttributeTarget.
5653         (GetValidPlaces): Rename to GetValidTargets.
5654
5655         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5656         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5657
5658         Fixes bug #44468.
5659
5660 2003-07-28  Martin Baulig  <martin@ximian.com>
5661
5662         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5663         name when looking up the base class of a nested class.  Fixes #46977.
5664
5665 2003-07-26  Martin Baulig  <martin@ximian.com>
5666
5667         * expression.cs (Indexers.Indexer): New nested struct; contains
5668         getter, setter and the indexer's type.
5669         (Indexers.Properties): This is now an ArrayList of
5670         Indexers.Indexer's.
5671         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5672         indexer doesn't have any getters.
5673
5674         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5675         for embedded property and indexer assignments.
5676
5677 2003-07-26  Martin Baulig  <martin@ximian.com>
5678
5679         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5680         preprocessor directive is not the first non-whitespace character
5681         on a line.
5682
5683 2003-07-26  Martin Baulig  <martin@ximian.com>
5684
5685         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5686         namespace parsing, follow the spec more closely.
5687
5688         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5689         NamespaceEntry.Lookup().
5690
5691 2003-07-25  Martin Baulig  <martin@ximian.com>
5692
5693         * MethodCore.cs (OverridesSomething): New public field; it's set
5694         from TypeContainer.DefineMembers if this method overrides
5695         something (which doesn't need to be a method).  Fix #39462.
5696
5697 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5698
5699         * typemanager.cs (GetMembers): Ensure that the list of members is
5700         reversed. This keeps things in sync.
5701
5702         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5703         find an AttributeUsage attribute.
5704
5705         * expression.cs (Invocation.OverloadResolve): Perform the check
5706         which disallows Invoke to be directly called on a Delegate.
5707
5708         (Error_InvokeOnDelegate): Report error cs1533.
5709
5710 2003-07-25  Martin Baulig  <martin@ximian.com>
5711
5712         * expression.cs (Indexers.GetIndexersForType): Only look in the
5713         interface hierarchy if the requested type is already an
5714         interface.  Fixes #46788 while keeping #46502 fixed.
5715
5716 2003-07-25  Martin Baulig  <martin@ximian.com>
5717
5718         * class.cs (TypeContainer.DefineMembers): Check whether all
5719         readonly fields have been assigned and report warning CS0649 if
5720         not.
5721
5722         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5723         a valuetype.
5724
5725 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5726
5727         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5728         returned from GetMethods to make things consistent with the
5729         assumptions MCS makes about ordering of methods.
5730
5731         This should comprehensively fix bug #45127 and it does :-)
5732
5733         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5734         ordering is actually reverse.
5735
5736         * Clean up some debug messages I left lying around.
5737
5738         * interface.cs (Populate*): Get rid of code which emits attributes
5739         since the stage in which we emit attributes is the 'Emit' stage,
5740         not the define stage.
5741
5742         (Emit): Move attribute emission for interface members here.
5743
5744 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5745
5746         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5747         closely: we eliminate methods in base types when we have an
5748         applicable method in a top-level type.
5749
5750         Please see section 14.5.5.1 for an exact description of what goes
5751         on. 
5752
5753         This fixes bug #45127 and a host of other related to corlib compilation.
5754
5755         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5756         array is the method corresponding to the top-level type (this is
5757         because of the changes made to icall.c) so we change this
5758         accordingly.
5759
5760         (MethodGroupExpr.Name): This too.
5761
5762         * typemanager.cs (GetElementType): New method which does the right
5763         thing when compiling corlib. 
5764
5765         * everywhere: Make use of the above in the relevant places.
5766
5767 2003-07-22  Martin Baulig  <martin@ximian.com>
5768
5769         * cs-parser.jay (invocation_expression): Moved
5770         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5771         `cast_expression', but create a InvocationOrCast which later
5772         resolves to either an Invocation or a Cast.
5773
5774         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5775         method; call this before EmitStatement() to make sure that this
5776         expression can be used as a statement.
5777
5778         * expression.cs (InvocationOrCast): New class; resolves to either
5779         an Invocation or a Cast.
5780
5781         * statement.cs (StatementExpression): Call ResolveStatement() on
5782         the ExpressionStatement before emitting it.
5783
5784 2003-07-21  Martin Baulig  <martin@ximian.com>
5785
5786         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5787         `ref' and `out' attributes match; fixes #46220.
5788         (MemberAccess.ResolveMemberAccess): You can't reference a type
5789         through an expression; fixes #33180.
5790         (Indexers.GetIndexersForType): Don't return the indexers from
5791         interfaces the class implements; fixes #46502.
5792
5793 2003-07-21  Martin Baulig  <martin@ximian.com>
5794
5795         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5796         CS0661 checks; fixes bug #30442.
5797
5798 2003-07-21  Martin Baulig  <martin@ximian.com>
5799
5800         * decl.cs (AdditionResult): Added `Error'.
5801
5802         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5803
5804         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5805         makes cs0031.cs actually work.
5806
5807 2003-07-20  Martin Baulig  <martin@ximian.com>
5808
5809         * namespace.cs: Fixed that bug which caused a crash when compiling
5810         the debugger's GUI.
5811
5812 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5813
5814         * typemanager.cs (LookupTypeReflection): Never expose types which
5815         are NotPublic, NestedPrivate, NestedAssembly, or
5816         NestedFamANDAssem.  We used to return these, and later do a check
5817         that would report a meaningful error, but the problem is that we
5818         would not get the real match, if there was a name override.
5819
5820 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5821
5822         * namespace.cs (Namespace, Name): Do not compute the namespace
5823         name dynamically, compute it in the constructor.  This reduced
5824         memory usage by 1697 KB.
5825
5826         * driver.cs: Use --pause to pause at the end.
5827
5828 2003-07-17  Peter Williams  <peter@newton.cx>
5829
5830         * Makefile: Change the name of the test target so that it doesn't
5831         conflict with the recursive test target.
5832
5833 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5834
5835         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5836         AddressOf): Do not use EmitThis, that was wrong, use the actual
5837         this pointer.
5838
5839 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5840
5841         * class.cs (MethodData.Define): While checking if a method is an
5842         interface implementation, improve the test: If we are not public
5843         (use new test here: use the computed MethodAttributes directly,
5844         instead of the parsed modifier flags) check if the `implementing'
5845         method comes from an interface or not.
5846
5847         * pending.cs (VerifyPendingMethods): Slightly better error
5848         message.
5849
5850         * makefile: add test target that does the mcs bootstrap.
5851
5852 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5853
5854         * interface.cs (Define): Do nothing here since there are no
5855         members to populate etc. Move the attribute emission out of here
5856         since this was just totally the wrong place to put it. Attribute
5857         application happens during the 'Emit' phase, not in the 'Define'
5858         phase.
5859
5860         (Emit): Add this method and move the attribute emission here
5861
5862         * rootcontext.cs (EmitCode): Call the Emit method on interface
5863         types too.
5864
5865 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5866
5867         * expression.cs (OverloadResolve): Report error only if Location
5868         is not 'Null' which means that there was a probe going on.
5869
5870 2003-07-14  Martin Baulig  <martin@ximian.com>
5871
5872         * expression.cs (ConditionalLogicalOperator): New public class to
5873         implement user defined conditional logical operators.
5874         This is section 14.11.2 in the spec and bug #40505.
5875
5876 2003-07-14  Martin Baulig  <martin@ximian.com>
5877
5878         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5879
5880 2003-07-14  Martin Baulig  <martin@ximian.com>
5881
5882         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5883
5884         * ecore.cs (IVariable.VerifyFixed): New interface method.
5885
5886         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5887         operator, check whether the variable is actually fixed.  Fixes bug
5888         #36055.  Set a variable definitely assigned when taking its
5889         address as required by the spec.
5890
5891         * statement.cs (LocalInfo.IsFixed): New field.
5892         (LocalInfo.MakePinned): Set `IsFixed' to true.
5893
5894 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5895
5896         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5897         for .ctors, ensure that we only ask for members declared in the
5898         attribute type (BindingFlags.DeclaredOnly).
5899
5900         Fixes bug #43632.
5901
5902         * expression.cs (Error_WrongNumArguments): Report error 1501
5903         correctly the way CSC does.
5904
5905 2003-07-13  Martin Baulig  <martin@ximian.com>
5906
5907         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5908         lookup on the fully qualified name, to make things like "X.X" work
5909         where "X.X" is a fully qualified type name, but we also have a
5910         namespace "X" in the using list.  Fixes #41975.
5911
5912 2003-07-13  Martin Baulig  <martin@ximian.com>
5913
5914         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5915         function. If we're a CompoundAssign, we need to create an embedded
5916         CompoundAssign, not an embedded Assign.
5917         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5918         Fixes #45854.
5919
5920 2003-07-13  Martin Baulig  <martin@ximian.com>
5921
5922         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5923         work to fix bug #46088.
5924
5925 2003-07-13  Ravi Pratap <ravi@ximian.com>
5926
5927         * class.cs (Operator.Emit): Do not emit attributes here - it is
5928         taken care of by the Method class that we delegate too. This takes
5929         care of bug #45876.
5930
5931 2003-07-10  Martin Baulig  <martin@ximian.com>
5932
5933         * expression.cs (TypeOfVoid): New class.
5934         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5935
5936 2003-07-10  Martin Baulig  <martin@ximian.com>
5937
5938         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5939         bug #35957.
5940
5941 2003-07-10  Martin Baulig  <martin@ximian.com>
5942
5943         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5944         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5945
5946         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5947
5948         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5949
5950 2003-07-10  Martin Baulig  <martin@ximian.com>
5951
5952         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5953         of decimal.  Fixes #42850.
5954
5955         NOTE: I also fixed the created byte blob, but this doesn't work on
5956         the MS runtime and csc never produces any byte blobs for decimal
5957         arrays.
5958
5959 2003-07-10  Martin Baulig  <martin@ximian.com>
5960
5961         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5962         structs; fixes #32068.
5963         (Block.AddChildVariableNames): Fixed #44302.
5964
5965 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5966
5967         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5968
5969 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5970
5971         * attribute.cs: And this test is onger needed.
5972
5973 2003-07-08  Martin Baulig  <martin@ximian.com>
5974
5975         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5976         inaccessible types.  Fixes #36313.
5977
5978         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5979
5980         * namespace.cs (NamespaceEntry): Create implicit entries for all
5981         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5982         implicit entries for N1.N2 and N1.
5983
5984 2003-07-08  Martin Baulig  <martin@ximian.com>
5985
5986         Rewrote the handling of namespaces to fix a lot of the issues
5987         wrt. `using' aliases etc.
5988
5989         * namespace.cs (Namespace): Splitted this class into a
5990         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5991
5992         * typemanager.cs (TypeManager.IsNamespace): Removed.
5993         (TypeManager.ComputeNamespaces): Only compute namespaces from
5994         loaded assemblies here, not the namespaces from the assembly we're
5995         currently compiling.
5996
5997 2003-07-08  Martin Baulig  <martin@ximian.com>
5998
5999         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6000
6001 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6002
6003         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6004         already fixed it.  
6005
6006         I thought about the memory savings here, but LookupTypeReflection
6007         is used under already very constrained scenarios.  Compiling
6008         corlib or mcs only exposes one hit, so it would not really reduce
6009         any memory consumption.
6010
6011 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6012
6013         * typemanager.cs: fixes bug #45889 by only adding public types from
6014         other assemblies to the list of known types.
6015
6016 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6017
6018         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6019         on the type we resolved.
6020
6021 2003-07-05  Martin Baulig  <martin@ximian.com>
6022
6023         * pending.cs (PendingImplementation.ParentImplements): Don't
6024         create the proxy if the parent is abstract.
6025
6026         * class.cs (TypeContainer.DefineIndexers): Process explicit
6027         interface implementations first.  Fixes #37714.
6028
6029 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6030
6031         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6032         defined recursively;  but since we modify the input parameters
6033         (left is set to `this' temporarily), we reset this value if the
6034         left_is_explicit is false, which gives the original semantics to
6035         the code.  
6036
6037         * literal.cs (NullPointer): new class used to represent a null
6038         literal in a pointer context.
6039
6040         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6041         type is a pointer, use a NullPointer object instead of a
6042         NullLiteral.   Closes 43687
6043
6044         (ExplicitConversion): Convert pointer values using
6045         the conv opcode to the proper type.
6046
6047         * ecore.cs (New): change ValueTypeVariable property into a method,
6048         that returns whether the valuetype is suitable for being used.
6049
6050         * expression.cs (Binary.DoNumericPromotions): Only return if we
6051         the int constant was a valid uint, and we can return both left and
6052         right as uints.  If not, we continue processing, to trigger the
6053         type conversion.  This fixes 39018.
6054
6055         * statement.cs (Block.EmitMeta): During constant resolution, set
6056         the CurrentBlock property on the emitcontext, so that we resolve
6057         constants propertly.
6058
6059 2003-07-02  Martin Baulig  <martin@ximian.com>
6060
6061         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6062         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6063
6064         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6065         than emitting it here.
6066
6067         * statement.cs: Fixed some more flow analysis bugs.
6068
6069 2003-07-02  Martin Baulig  <martin@ximian.com>
6070
6071         * class.cs (MethodData.Define): When implementing interface
6072         methods, set Final unless we're Virtual.
6073
6074         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6075         check work for interface methods.
6076
6077 2003-07-01  Martin Baulig  <martin@ximian.com>
6078
6079         * ecore.cs (EmitContext.This): Replaced this property with a
6080         GetThis() method which takes a Location argument.  This ensures
6081         that we get the correct error location for a CS0188.
6082
6083 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6084
6085         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6086         ImplicitStandardConversion.
6087
6088         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6089
6090 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6091
6092         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6093         optimization.
6094
6095 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6096
6097         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6098         constructors.
6099
6100         (MethodData.Define): Turn off initlocals for unsafe methods.
6101
6102 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6103
6104         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6105         complete;  Fixes #37521.
6106
6107         * delegate.cs: Use Modifiers.TypeAttr to compute the
6108         TypeAttributes, instead of rolling our own.  This makes the flags
6109         correct for the delegates.
6110
6111 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6112
6113         * class.cs (Constructor.Define): Set the private flag for static
6114         constructors as well.
6115
6116         * cs-parser.jay (statement_expression): Set the return value to
6117         null, to avoid a crash when we catch an error.
6118
6119 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6120
6121         * cs-parser.jay: Applied patch from Jackson that adds support for
6122         extern and unsafe modifiers to destructor declarations.
6123
6124         * expression.cs: Report error 21 if the user is trying to index a
6125         System.Array.
6126
6127         * driver.cs: Add an error message, suggested by the bug report.
6128
6129         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6130         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6131
6132 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6133
6134         * namespace.cs: Add some information to reduce FAQs.
6135
6136 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6137
6138         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6139         underlying enumeration types.  Fixes #43915.
6140
6141         * expression.cs: Treat ushort/short as legal values to be used in
6142         bitwise operations.
6143
6144 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6145
6146         * delegate.cs: transfer custom attributes for paramenters from
6147         the delegate declaration to Invoke and BeginInvoke.
6148
6149 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6150
6151         * attribute.cs: handle custom marshalers and emit marshal info
6152         for fields, too.
6153
6154 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6155
6156         * makefile.gnu: Added anonymous.cs to the compiler sources.
6157
6158 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6159
6160         * iterators.cs: Change the name of the proxy class to include two
6161         underscores.
6162
6163         * cs-parser.jay: Update grammar to include anonymous methods.
6164
6165         * anonymous.cs: new file.
6166
6167 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6168
6169         * class.cs (Field.Define): Add missing test for pointers and
6170         safety. 
6171
6172 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6173
6174         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6175         we use the stobj opcode.
6176
6177         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6178         since it wasn't the correct fix. 
6179
6180         It still is puzzling that we are required to use stobj for IntPtr
6181         which seems to be a ValueType.
6182
6183 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6184
6185         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6186         during regular simple name resolution.   Now, the trick is that
6187         instead of returning for processing the simplename, we do a
6188         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6189         contextual lookup type).   If a match is found, return that, if
6190         not, return for further composition.
6191
6192         This fixes long-standing 30485.
6193
6194         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6195         using the address to initialize an object, do an Stobj instead of
6196         using the regular Stelem.
6197
6198         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6199         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6200         Because if we are a BaseIndexerAccess that value will be true.
6201         Fixes 43643.
6202
6203         * statement.cs (GotoCase.Resolve): Return after reporting an
6204         error, do not attempt to continue. 
6205
6206         * expression.cs (PointerArithmetic.Emit): If our operand is a
6207         long, convert our constants to match the operand before
6208         multiplying.  Convert to I type before adding.   Fixes 43670.
6209
6210 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6211
6212         * enum.cs (ImplicitConversionExists) : Rename to
6213         ImplicitEnumConversionExists to remove ambiguity. 
6214
6215         * ecore.cs (NullCast): New type of cast expression class which
6216         basically is very similar to EmptyCast with the difference being
6217         it still is a constant since it is used only to cast a null to
6218         something else
6219         (eg. (string) null)
6220
6221         * convert.cs (ImplicitReferenceConversion): When casting a null
6222         literal, we return a NullCast.
6223
6224         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6225         should be around anymore.
6226
6227         The renaming (reported was slightly wrong). Corrections:
6228
6229         ConvertImplicitStandard -> ImplicitConversionStandard
6230         ConvertExplicitStandard -> ExplicitConversionStandard
6231
6232         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6233         before passing them in !
6234
6235         * convert.cs (ImplicitConversionStandard): When comparing for
6236         equal expr and target types, ensure that expr is not a
6237         NullLiteral.
6238
6239         In general, we must not be checking (expr_type ==
6240         target_type) in the top level conversion methods
6241         (ImplicitConversion, ExplicitConversion etc). This checking is
6242         done in the methods that they delegate to.
6243
6244 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6245
6246         * convert.cs: Move Error_CannotConvertType,
6247         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6248         ImplicitNumericConversion, ImplicitConversionExists,
6249         ImplicitUserConversionExists, StandardConversionExists,
6250         FindMostEncompassedType, FindMostSpecificSource,
6251         FindMostSpecificTarget, ImplicitUserConversion,
6252         ExplicitUserConversion, GetConversionOperators,
6253         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6254         TryImplicitIntConversion, Error_CannotConvertImplicit,
6255         ConvertImplicitRequired, ConvertNumericExplicit,
6256         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6257         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6258         its own file.
6259
6260         Perform the following renames:
6261
6262         StandardConversionExists -> ImplicitStandardConversionExists
6263         ConvertImplicit -> ImplicitConversion
6264         ConvertImplicitStandard -> ImplicitStandardConversion
6265         TryImplicitIntConversion -> ImplicitIntConversion
6266         ConvertImplicitRequired -> ImplicitConversionRequired
6267         ConvertNumericExplicit -> ExplicitNumericConversion
6268         ConvertReferenceExplicit -> ExplicitReferenceConversion
6269         ConvertExplicit -> ExplicitConversion
6270         ConvertExplicitStandard -> ExplicitStandardConversion
6271
6272 2003-05-19  Martin Baulig  <martin@ximian.com>
6273
6274         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6275         (TypeInfo): Added support for structs having structs as fields.
6276
6277         * ecore.cs (FieldExpr): Implement IVariable.
6278         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6279         VariableInfo for the field.
6280
6281 2003-05-18  Martin Baulig  <martin@ximian.com>
6282
6283         * expression.cs (This.DoResolve): Report a CS0027 if we're
6284         emitting a field initializer.
6285
6286 2003-05-18  Martin Baulig  <martin@ximian.com>
6287
6288         * expression.cs (This.ResolveBase): New public function.
6289         (This.DoResolve): Check for CS0188.
6290
6291         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6292         This.Resolve().
6293
6294         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6295         `instance_expression' to null if we don't have any non-static
6296         methods.
6297
6298 2003-05-18  Martin Baulig  <martin@ximian.com>
6299
6300         Reworked the way how local variables and parameters are handled by
6301         the flow analysis code.
6302
6303         * statement.cs (TypeInfo, VariableMap): New public classes.
6304         (VariableInfo): New public class.  This is now responsible for
6305         checking whether a variable has been assigned.  It is used for
6306         parameters and local variables.
6307         (Block.EmitMeta): Take the InternalParameters as argument; compute
6308         the layout of the flow vectors here.
6309         (Block.LocalMap, Block.ParameterMap): New public properties.
6310         (FlowBranching): The .ctor doesn't get the InternalParameters
6311         anymore since Block.EmitMeta() now computes the layout of the flow
6312         vector.
6313         (MyStructInfo): This class is now known as `StructInfo' and nested
6314         in `TypeInfo'; we don't access this directly anymore.
6315
6316         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6317         property and removed IsAssigned(), IsFieldAssigned(),
6318         SetAssigned() and SetFieldAssigned(); we now call them on the
6319         VariableInfo so we don't need to duplicate this code everywhere.
6320
6321         * expression.cs (ParameterReference): Added `Block block' argument
6322         to the .ctor.
6323         (LocalVariableReference, ParameterReference, This): The new
6324         VariableInfo class is now responsible for all the definite
6325         assignment stuff.
6326
6327         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6328         IsParameterAssigned, SetParameterAssigned): Removed.
6329
6330 2003-05-18  Martin Baulig  <martin@ximian.com>
6331
6332         * typemanager.cs (InitCoreTypes): Try calling
6333         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6334         the 3-args-version.  Corlib now also needs our `void_type'.
6335         (GetMethod): Added overloaded version which takes an optional
6336         `bool report_errors' to allow lookups of optional methods.
6337
6338 2003-05-12  Martin Baulig  <martin@ximian.com>
6339
6340         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6341         only used for locals and not for parameters.
6342
6343 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6344
6345         * support.cs (InternalParameters.ParameterType): Return the
6346         ExternalType of the parameter.
6347
6348         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6349         they were unused.
6350
6351 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6352
6353         * class.cs (MethodData.Define): Do not set the `newslot' on
6354         interface members, if they are also flagged as "override".
6355
6356         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6357         better code for ++i and i++.  This only works for static fields
6358         and local variables.
6359
6360         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6361         want to pull the DeclSpace out of the builder_to_declspace instead
6362         of the TypeBuilder (like in TypeContainer.FindMembers).
6363
6364         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6365         instead of LookupTypeContainer.  Fixes the crash on .NET for
6366         looking up interface members.
6367
6368         * const.cs: Create our own emit context during the Definition
6369         stage, so that constants are evaluated in the proper context, when
6370         a recursive definition happens.
6371
6372 2003-05-11  Martin Baulig  <martin@ximian.com>
6373
6374         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6375         new block for a switch section.
6376         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6377         the adding/lookup in the switch block.  Fixes #39828.
6378
6379 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6380
6381         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6382         functionality: I needed to convert the data after I had performed
6383         the add/sub operation into the operands type size.
6384
6385         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6386         pass the type for the box operation, otherwise the resulting
6387         object would have been of type object.
6388
6389         (BoxedCast): Add constructor to specify the type to box as.
6390
6391 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6392
6393         * iterators.cs: I was reusing the `count' variable inadvertently,
6394         take steps to not allow this to happen.
6395
6396 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6397
6398         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6399         by creating an array at the point where the params starts and
6400         putting all those arguments there, then adjusting the size of the
6401         array.
6402
6403 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6404
6405         * expression.cs (New.AddressOf): Implement interface
6406         IMemoryLocation.  This is used when the `new' operator is used in
6407         the context of an invocation to a method on a value type.
6408
6409         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6410         example. 
6411
6412         * namespace.cs: Also check the using aliases here.
6413
6414         * driver.cs: Move the test for using validity after the types have
6415         been entered, so we do a single pass that also includes the using
6416         aliases. 
6417
6418         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6419         in the regular case.   CreateSiblingForFinally is doing extra
6420         error checking.
6421
6422         * attribute.cs (GetAttributeArgumentExpression): Store the result
6423         on an out value, and use the return value to indicate failure
6424         instead of using null (which is a valid return for Constant.GetValue).
6425
6426         * statement.cs: Perform the analysis flow for the increment
6427         portion after the statement, because this will be the real flow of
6428         execution.  Fixes #42385
6429
6430         * codegen.cs (EmitContext.EmitArgument,
6431         EmitContext.EmitStoreArgument): New helper functions when the
6432         RemapToProxy flag is set.
6433
6434         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6435         function.
6436
6437         Add support for remapping parameters. 
6438
6439         * iterators.cs: Propagate parameter values;  Store parameter
6440         values in the proxy classes.
6441
6442 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6443
6444         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6445         need a proxy reference;  I do not know what I was thinking
6446
6447         * cs-parser.jay (constructor_initializer): catch another error,
6448         and display nice message.
6449
6450         (field_declaration): catch void field declaration
6451         to flag a better error. 
6452
6453         * class.cs (MemberBase.CheckBase): Report an error instead of a
6454         warning if a new protected member is declared in a struct. 
6455         (Field.Define): catch the error of readonly/volatile.
6456
6457         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6458
6459         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6460         volatile variable is taken
6461
6462 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6463
6464         * statement.cs (Fixed.Resolve): Report an error if we are not in
6465         an unsafe context.
6466
6467 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6468
6469         * typemanager.cs: reuse the code that handles type clashes for
6470         delegates and enumerations.
6471
6472         * class.cs (Report28): Always report.
6473
6474         * expression.cs (EncodeAsAttribute): Allow nulls here.
6475
6476 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6477
6478         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6479         the functionality for testing whether an expression is valid for
6480         an attribute here.  Also handle the case of arrays of elements
6481         being stored. 
6482
6483         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6484         encoding a linear array into an array of objects that are suitable
6485         to be passed to an CustomAttributeBuilder.
6486
6487         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6488
6489         * ecore.cs: (FieldExpr): Handle field remapping here.
6490
6491         * iteratators.cs: Pass the instance variable (if the method is an
6492         instance method) to the constructors, so we can access the field
6493         variables on the class.
6494
6495         TODO: Test this with structs.  I think the THIS variable on
6496         structs might have to be a pointer, and not a refenrece
6497
6498 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6499
6500         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6501         local variables to fields in a proxy class.
6502
6503         * iterators.cs (PopulateProxy): Rename our internal fields to
6504         <XXX>.  
6505         Create a <THIS> field if we are an instance method, so we can
6506         reference our parent container variables.
6507         (MapVariable): Called back from the EmitContext code to enter a
6508         new variable to field mapping into the proxy class (we just create
6509         a FieldBuilder).
6510
6511         * expression.cs
6512         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6513         for using the remapped locals to fields.
6514
6515         I placed the code here, because that gives the same semantics to
6516         local variables, and only changes the Emit code.
6517
6518         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6519         statements inside iterators.
6520         (VariableInfo): Add a FieldBuilder for the cases when we are
6521         remapping local variables to fields in a proxy class
6522
6523         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6524         current_block != null.
6525
6526         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6527         not cope with strings, as it has been moved to the
6528         TableSwitchEmit.  Fixed bug in switch generation.
6529
6530         * expression.cs (New.DoResolve): Provide more context for the user
6531         when reporting an error.
6532
6533         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6534         pointers. 
6535
6536         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6537         check the permissions for it.  Note than in a type-resolution
6538         context the check was already present in DeclSpace.ResolveType,
6539         but was missing from the MemberAccess.
6540
6541         (ArrayCreation.CheckIndices): warn if the user has
6542         more nested levels of expressions, but there are no more
6543         dimensions specified.  Avoids crash on bug 41906.
6544
6545 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6546
6547         * statement.cs (Block): replace Implicit bool, for a generic
6548         flags.   
6549         New flag: `Unchecked'.  This is used during the EmitMeta phase
6550         (which is out-of-line with the regular Resolve/Emit process for a
6551         statement, as this is done ahead of time, but still gets a chance
6552         to call constant resolve).
6553
6554         (Block.Flags): new enum for adding a new flag.
6555
6556         (Block.EmitMeta): track the state of unchecked.
6557
6558         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6559         to enable constant resolution to work there as well.
6560
6561 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6562
6563         * typemanager.cs (ienumerable_type): Also look up
6564         System.Collections.IEnumerable. 
6565
6566 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6567
6568         TODO: Test more than one conditional per method.
6569
6570         * class.cs (Indexer.Define): Report the location where the user is
6571         referencing the unsupported feature.
6572
6573         (MethodData): Overload the use of `conditionals' to
6574         minimize the creation of needless ArrayLists.   This saves roughly
6575         212kb on my machine.
6576
6577         (Method): Implement the new IIteratorContainer interface.
6578         (Method.SetYields): Implement the method by setting the ModFlags
6579         to contain METHOD_YIELDS.
6580
6581         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6582         which just got set to null.
6583
6584         * iterators.cs: New file.
6585
6586         (Yield, YieldBreak): New statements.
6587
6588         * statement.cs (Return.Resolve): Flag an error if we are used in
6589         an iterator method.
6590
6591         * codegen.cs (InIterator): New flag set if the code is being
6592         compiled in an iterator method.
6593
6594         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6595         internal modifier, and we just use it to avoid adding extra
6596         fields, as this is seldom used.  
6597
6598         * cs-parser.jay: Add yield_statement (yield and yield break).
6599
6600         * driver.cs: New flag -v2 to turn on version 2 features. 
6601
6602         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6603         hashtable when v2 is enabled.
6604
6605 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6606
6607         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6608         there is already a namespace defined with this name.
6609
6610         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6611         people upgraded their corlibs.
6612
6613         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6614         always use fully qualified types, no need to use the compiler
6615         front end.
6616
6617         (TypeManager.IsNamespace): Use binarysearch.
6618
6619         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6620         AddDelegate): I did not quite use the new IsValid API properly: I
6621         have to pass the short-name and the fullname.  I was passing only
6622         the basename instead of the fullname sometimes. 
6623
6624         (TypeContainer.DefineType): call NamespaceClash.
6625
6626         * interface.cs (Interface.DefineType): use NamespaceClash before
6627         defining the type.
6628
6629         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6630         defining the type.
6631
6632         * enum.cs: (Enum.DefineType): use NamespaceClash before
6633         defining the type.
6634
6635         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6636         speed increase.  First, use the negative_hits cache when we get a
6637         negative.  Second, add the type with its full original name
6638         instead of the new . and + encoded name (reflection uses + to
6639         separate type from a nested type).  Use LookupTypeReflection
6640         directly which bypasses the type->name hashtable (that we already
6641         know does not contain the type.
6642
6643         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6644         location/container type. 
6645
6646         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6647
6648 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6649
6650         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6651
6652         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6653         method is being referenced in the method group from a static
6654         context, and report error 120 if so.
6655
6656         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6657         Error118. 
6658
6659         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6660         is created, we create the A namespace).
6661
6662         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6663         Fixes #41591
6664
6665 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6666
6667         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6668         invocation to ModuleBuilder.GetType with the same values will
6669         return a new type instance, so we need to cache its return
6670         values. 
6671
6672         * expression.cs (Binary.ResolveOperator): Only allow the compare
6673         operators on enums if they are of the same type.
6674
6675         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6676         types of ValueType on their own case.  Before we were giving them
6677         the same treatment as objects.
6678
6679         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6680         fullname.  Short name is used to compare against container name.
6681         Fullname is used to check against defined namespace names.
6682
6683         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6684         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6685
6686         (Method.CheckBase): Call parent.
6687         (MemberBase.CheckBase): Check for protected members on sealed
6688         classes.
6689         (PropertyBase.CheckBase): Call parent.
6690         (Field.Define): Call parent.
6691
6692         * report.cs: Negative error codes are now mapped to 8000 - code,
6693         so that the display is render more nicely.
6694
6695         * typemanager.cs: Do not use try/catch, instead report a regular
6696         error. 
6697
6698         (GetPointerType, GetReferenceType): These methods provide
6699         mechanisms to obtain the T* and T& from a T.  We had the code
6700         previously scattered around the code base, and it also used
6701         TypeManager.LookupType that would go through plenty of caches.
6702         This one goes directly to the type source.
6703
6704         In some places we did the Type.GetType followed by
6705         ModuleBuilder.GetType, but not in others, so this unifies the
6706         processing as well.
6707
6708         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6709         statements now that we have namespace information.
6710
6711         * typemanager.cs (IsNamespace): New method, returns whether the
6712         string presented is a namespace or not.
6713
6714         (ComputeNamespaces): New public entry point, computes the list of
6715         available namespaces, using the GetNamespaces API call in Mono, or
6716         the slower version in MS.NET.   
6717
6718         Now before we start the semantic analysis phase, we have a
6719         complete list of namespaces including everything that the user has
6720         provided.
6721
6722         Deleted old code to cache namespaces in .nsc files.
6723
6724 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6725
6726         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6727         class/struct location definition Location for the implicit
6728         constructor location.
6729
6730         (Operator.Define): Use the location of the operator for the
6731         implicit Method definition.
6732
6733         (Constructor.Emit): use the constructor location for the implicit
6734         base initializer constructor.
6735
6736         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6737         and the Expression class now contains two new methods:
6738
6739         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6740         isolate type lookup from the rest of the resolution process.
6741
6742         Since we use Expressions to hold type definitions due to the way
6743         we parse the input we have historically overloaded Resolve to
6744         perform the Type lookups if a special flag is passed.  Now this is
6745         eliminated and two methods take their place. 
6746
6747         The differences in the two methods between xStep and xTerminal is
6748         that xStep is involved in our current lookup system that uses
6749         SimpleNames to compose a name, while xTerminal is used just to
6750         catch the case where the simplename lookup failed.
6751
6752 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6753
6754         * expression.cs (ResolveMemberAccess): Remove redundant code.
6755         TypeExpr expressions are always born fully resolved.
6756
6757         * interface.cs (PopulateMethod): Do not lookup the types twice.
6758         We were doing it once during SemanticAnalysis and once during
6759         PopulateMethod.
6760
6761         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6762         in local variable type definitions, were being returned as a
6763         SimpleName (we decomposed everything into a string), that is
6764         because primary_expression was being used instead of a type in the
6765         grammar (reduce/reduce conflicts).
6766
6767         The part that was wrong is that we converted the expression into a
6768         string (an oversimplification in one hand, compounded with primary
6769         expressions doing string concatenation).
6770
6771         So things like:
6772
6773         A.B.C [] x;
6774
6775         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6776         using clauses from working on this particular context.  And a type
6777         was being matched directly against "A.B.C[]".
6778
6779         We now use the correct approach, and allow for ComposedCast to be
6780         part of the unary expression.  So the "A.B.C []" become a composed
6781         cast of "A.B.C" (as a nested group of MemberAccess with a
6782         SimpleName at the end) plus the rank composition "[]". 
6783
6784         Also fixes 35567
6785
6786 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6787
6788         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6789         for the access level checking.
6790
6791         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6792         `TypeContainer container', because I kept getting confused when I
6793         was debugging this code.
6794
6795         * expression.cs (Indexers): Instead of tracking getters/setters,
6796         we now track them in parallel.  We create one arraylist less, but
6797         most importantly it is possible now for the LValue code to find a
6798         matching get for a set.
6799
6800         (IndexerAccess.DoResolveLValue): Update the code.
6801         GetIndexersForType has been modified already to extract all the
6802         indexers from a type.  The code assumed it did not.
6803
6804         Also make the code set the correct return type for the indexer.
6805         This was fixed a long time ago for properties, but was missing for
6806         indexers.  It used to be void_type.
6807
6808         (Binary.Emit): Test first for doubles instead of
6809         floats, as they are more common.
6810
6811         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6812         when dealing with floats and the <=, >= operators.  This fixes bug
6813         #39314 
6814
6815         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6816         to load the array value by emitting a load on the foreach variable
6817         type.  This was incorrect.  
6818
6819         We now emit the code to load an element using the the array
6820         variable type, and then we emit the conversion operator.
6821
6822         Fixed #40176
6823
6824 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6825
6826         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6827
6828 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6829
6830         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6831         test for protection before we test for signatures. 
6832
6833         (MethodSignature.ToString): implement.
6834
6835         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6836         to the case where we reduced into a LongConstant.
6837
6838         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6839         depend on whether the information is acurrate, because the
6840         Microsoft runtime will always claim that the array type is public,
6841         regardless of the real state.
6842
6843         If the type is a pointer, another problem happens: the type is
6844         reported as non-public in Microsoft.  
6845
6846         In both cases we have to call CheckAccessLevel recursively with
6847         the underlying type as the argument to be tested.
6848
6849 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6850
6851         * assign.cs (Assign.Emit): If we are dealing with a compound
6852         assignment expression, we should use the code path that stores the
6853         intermediate result in a temporary value.  This fixes #40903.
6854
6855         *expression.cs (Indirection.ToString): Provide ToString method for
6856         debugging. 
6857
6858 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6859
6860         * class.cs: Null out fields holding references to Block objects so
6861         they can be garbage collected.
6862
6863         * expression.cs (OverloadResolve): Remove unused local.
6864
6865 2003-04-07  Martin Baulig  <martin@ximian.com>
6866
6867         * codegen.cs (EmitContext.CurrentFile): New public field.
6868         (EmitContext.Mark): Use the CurrentFile to check whether the
6869         location is in the correct file.
6870         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6871
6872 2003-04-07  Martin Baulig  <martin@ximian.com>
6873
6874         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6875
6876         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6877         location.  [FIXME: The location argument which gets passed to this
6878         method is sometimes wrong!]
6879
6880 2003-04-07  Nick Drochak <ndrochak@gol.com>
6881
6882         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6883
6884 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6885
6886         * expression.cs (Indirection.EmitAssign): We were using the
6887         temporary, but returning immediately instead of continuing the
6888         EmitAssing flow.
6889
6890 2003-04-06  Martin Baulig  <martin@ximian.com>
6891
6892         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6893         if it's a nested child, but also deriving from the outer class.
6894         See test 190.cs.
6895
6896         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6897         nested child, but also deriving from the outer class.  See
6898         test-190.cs.
6899         (FilterWithClosure): We may access private members of the outer
6900         class if we're a nested child and deriving from the outer class.
6901         (RealMemberLookup): Only set `closure_private_ok' if the
6902         `original_bf' contained BindingFlags.NonPublic.
6903
6904 2003-04-05  Martin Baulig  <martin@ximian.com>
6905
6906         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
6907
6908 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6909
6910         * class.cs (Event.Define): Do not allow abstract events to have
6911         initializers. 
6912
6913 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6914
6915         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6916         block in event declarations.
6917
6918         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6919         value type, get its address.
6920
6921         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6922         leaving a class on the stack instead of a boolean value (int
6923         0/1).  Change the code so we compare against null, and then the
6924         result against zero.
6925
6926         * class.cs (TypeContainer.GetClassBases): We were checking for the
6927         parent class being sealed too late.
6928
6929         * expression.cs (Binary.Emit): For <= and >= when dealing with
6930         floating point values, use cgt.un and clt.un instead of cgt and
6931         clt alone.
6932
6933 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6934
6935         * statement.cs: Apply the same optimization as MS: skip the 
6936         GetEnumerator returning an IEnumerator, and use the one returning a 
6937         CharEnumerator instead. This allows us to avoid the try-finally block 
6938         and the boxing.
6939
6940 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6941
6942         * cs-parser.jay: Attributes cannot be applied to
6943                          namespaces. Fixes #40473
6944
6945 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6946
6947         * class.cs:
6948         (Add*): check if the name is valid using the full name for constants,
6949         fields, properties and events.
6950
6951 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6952
6953         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6954         char constants to be part of the enumeration.
6955
6956         * expression.cs (Conditional.DoResolve): Add support for operator
6957         true. Implements the missing functionality from 14.12
6958
6959         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6960         operator true/false as required by the spec.
6961
6962         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6963         implicit conversion to boolean.
6964
6965         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6966         also one where the type implements `operator true'. 
6967
6968         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6969         get an expression that will invoke operator true based on an
6970         expression.  
6971
6972         (GetConversionOperators): Removed the hack that called op_True
6973         here.  
6974
6975         (Expression.ResolveBoolean): Move this from Statement.
6976
6977 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6978
6979         * ecore.cs (FieldExpr): do not allow initialization of initonly
6980         fields on derived classes
6981
6982 2003-03-13  Martin Baulig  <martin@ximian.com>
6983
6984         * statement.cs (Block.Emit): Call ig.BeginScope() and
6985         ig.EndScope() when compiling with debugging info; call
6986         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6987
6988 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6989
6990         * expression.cs (Indexers): Do not construct immediately, allow
6991         for new members to be appended as we go.  Fixes 38143
6992
6993 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6994
6995         * expression.cs: save/restore context when resolving an unchecked
6996         expression.
6997
6998 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6999
7000         * cfold.cs: Catch division by zero in modulus operator during
7001         constant folding.
7002
7003 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7004
7005         * interface.cs (Interface.DefineMembers): Avoid defining members
7006         twice. 
7007
7008 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7009
7010         * driver.cs: handle the +/- options for -noconfig
7011
7012         * statement.cs (Unckeched.Resolve): Also track the state of
7013         unchecked in the Resolve phase.
7014
7015 2003-02-27  Martin Baulig  <martin@ximian.com>
7016
7017         * ecore.cs (Expression.MemberLookup): Don't create a
7018         MethodGroupExpr for something which is not a method.  Fixes #38291.
7019
7020 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7021
7022         * class.cs (MemberBase.CheckParameters): Also check that the type
7023         is unmanaged if it is a pointer.
7024
7025         * expression.cs (SizeOf.Resolve): Add location information.
7026
7027         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7028         a managed type is declared.
7029
7030         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7031         parameter modifiers as well.  Fixes bug 38606
7032
7033         * class.cs: Very sad.  Am backing out the speed up changes
7034         introduced by the ArrayList -> Array in the TypeContainer, as they
7035         were not actually that much faster, and introduced a bug (no error
7036         reports on duplicated methods).
7037
7038         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7039         source first, this will guarantee that we have a valid expression
7040         before calling in lower levels functions that will require a
7041         resolved object.  Then use this original_source in the
7042         target.ResolveLValue instead of the original source that was
7043         passed to us.
7044
7045         Another change.  Use target.Resolve instead of LValueResolve.
7046         Although we are resolving for LValues, we will let the Assign code
7047         take care of that (it will be called again from Resolve).  This
7048         basically allows code like this:
7049
7050         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7051         class Y { void A (X x) { x [0] += o; }
7052
7053         The problem was that the indexer was trying to resolve for
7054         set_Item (idx, object o) and never finding one.  The real set_Item
7055         was set_Item (idx, X).  By delaying the process we get the right
7056         semantics. 
7057
7058         Fixes bug 36505
7059
7060 2003-02-23  Martin Baulig  <martin@ximian.com>
7061
7062         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7063         while calling DoEmit ().
7064
7065         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7066         source files; if you use the #line directive inside a method, the
7067         compiler stops emitting line numbers for the debugger until it
7068         reaches the end of the method or another #line directive which
7069         restores the original file.
7070
7071 2003-02-23  Martin Baulig  <martin@ximian.com>
7072
7073         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7074
7075 2003-02-23  Martin Baulig  <martin@ximian.com>
7076
7077         * statement.cs (Block.AddChildVariableNames): We need to call this
7078         recursively, not just for our immediate children.
7079
7080 2003-02-23  Martin Baulig  <martin@ximian.com>
7081
7082         * class.cs (Event.Define): Always make the field private, like csc does.
7083
7084         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7085         actually work, fixes bug #37521.
7086
7087 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7088
7089         * delegate.cs: When creating the various temporary "Parameters"
7090         classes, make sure that we call the ComputeAndDefineParameterTypes
7091         on those new parameters (just like we do with the formal ones), to
7092         allow them to be resolved in the context of the DeclSpace.
7093
7094         This fixes the bug that Dick observed in Bugzilla #38530.
7095
7096 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7097
7098         * expression.cs (ResolveMemberAccess): When resolving a constant,
7099         do not attempt to pull a constant if the value was not able to
7100         generate a valid constant.
7101
7102         * const.cs (LookupConstantValue): Do not report more errors than required.
7103
7104 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7105
7106         * expression.cs: fixes bug #38328.
7107
7108 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7109
7110         * class.cs: Changed all the various members that can be part of a
7111         class from being an ArrayList to be an Array of the right type.
7112         During the DefineType type_list, interface_list, delegate_list and
7113         enum_list are turned into types, interfaces, delegates and enums
7114         arrays.  
7115
7116         And during the member population, indexer_list, event_list,
7117         constant_list, field_list, instance_constructor_list, method_list,
7118         operator_list and property_list are turned into their real arrays.
7119
7120         Although we could probably perform this operation earlier, for
7121         good error reporting we need to keep the lists and remove the
7122         lists for longer than required.
7123
7124         This optimization was triggered by Paolo profiling the compiler
7125         speed on the output of `gen-sample-program.pl' perl script. 
7126
7127         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7128         not crash in methods like MemberLookupFailed that use this field.  
7129
7130         This problem arises when the compiler fails to resolve a type
7131         during interface type definition for example.
7132
7133 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7134
7135         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7136         inherit from System.Object, so we have to stop at null, not only
7137         when reaching System.Object.
7138
7139 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7140
7141         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7142         DeclaredOnly because the parent indexer might have had a different
7143         name, but did not loop until the top of the hierarchy was reached.
7144
7145         The problem this one fixes is 35492: when a class implemented an
7146         indexer from an interface, we were getting the interface method
7147         (which was abstract) and we were flagging an error (can not invoke
7148         abstract method).
7149
7150         This also keeps bug 33089 functioning, and test-148 functioning.
7151
7152         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7153         out if a method is special is to see if it is declared in a
7154         property or event, or whether it is one of the predefined operator
7155         names.   This should fix correctly #36804.
7156
7157 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7158
7159         The goal here is to remove the dependency on EmptyCast.Peel ().
7160         Killing it completely.
7161
7162         The problem is that currently in a number of places where
7163         constants are expected, we have to "probe" for an EmptyCast, and
7164         Peel, which is not the correct thing to do, as this will be
7165         repetitive and will likely lead to errors. 
7166
7167         The idea is to remove any EmptyCasts that are used in casts that
7168         can be reduced to constants, so we only have to cope with
7169         constants. 
7170
7171         This bug hunt was triggered by Bug 37363 and the desire to remove
7172         the duplicate pattern where we were "peeling" emptycasts to check
7173         whether they were constants.  Now constants will always be
7174         constants.
7175
7176         * ecore.cs: Use an enumconstant here instead of wrapping with
7177         EmptyCast.  
7178
7179         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7180         throwing me off.  By handling this we can get rid of a few hacks.
7181
7182         * statement.cs (Switch): Removed Peel() code.
7183
7184 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7185
7186         * class.cs: Location information for error 508
7187
7188         * expression.cs (New.DoResolve): Add a guard against double
7189         resolution of an expression.  
7190
7191         The New DoResolve might be called twice when initializing field
7192         expressions (see EmitFieldInitializers, the call to
7193         GetInitializerExpression will perform a resolve on the expression,
7194         and later the assign will trigger another resolution
7195
7196         This leads to bugs (#37014)
7197
7198         * delegate.cs: The signature for EndInvoke should contain any ref
7199         or out parameters as well.  We were not doing this in the past. 
7200
7201         * class.cs (Field.Define): Do not overwrite the type definition
7202         inside the `volatile' group.  Turns out that volatile enumerations
7203         were changing the type here to perform a validity test, which
7204         broke conversions. 
7205
7206 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7207
7208         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7209         and structs, we do not want to load the instance variable
7210
7211         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7212         enum_type has to be handled like an object reference (implicit
7213         conversions exists from this to object), but the regular IsClass
7214         and IsValueType tests will never return true for this one.
7215
7216         Also we use TypeManager.IsValueType instead of type.IsValueType,
7217         just for consistency with the rest of the code (this is only
7218         needed if we ever use the construct exposed by test-180.cs inside
7219         corlib, which we dont today).
7220
7221 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7222
7223         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7224         just InternalCall.
7225
7226 2003-02-09  Martin Baulig  <martin@ximian.com>
7227
7228         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7229         (Namespace.DefineNamespaces): New static public method; this is
7230         called when we're compiling with debugging to add all namespaces
7231         to the symbol file.
7232
7233         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7234         pass it to the Namespace's .ctor.
7235
7236         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7237         and MethodBase arguments; pass the namespace ID to the symwriter;
7238         pass the MethodBase instead of the token to the symwriter.
7239         (SymbolWriter.DefineNamespace): New method to add a namespace to
7240         the symbol file.
7241
7242 2003-02-09  Martin Baulig  <martin@ximian.com>
7243
7244         * symbolwriter.cs: New file.  This is a wrapper around
7245         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7246         methods here in near future.
7247
7248 2003-02-09  Martin Baulig  <martin@ximian.com>
7249
7250         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7251         ILGenerator.MarkSequencePoint() which are actually used by the
7252         symbol writer.
7253
7254 2003-02-09  Martin Baulig  <martin@ximian.com>
7255
7256         * location.cs (SourceFile): New public sealed class.  This
7257         contains the name and an index which is used in the location's token.
7258         (Location): Reserve an appropriate number of bits in the token for
7259         the source file instead of walking over that list, this gives us a
7260         really huge performance improvement when compiling with debugging.
7261
7262         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7263         `SourceFile' argument instead of a string.
7264         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7265         but don't parse/tokenize here, we need to generate the list of all
7266         source files before we do that.
7267         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7268         the files.
7269
7270         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7271         instead of a string.
7272
7273         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7274         of a string.
7275
7276 2003-02-09  Martin Baulig  <martin@ximian.com>
7277
7278         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7279         filename on `#line default'.
7280
7281 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7282
7283         * statement.cs: don't clear the pinned var when the fixed statement
7284         returns from the method (fixes bug#37752).
7285
7286 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7287
7288         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7289         to IsValueType.
7290
7291 2003-02-07  Martin Baulig  <martin@ximian.com>
7292
7293         * driver.cs: Removed the `--debug-args' command line argument.
7294
7295         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7296         automatically by the AsssemblyBuilder.
7297         (CodeGen.InitializeSymbolWriter): We don't need to call any
7298         initialization function on the symbol writer anymore.  This method
7299         doesn't take any arguments.
7300
7301 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7302
7303         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7304         from referenced assemblies as well.
7305
7306 2003-02-02  Martin Baulig  <martin@ximian.com>
7307
7308         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7309
7310 2003-02-02  Martin Baulig  <martin@ximian.com>
7311
7312         * class.cs (Constructor.Emit): Open the symbol writer before
7313         emitting the constructor initializer.
7314         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7315         single-stepping through constructor initializers.
7316
7317 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7318
7319         * class.cs: Handle error 549: do not allow virtual methods in
7320         sealed classes. 
7321
7322 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7323
7324         * decl.cs: Check access levels when resolving types
7325
7326 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7327
7328         * statement.cs: Add parameters and locals set in catch blocks that might 
7329         return to set vector
7330
7331 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7332
7333         * class.cs (Operator): Set the SpecialName flags for operators.
7334
7335         * expression.cs (Invocation.DoResolve): Only block calls to
7336         accessors and operators on SpecialName methods.
7337
7338         (Cast.TryReduce): Handle conversions from char constants.
7339
7340
7341 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7342
7343         * statement.cs: small memory and time optimization in FlowBranching.
7344
7345 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7346
7347         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7348         problem that the last fix but in the other sid (Set).
7349
7350         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7351         access when there is no indexer in the hierarchy.
7352
7353 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7354
7355         * class.cs: Combine some if statements.
7356
7357 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7358
7359         * driver.cs: fixed bug #37187.
7360
7361 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7362
7363         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7364         any indexer, it's needed to build a list with all the indexers in the
7365         hierarchy (AllGetters), else we have problems. Fixes #35653.
7366
7367 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7368
7369         * class.cs (MethodData.Define): It is wrong for an interface
7370         implementation to be static in both cases: explicit and implicit.
7371         We were only handling this in one case.
7372
7373         Improve the if situation there to not have negations.
7374
7375         * class.cs (Field.Define): Turns out that we do not need to check
7376         the unsafe bit on field definition, only on usage.  Remove the test.
7377
7378 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7379
7380         * driver.cs: use assembly.Location instead of Codebase (the latest
7381         patch made mcs fail when using MS assemblies).
7382
7383 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7384
7385         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7386         get the path to *corlib.dll.
7387
7388 2003-01-21  Nick Drochak <ndrochak@gol.com>
7389
7390         * cs-tokenizer.cs:
7391         * pending.cs:
7392         * typemanager.cs: Remove compiler warnings
7393
7394 2003-01-20  Duncan Mak  <duncan@ximian.com>
7395
7396         * AssemblyInfo.cs: Bump the version number to 0.19.
7397
7398 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7399
7400         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7401
7402 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7403
7404         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7405
7406 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7407
7408         * cs-parser.jay: Small fix: we were not comparing the constructor
7409         name correctly.   Thanks to Zoltan for the initial pointer.
7410
7411 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7412
7413         * cs-tokenizer.cs: Set file name when specified with #line
7414
7415 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7416
7417         * cs-parser.jay: Only perform the constructor checks here if we
7418         are named like the class;  This will help provider a better
7419         error.  The constructor path is taken when a type definition is
7420         not found, but most likely the user forgot to add the type, so
7421         report that rather than the constructor error.
7422
7423 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7424
7425         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7426         allocations.
7427
7428 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7429
7430         * cs-parser.jay: Add cleanup call.
7431
7432 2003-01-13  Duncan Mak  <duncan@ximian.com>
7433
7434         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7435         consistent with other methods.
7436
7437 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7438
7439         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7440
7441 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7442
7443         * attribute.cs: only set GuidAttr to true when we have a
7444         GuidAttribute.
7445
7446 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7447
7448         * ecore.cs:
7449         * expression.cs:
7450         * typemanager.cs: fixes to allow mcs compile corlib with the new
7451         Type.IsSubclassOf fix.
7452
7453 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7454
7455         * expression.cs (LocalVariableReference.DoResolve): Classify a
7456         constant as a value, not as a variable.   Also, set the type for
7457         the variable.
7458
7459         * cs-parser.jay (fixed_statement): take a type instead of a
7460         pointer_type, so we can produce a better error message later.
7461
7462         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7463         as an error.  
7464
7465         (For.DoEmit): Make inifinite loops have a
7466         non-conditional branch back.
7467
7468         (Fixed.DoEmit): First populate the pinned variables, then emit the
7469         statement, then clear the variables.  Before I was emitting the
7470         code once for each fixed piece.
7471
7472
7473 2003-01-08  Martin Baulig  <martin@ximian.com>
7474
7475         * statement.cs (FlowBranching.MergeChild): A break in a
7476         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7477
7478 2003-01-08  Martin Baulig  <martin@ximian.com>
7479
7480         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7481         lives in the same number space than `param_map'.  Fixes #36154.
7482
7483 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7484
7485         * cs-parser.jay (constructor_declaration): Set the
7486         Constructor.ModFlags before probing for it.  This makes the
7487         compiler report 514, 515 and 132 (the code was there, but got
7488         broken). 
7489
7490         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7491         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7492         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7493
7494 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7495
7496         * enum.cs: create the enum static fields using the enum type.
7497
7498 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7499
7500         * class.cs: don't try to create the ParamBuilder for the return
7501         type if it's not needed (and handle it breaking for the ms runtime
7502         anyway).
7503
7504 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7505
7506         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7507
7508 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7509
7510         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7511         the command.   This showed up while compiling the JANET source
7512         code, which used \r as its only newline separator.
7513
7514 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7515
7516         * class.cs (Method.Define): If we are an operator (because it
7517         reuses our code), then set the SpecialName and HideBySig.  #36128
7518
7519 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7520
7521         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7522         exception, report error 120 `object reference required'.
7523
7524         * driver.cs: Add --pause option, used during to measure the size
7525         of the process as it goes with --timestamp.
7526
7527         * expression.cs (Invocation.DoResolve): Do not allow methods with
7528         SpecialName to be invoked.
7529
7530 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7531
7532         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7533         number before adding it.
7534
7535 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7536
7537         * ecore.cs (StandardImplicitConversion): When in an unsafe
7538         context, we allow conversion between void * to any other pointer
7539         type. This fixes bug #35973.
7540
7541 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7542
7543         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7544         is not thrown when extensionless outputs are used 
7545
7546 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7547
7548         * rootcontext.cs: fixed compilation of corlib.
7549
7550 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7551
7552         * attribute.cs (Attributes.Contains): Add new method.
7553
7554         * class.cs (MethodCore.LabelParameters): if the parameter is an
7555         `out' parameter, check that no attribute `[In]' has been passed.
7556
7557         * enum.cs: Handle the `value__' name in an enumeration.
7558
7559 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7560
7561         * decl.cs: Added special case to allow overrides on "protected
7562         internal" methods
7563
7564 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7565
7566         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7567         since it makes much more sense.
7568
7569         (Attributes.ctor): Don't require a Location parameter.
7570
7571         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7572
7573         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7574         since we already have that information per attribute.
7575
7576         * everywhere : make appropriate changes.
7577
7578         * class.cs (LabelParameters): Write the code which actually
7579         applies attributes to the return type. We can't do this on the MS
7580         .NET runtime so we flag a warning in the case an exception is
7581         thrown.
7582
7583 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7584
7585         * const.cs: Handle implicit null conversions here too.
7586
7587 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7588
7589         * class.cs (MethodCore.LabelParameters): Remove the extra
7590         Type [] parameter since it is completely unnecessary. Instead
7591         pass in the method's attributes so that we can extract
7592         the "return" attribute.
7593
7594 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7595
7596         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7597         of ignoring it and letting the compile continue.
7598
7599         * typemanager.cs (ChangeType): use an extra argument to return an
7600         error condition instead of throwing an exception.
7601
7602 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7603
7604         * expression.cs (Unary.TryReduce): mimic the code for the regular
7605         code path.  Perform an implicit cast in the cases where we can
7606         implicitly convert to one of the integral types, and then reduce
7607         based on that constant.   This fixes bug #35483.
7608
7609 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7610
7611         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7612
7613 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7614
7615         * namespace.cs: fixed bug #35489.
7616
7617 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7618
7619         * class.cs: Remove some dead code.
7620
7621         * cs-parser.jay: Estimate the number of methods needed
7622         (RootContext.MethodCount);
7623
7624         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7625         numbers instead of StringBuilders.
7626
7627         * support.cs (PtrHashtable): Add constructor with initial size;
7628         We can now reduce reallocations of the method table.
7629
7630 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7631
7632         * attribute.cs (ApplyAttributes): Keep track of the emitted
7633         attributes on a per-target basis. This fixes bug #35413.
7634
7635 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7636
7637         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7638         default to the Windows 1252 encoding.
7639
7640         (UnixParseOption): Support version, thanks to Alp for the missing
7641         pointer. 
7642
7643         * AssemblyInfo.cs: Add nice assembly information.
7644
7645         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7646         (bug 35169).
7647
7648         * cs-parser.jay: Allow a trailing comma before the close bracked
7649         in the attribute_section production.
7650
7651         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7652         address of the instance was being taken, I will take this out,
7653         because we take the address of the object immediately here.
7654
7655 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7656
7657         * typemanager.cs (AreMultipleAllowed): Take care of the most
7658         obvious case where attribute type is not in the current assembly -
7659         stupid me ;-)
7660
7661 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7662
7663         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7664         definitions, instead of doing that afterwards.  
7665
7666         Also we use a nice little hack, depending on the constructor, we
7667         know if we are a "composed" name or a simple name.  Hence, we
7668         avoid the IndexOf test, and we avoid 
7669
7670         * codegen.cs: Add code to assist in a bug reporter to track down
7671         the source of a compiler crash. 
7672
7673 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7674
7675         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7676         types have been emitted for a given element and flag an error
7677         if something which does not have AllowMultiple set is used more
7678         than once.
7679
7680         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7681         attribute types and their corresponding AllowMultiple properties
7682
7683         (AreMultipleAllowed): Check the property for a given type.
7684
7685         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7686         property in the case we have a TypeContainer.
7687
7688         (Attributes.AddAttribute): Detect duplicates and just skip on
7689         adding them. This trivial fix catches a pretty gross error in our
7690         attribute emission - global attributes were being emitted twice!
7691
7692         Bugzilla bug #33187 is now fixed.
7693
7694 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7695
7696         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7697         instead of pp_and).
7698
7699         * expression.cs (Binary.ResolveOperator): I can only use the
7700         Concat (string, string, string) and Concat (string, string,
7701         string, string) if the child is actually a concatenation of
7702         strings. 
7703
7704 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7705
7706         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7707         context where we need a 2-character lookahead.
7708
7709         * pending.cs (PendingImplementation): Rework so we can keep track
7710         of interface types all the time, and flag those which were
7711         implemented by parents as optional.
7712
7713 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7714
7715         * expression.cs (Binary.ResolveOperator): Use
7716         String.Concat(string,string,string) or
7717         String.Concat(string,string,string,string) when possible. 
7718
7719         * typemanager: More helper methods.
7720
7721
7722 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7723
7724         * pending.cs: remove the bogus return from GetMissingInterfaces()
7725         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7726
7727 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7728
7729         * namespace.cs: avoid duplicated 'using xxx' being added to
7730         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7731         when we get more than one 'using' statement for the same namespace.
7732         Report a CS0105 warning for it.
7733
7734 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7735
7736         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7737         of calling getChar/putback, uses internal knowledge of it.    
7738
7739         (xtoken): Reorder tokenizer so most common patterns are checked
7740         first.  This reduces the compilation time in another 5% (from 8.11s
7741         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7742
7743         The parsing time is 22% of the compilation in mcs, and from that
7744         64% is spent on the tokenization process.  
7745
7746         I tried using a binary search for keywords, but this is slower
7747         than the hashtable.  Another option would be to do a couple of
7748         things:
7749
7750                 * Not use a StringBuilder, instead use an array of chars,
7751                   with a set value.  Notice that this way we could catch
7752                   the 645 error without having to do it *afterwards*.
7753
7754                 * We could write a hand-parser to avoid the hashtable
7755                   compares altogether.
7756
7757         The identifier consumption process takes 37% of the tokenization
7758         time.  Another 15% is spent on is_number.  56% of the time spent
7759         on is_number is spent on Int64.Parse:
7760
7761                 * We could probably choose based on the string length to
7762                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7763                   computations. 
7764
7765         Another 3% is spend on wrapping `xtoken' in the `token' function.
7766
7767         Handle 0xa0 as whitespace (#34752)
7768
7769 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7770
7771         * typemanager.cs (IsCLRType): New routine to tell whether a type
7772         is one of the builtin types.  
7773
7774         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7775         typecode in more places instead of doing pointer comparissions.
7776         We could leverage some knowledge about the way the typecodes are
7777         laid out.
7778
7779         New code to cache namespaces in assemblies, it is currently not
7780         invoked, to be used soon.
7781
7782         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7783
7784         * expression.cs (Binary.ResolveOperator): specially handle
7785         strings, and do not perform user-defined operator overloading for
7786         built-in types.
7787
7788 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7789
7790         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7791         internalcall as it is a pretty simple operation;  Avoid whenever
7792         possible to call Char.IsLetter.
7793
7794         (consume_identifier): Cut by half the number of
7795         hashtable calls by merging the is_keyword and GetKeyword behavior.
7796
7797         Do not short-circuit, because if we do, we
7798         report errors (ie, #if false && true would produce an invalid
7799         directive error);
7800
7801
7802 2002-11-24  Martin Baulig  <martin@ximian.com>
7803
7804         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7805         check constant ranges and report a CS0221.  Fixes #33186.
7806
7807 2002-11-24  Martin Baulig  <martin@ximian.com>
7808
7809         * cs-parser.jay: Make this work for uninitialized variable
7810         declarations in the `for' initializer.  Fixes #32416.
7811
7812 2002-11-24  Martin Baulig  <martin@ximian.com>
7813
7814         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7815         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7816
7817 2002-11-24  Martin Baulig  <martin@ximian.com>
7818
7819         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7820         argument; if true, we also check for user-defined conversions.
7821         This is only needed if both arguments are of a user-defined type.
7822         Fixes #30443, added test-175.cs.
7823         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7824
7825         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7826
7827 2002-11-24  Martin Baulig  <martin@ximian.com>
7828
7829         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7830         function to get the store opcode.
7831         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7832         only emit the Ldelema if the store opcode is Stobj.  You must run
7833         both test-34 and test-167 to test this.  Fixes #34529.
7834
7835 2002-11-23  Martin Baulig  <martin@ximian.com>
7836
7837         * ecore.cs (Expression.MemberLookup): Added additional
7838         `qualifier_type' argument which is used when we're being called
7839         from MemberAccess.DoResolve() and null if we're called from a
7840         SimpleName lookup.
7841         (Expression.MemberLookupFailed): New method to report errors; this
7842         does the CS1540 check and reports the correct error message.
7843
7844         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7845         argument for the CS1540 check and redone the way how we're dealing
7846         with private members.  See the comment in the source code for details.
7847         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7848         `closure_start_type' to `closure_qualifier_type' and check whether
7849         it's not null.  It was not this filter being broken, it was just
7850         being called with the wrong arguments.
7851
7852         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7853         and pass it the correct `qualifier_type'; this also does the error
7854         handling for us.
7855
7856 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7857
7858         * expression.cs (Invocation.EmitParams): If the we are dealing
7859         with a non-built-in value type, load its address as well.
7860
7861         (ArrayCreation): Use a a pretty constant instead
7862         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7863         static initializers.  
7864
7865         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7866         because they are not really value types, just glorified integers. 
7867
7868         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7869
7870         * ecore.cs: Remove redundant code for enumerations, make them use
7871         the same code path as everything else, fixes the casting issue
7872         with enumerations in Windows.Forms.
7873
7874         * attribute.cs: Do only cast to string if it is a string, the
7875         validation happens later.
7876
7877         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7878         people upgrade their corlibs.
7879
7880         * ecore.cs: Oops, enumerations were not following the entire code path
7881
7882 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7883
7884         * typemanager.cs (FilterWithClosure): Commented out the test for
7885         1540 in typemanager.cs, as it has problems when accessing
7886         protected methods from a parent class (see test-174.cs). 
7887
7888         * attribute.cs (Attribute.ValidateGuid): new method.
7889         (Attribute.Resolve): Use above.
7890
7891 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7892
7893         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7894
7895         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7896         handling for enumerations, as we only needed the TypeContainer
7897         functionality to begin with (this is required for the fix below to
7898         work for enums that reference constants in a container class for
7899         example). 
7900
7901         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7902
7903         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7904         a valid TypeBuilder to perform lookups on.o
7905
7906         * class.cs (InheritableMemberSignatureCompare): Use true in the
7907         call to GetGetMethod and GetSetMethod, because we are comparing
7908         the signature, and we need to get the methods *even* if they are
7909         private. 
7910
7911         (PropertyBase.CheckBase): ditto.
7912
7913         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7914         GotoCase.Resolve): Use Peel on EmpytCasts.
7915
7916         * ecore.cs (EmptyCast): drop child, add Peel method.
7917
7918 2002-11-17  Martin Baulig  <martin@ximian.com>
7919
7920         * ecore.cs (EmptyCast.Child): New public property.
7921
7922         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7923         label resolved to an EmptyCast.  Fixes #34162.
7924         (GotoCase.Resolve): Likewise.
7925         (Block.EmitMeta): Likewise.
7926
7927 2002-11-17  Martin Baulig  <martin@ximian.com>
7928
7929         * expression.cs (Invocation.BetterConversion): Prefer int over
7930         uint; short over ushort; long over ulong for integer literals.
7931         Use ImplicitConversionExists instead of StandardConversionExists
7932         since we also need to check for user-defined implicit conversions.
7933         Fixes #34165.  Added test-173.cs.
7934
7935 2002-11-16  Martin Baulig  <martin@ximian.com>
7936
7937         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7938         with the `true' and `false' literals.  Fixes #33151.
7939
7940 2002-11-16  Martin Baulig  <martin@ximian.com>
7941
7942         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7943         October 22nd; don't do the cs1540 check for static members.
7944
7945         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7946         now using our own filter here and doing the cs1540 check again.
7947
7948 2002-11-16  Martin Baulig  <martin@ximian.com>
7949
7950         * support.cs (InternalParameters): Don't crash if we don't have
7951         any fixed parameters.  Fixes #33532.
7952
7953 2002-11-16  Martin Baulig  <martin@ximian.com>
7954
7955         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7956         when looking up static methods to make this work on Windows.
7957         Fixes #33773.
7958
7959 2002-11-16  Martin Baulig  <martin@ximian.com>
7960
7961         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7962         a setter rather than using PropertyInfo.CanWrite.
7963
7964 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7965
7966         * class.cs: Allow acces to block member by subclasses. Fixes build
7967         breaker.
7968
7969 2002-11-14  Martin Baulig  <martin@ximian.com>
7970
7971         * class.cs (Constructor.Emit): Added the extern/block check.
7972         Fixes bug #33678.
7973
7974 2002-11-14  Martin Baulig  <martin@ximian.com>
7975
7976         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7977         iteration while looking for indexers, this is needed because the
7978         indexer may have a different name in our base classes.  Fixed the
7979         error reporting (no indexers at all, not get accessor, no
7980         overloaded match).  Fixes bug #33089.
7981         (IndexerAccess.DoResolveLValue): Likewise.
7982
7983 2002-11-14  Martin Baulig  <martin@ximian.com>
7984
7985         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7986         indexers.  Fixes the first part of bug #33089.
7987         (MethodSignature.InheritableMemberSignatureCompare): Added support
7988         for properties.
7989
7990 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7991
7992         * attribute.cs (Attribute.Resolve): Catch the
7993         NullReferenceException and report it since it isn't supposed to
7994         happen. 
7995
7996 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7997
7998         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7999         LogicalOr and LogicalAnd that can benefit from recursively
8000         handling EmitBranchable.  The code now should be nice for Paolo.
8001
8002 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8003
8004         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8005         the Type lookups, as we perform quite a number of lookups on
8006         non-Types.  This can be removed once we can deterministically tell
8007         whether we have a type or a namespace in advance.
8008
8009         But this might require special hacks from our corlib.
8010
8011         * TODO: updated.
8012
8013         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8014         and double which avoids a conversion from an integer to a double.
8015
8016         * expression.cs: tiny optimization, avoid calling IsConstant,
8017         because it effectively performs the lookup twice.
8018
8019 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8020
8021         But a bogus return here to keep the semantics of the old code
8022         until the Mono runtime is fixed.
8023
8024         * pending.cs (GetMissingInterfaces): New method used to remove all
8025         the interfaces that are already implemented by our parent
8026         classes from the list of pending methods. 
8027
8028         * interface.cs: Add checks for calls after ResolveTypeExpr.
8029
8030 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8031
8032         * class.cs (Class.Emit): Report warning 67: event not used if the
8033         warning level is beyond 3.
8034
8035         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8036         being a NullLiteral.
8037
8038         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8039         specifiers. 
8040
8041         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8042         path that might fail if a type can not be resolved.
8043
8044         * expression.cs (Binary.Emit): Emit unsigned versions of the
8045         operators. 
8046
8047         * driver.cs: use error 5.
8048
8049 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8050
8051         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8052
8053 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8054
8055         * cs-parser.jay (switch_section): A beautiful patch from Martin
8056         Baulig that fixed 33094.
8057
8058 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8059
8060         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8061         Check whether the base is abstract and report an error if so.
8062
8063         * expression.cs (IndexerAccess.DoResolveLValue,
8064         IndexerAccess.DoResolve): ditto. 
8065
8066         (Invocation.DoResolve): ditto.
8067
8068         (Invocation.FullMethodDesc): Improve the report string.
8069
8070         * statement.cs (Block): Eliminate IsVariableDefined as it is
8071         basically just a wrapper for GetVariableInfo.
8072
8073         * ecore.cs (SimpleName): Use new 
8074
8075         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8076         type, as we return the actual parameter ref/unref state on a
8077         different call.
8078
8079 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8080
8081         * support.cs: Return proper flags REF/OUT fixing the previous
8082         commit.  
8083
8084         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8085         not used to mean `ref' but `ref or out' in ParameterReference
8086
8087         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8088         full type signature instead of calling TypeManger.CSharpName
8089         ourselves. 
8090
8091         * support.cs (InternalParameters.ParameterDesc): Do not compare
8092         directly to the modflags, because REF/OUT will actually be bitsets
8093         if set. 
8094
8095         * delegate.cs (VerifyMethod): Check also the modifiers.
8096
8097         * cs-tokenizer.cs: Fix bug where floating point values with an
8098         exponent where a sign was missing was ignored.
8099
8100         * driver.cs: Allow multiple assemblies to be specified in a single
8101         /r: argument
8102
8103 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8104
8105         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8106         because identifiers after a parenthesis would end up in this kind
8107         of production, and we needed to desamiguate it for having casts
8108         like:
8109
8110                 (UserDefinedType *) xxx
8111
8112 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8113
8114         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8115         we should set on the Bindingflags.NonPublic, but not turn on
8116         private_ok.  private_ok controls whether a Private member is
8117         returned (this is chekced on the filter routine), while the
8118         BindingFlags.NonPublic just controls whether private/protected
8119         will be allowed.   This fixes the problem part of the problem of
8120         private properties being allowed to be used in derived classes.
8121
8122         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8123         so we can call the children DoResolveLValue method (this will
8124         properly signal errors on lvalue assignments to base properties)
8125
8126         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8127         getter are null, and we have a property info, we know that this
8128         happened because the lookup failed, so we report an error 122 for
8129         protection level violation.
8130
8131         We also silently return if setter and getter are null in the
8132         resolve functions, this condition only happens if we have flagged
8133         the error before.  This is the other half of the problem. 
8134
8135         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8136         not have accessibility information, that is why we were returning
8137         true in the filter function in typemanager.cs.
8138
8139         To properly report 122 (property is inaccessible because of its
8140         protection level) correctly, we report this error in ResolveAccess
8141         by failing if both the setter and the getter are lacking (ie, the
8142         lookup failed). 
8143
8144         DoResolve and DoLResolve have been modified to check for both
8145         setter/getter being null and returning silently, the reason being
8146         that I did not want to put the knowledge about this error in upper
8147         layers, like:
8148
8149         int old = Report.Errors;
8150         x = new PropertyExpr (...);
8151         if (old != Report.Errors)
8152                 return null;
8153         else
8154                 return x;
8155
8156         So the property expr is returned, but it is invalid, so the error
8157         will be flagged during the resolve process. 
8158
8159         * class.cs: Remove InheritablePropertySignatureCompare from the
8160         class, as we no longer depend on the property signature to compute
8161         whether it is possible to implement a method or not.
8162
8163         The reason is that calling PropertyInfo.GetGetMethod will return
8164         null (in .NET, in Mono it works, and we should change this), in
8165         cases where the Get Method does not exist in that particular
8166         class.
8167
8168         So this code:
8169
8170         class X { public virtual int A { get { return 1; } } }
8171         class Y : X { }
8172         class Z : Y { public override int A { get { return 2; } } }
8173
8174         Would fail in Z because the parent (Y) would not have the property
8175         defined.  So we avoid this completely now (because the alternative
8176         fix was ugly and slow), and we now depend exclusively on the
8177         method names.
8178
8179         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8180         reference method, instead of using the property.
8181
8182         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8183         routines are gone now.
8184
8185         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8186         names, they were incorrectly named.
8187
8188         * cs-tokenizer.cs: Return are more gentle token on failure. 
8189
8190         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8191         had an out-of-sync index variable, which caused it to remove from
8192         the list of pending methods the wrong method sometimes.
8193
8194 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8195
8196         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8197         CanWrite, because those refer to this particular instance of the
8198         property, and do not take into account the fact that we can
8199         override single members of a property.
8200
8201         Constructor requires an EmitContext.  The resolution process does
8202         not happen here, but we need to compute the accessors before,
8203         because the resolution does not always happen for properties.
8204
8205         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8206         subclass, before we did not update this flag, but we did update
8207         bindingflags. 
8208
8209         (GetAccessors): Drop this routine, as it did not work in the
8210         presence of partially overwritten set/get methods. 
8211
8212         Notice that this broke the cs1540 detection, but that will require
8213         more thinking. 
8214
8215 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8216
8217         * class.cs:
8218         * codegen.cs:
8219         * driver.cs: issue a warning instead of an error if we don't support
8220         debugging for the platform. Also ignore a couple of errors that may
8221         arise when trying to write the symbols. Undo my previous patch.
8222
8223 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8224
8225         * driver.cs: ignore /debug switch except for Unix platforms.
8226
8227 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8228
8229         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8230
8231 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8232
8233         * driver.cs: Do not make mcs-debug conditional, so we do not break
8234         builds that use it.
8235
8236         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8237         review this patch.  But basically after all the children variables
8238         have been merged, the value of "Breaks" was not being set to
8239         new_breaks for Switch blocks.  I think that it should be set after
8240         it has executed.  Currently I set this to the value of new_breaks,
8241         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8242         conservative, but I do not understand this code very well.
8243
8244         I did not break anything in the build, so that is good ;-)
8245
8246         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8247
8248 2002-10-20  Mark Crichton  <crichton@gimp.org>
8249
8250         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8251
8252 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8253
8254         * cfold.cs: Fixed compile blocker.
8255
8256 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8257
8258         * driver.cs: I was chekcing the key, not the file.
8259
8260 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8261
8262         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8263         message that we were generating - we just need to silently return
8264         a null.
8265
8266 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8267
8268         * class.cs (Event.Define): Change my previous commit, as this
8269         breaks the debugger.  This is a temporary hack, as it seems like
8270         the compiler is generating events incorrectly to begin with.
8271
8272         * expression.cs (Binary.ResolveOperator): Added support for 
8273         "U operator - (E x, E y)"
8274
8275         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8276         y)".
8277
8278         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8279         init-only variables, but this path did not take into account that
8280         there might be also instance readonly variables.  Correct this
8281         problem. 
8282
8283         This fixes bug 32253
8284
8285         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8286         delegates as well.
8287
8288         * driver.cs: Change the extension for modules to `netmodule'
8289
8290         * cs-parser.jay: Improved slightly the location tracking for
8291         the debugger symbols.
8292
8293         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8294         modifiers that were specified instead of the hardcoded value
8295         (FamAndAssem).  This was basically ignoring the static modifier,
8296         and others.  Fixes 32429.
8297
8298         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8299         fixed a bug in the process (32476)
8300
8301         * expression.cs (ArrayAccess.EmitAssign): Patch from
8302         hwang_rob@yahoo.ca that fixes bug 31834.3
8303
8304 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8305
8306         * driver.cs: Make the module extension .netmodule.
8307
8308 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8309
8310         * driver.cs: Report an error if the resource file is not found
8311         instead of crashing.
8312
8313         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8314         false, like Emit does.
8315
8316 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8317
8318         * typemanager.cs: Remove unused private member.  Also reported mcs
8319         bug to report this as a warning like csc.
8320
8321 2002-10-15  Martin Baulig  <martin@gnome.org>
8322
8323         * statement.cs (Statement.Emit): Made this a virtual method; emits
8324         the line number info and calls DoEmit().
8325         (Statement.DoEmit): New protected abstract method, formerly knows
8326         as Statement.Emit().
8327
8328         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8329
8330 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8331
8332         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8333         have fixed a remaining problem: not every AddXXXX was adding a
8334         fully qualified name.  
8335
8336         Now everyone registers a fully qualified name in the DeclSpace as
8337         being defined instead of the partial name.  
8338
8339         Downsides: we are slower than we need to be due to the excess
8340         copies and the names being registered this way.  
8341
8342         The reason for this is that we currently depend (on the corlib
8343         bootstrap for instance) that types are fully qualified, because
8344         we dump all the types in the namespace, and we should really have
8345         types inserted into the proper namespace, so we can only store the
8346         basenames in the defined_names array.
8347
8348 2002-10-10  Martin Baulig  <martin@gnome.org>
8349
8350         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8351         from bug #31834, see the bug report for a testcase which is
8352         miscompiled.
8353
8354 2002-10-10  Martin Baulig  <martin@gnome.org>
8355
8356         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8357         flow analysis code for this.
8358
8359         * statement.cs (Do, While, For): Tell the flow analysis code about
8360         infinite loops.
8361         (FlowBranching.UsageVector): Added support for infinite loops.
8362         (Block.Resolve): Moved the dead code elimination here and use flow
8363         analysis to do it.
8364
8365 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8366
8367         * class.cs (Field.Define): Catch cycles on struct type
8368         definitions. 
8369
8370         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8371         fields if the fields are static.  We only need to check instance
8372         fields. 
8373
8374         * expression.cs (As.DoResolve): Test for reference type.
8375
8376         * statement.cs (Using.ResolveExpression): Use
8377         ConvertImplicitRequired, not ConvertImplicit which reports an
8378         error on failture
8379         (Using.ResolveLocalVariableDecls): ditto.
8380
8381         * expression.cs (Binary.ResolveOperator): Report errors in a few
8382         places where we had to.
8383
8384         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8385
8386 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8387
8388         * expression.cs: Use StoreFromPtr instead of extracting the type
8389         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8390
8391         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8392         an enumeration value to a System.Enum, but System.Enum is not a
8393         value type, but an class type, so we need to box.
8394
8395         (Expression.ConvertExplicit): One codepath could return
8396         errors but not flag them.  Fix this.  Fixes #31853
8397
8398         * parameter.cs (Resolve): Do not allow void as a parameter type.
8399
8400 2002-10-06  Martin Baulig  <martin@gnome.org>
8401
8402         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8403         if it's a class type and not a struct.  Fixes #31815.
8404
8405 2002-10-06  Martin Baulig  <martin@gnome.org>
8406
8407         * statement.cs: Reworked the flow analysis code a bit to make it
8408         usable for dead code elimination.
8409
8410 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8411
8412         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8413
8414 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8415
8416         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8417         to fix the test 165, will investigate deeper.
8418
8419 2002-10-04  Martin Baulig  <martin@gnome.org>
8420
8421         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8422         finally blocks actually work.
8423         (Try.Resolve): We don't need to create a sibling for `finally' if
8424         there is no finally block.
8425
8426 2002-10-04  Martin Baulig  <martin@gnome.org>
8427
8428         * class.cs (Constructor.Define): The default accessibility for a
8429         non-default constructor is private, not public.
8430
8431 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8432
8433         * class.cs (Constructor): Make AllowedModifiers public, add
8434         EXTERN.
8435
8436         * cs-parser.jay: Perform the modifiers test here, as the
8437         constructor for the Constructor class usually receives a zero
8438         because of the way we create it (first we create, later we
8439         customize, and we were never checking the modifiers).
8440
8441         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8442         is a version of LookupTypeReflection that includes the type-name
8443         cache.  This can be used as a fast path for functions that know
8444         the fully qualified name and are only calling into *.GetType() to
8445         obtain a composed type.
8446
8447         This is also used by TypeManager.LookupType during its type
8448         composition.
8449
8450         (LookupType): We now also track the real type name, as sometimes
8451         we can get a quey for the real type name from things like
8452         ComposedCast.  This fixes bug 31422.
8453
8454         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8455         complete type fullname, it does not have to go through the type
8456         resolution system to obtain the composed version of the type (for
8457         obtaining arrays or pointers).
8458
8459         (Conditional.Emit): Use the EmitBoolExpression to
8460         generate nicer code, as requested by Paolo.
8461
8462         (ArrayCreation.CheckIndices): Use the patch from
8463         hwang_rob@yahoo.ca to validate the array initializers. 
8464
8465 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8466
8467         * class.cs (ConstructorInitializer.Emit): simplify code by using
8468         Invocation.EmitCall, and at the same time, fix the bugs in calling
8469         parent constructors that took variable arguments. 
8470
8471         * ecore.cs (Expression.ConvertNumericExplicit,
8472         Expression.ImplicitNumericConversion): Remove the code that
8473         manually wrapped decimal (InternalTypeConstructor call is now gone
8474         as well).
8475
8476         * expression.cs (Cast.TryReduce): Also handle decimal types when
8477         trying to perform a constant fold on the type.
8478
8479         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8480
8481         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8482         that only turned off an error report, and did nothing else. 
8483
8484 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8485
8486         * driver.cs: Handle and ignore /fullpaths
8487
8488 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * expression.cs (Binary.ResolveOperator): Catch the case where
8491         DoNumericPromotions returns true, 
8492
8493         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8494
8495 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8496
8497         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8498         report error 70.
8499
8500 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8501
8502         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8503         conversion exists, but it is also required that the conversion be
8504         performed.  This manifested in "(Type64Enum) 2".  
8505
8506         * class.cs (TypeManager.AddMethod): The fix is not to change
8507         AddEnum, because that one was using a fully qualified name (every
8508         DeclSpace derivative does), but to change the AddMethod routine
8509         that was using an un-namespaced name.  This now correctly reports
8510         the duplicated name.
8511
8512         Revert patch until I can properly fix it.  The issue
8513         is that we have a shared Type space across all namespaces
8514         currently, which is wrong.
8515
8516         Options include making the Namespace a DeclSpace, and merge
8517         current_namespace/current_container in the parser.
8518
8519 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8520
8521         * cs-parser.jay: Improve error reporting when we get a different
8522         kind of expression in local_variable_type and
8523         local_variable_pointer_type. 
8524
8525         Propagate this to avoid missleading errors being reported.
8526
8527         * ecore.cs (ImplicitReferenceConversion): treat
8528         TypeManager.value_type as a target just like object_type.   As
8529         code like this:
8530
8531         ValueType v = 1;
8532
8533         Is valid, and needs to result in the int 1 being boxed before it
8534         is assigned to the value type v.
8535
8536         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8537         to validate the enumeration name.
8538
8539         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8540         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8541         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8542
8543         * ecore.cs (TryImplicitIntConversion): When doing an
8544         implicit-enumeration-conversion, check if the type is 64-bits and
8545         perform a conversion before passing to EnumConstant.
8546
8547 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8548
8549         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8550         report ambiguous type references.  Unlike the MS version, we
8551         report what the ambiguity is.   Innovation at work ;-)
8552
8553         (DeclSpace.FindType): Require a location argument to
8554         display when we display an ambiguous error.
8555
8556         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8557
8558         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8559
8560         * expression.cs (EmitDynamicInitializers): Apply patch from
8561         hwang_rob@yahoo.ca that fixes the order in which we emit our
8562         initializers. 
8563
8564 2002-09-21  Martin Baulig  <martin@gnome.org>
8565
8566         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8567         delegate takes no arguments.
8568
8569 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8570
8571         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8572         from integers.
8573
8574         * expression.cs: Extract the underlying type.
8575
8576         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8577
8578         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8579
8580 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8581
8582         * class.cs (TypeContainer.DefineType): We can not use the nice
8583         PackingSize with the size set to 1 DefineType method, because it
8584         will not allow us to define the interfaces that the struct
8585         implements.
8586
8587         This completes the fixing of bug 27287
8588
8589         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8590         means also structs.  This fixes part of the problem. 
8591         (Expresion.ImplicitReferenceConversionExists): ditto.
8592
8593         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8594         error if there were no errors reported during the type lookup
8595         process, to avoid duplicates or redundant errors.  Without this
8596         you would get an ambiguous errors plus a type not found.  We have
8597         beaten the user enough with the first error.  
8598
8599         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8600         reference. 
8601
8602         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8603         during the resolution process, stop the lookup, this avoids
8604         repeated error reports (same error twice).
8605
8606         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8607
8608         * typemanager.cs (LookupType): Redo the type lookup code to match
8609         the needs of System.Reflection.  
8610
8611         The issue is that System.Reflection requires references to nested
8612         types to begin with a "+" sign instead of a dot.  So toplevel
8613         types look like: "NameSpace.TopLevelClass", and nested ones look
8614         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8615         levels. 
8616
8617 2002-09-19  Martin Baulig  <martin@gnome.org>
8618
8619         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8620         says that a method always returns or always throws an exception,
8621         don't report the CS0161.
8622
8623         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8624         set `Returns = new_returns'.
8625
8626 2002-09-19  Martin Baulig  <martin@gnome.org>
8627
8628         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8629         to an enum constant, check for a CS0176.
8630
8631 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8632
8633         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8634         for operators that must be in pairs and report errors.
8635
8636         * ecore.cs (SimpleName.DoResolveType): During the initial type
8637         resolution process, when we define types recursively, we must
8638         check first for types in our current scope before we perform
8639         lookups in the enclosing scopes.
8640
8641         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8642
8643         (Invocation.VerifyArgumentsCompat): Call
8644         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8645         I thought we were supposed to always call this, but there are a
8646         few places in the code where we dont do it.
8647
8648 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8649
8650         * driver.cs: Add support in -linkres and -resource to specify the
8651         name of the identifier.
8652
8653 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8654
8655         * ecore.cs (StandardConversionExists): Sync with the conversion
8656         code: allow anything-* to void* conversions.
8657
8658         (FindMostSpecificSource): Use an Expression argument
8659         instead of a Type, because we might be handed over a Literal which
8660         gets a few more implicit conversions that plain types do not.  So
8661         this information was being lost.
8662
8663         Also, we drop the temporary type-holder expression when not
8664         required.
8665
8666 2002-09-17  Martin Baulig  <martin@gnome.org>
8667
8668         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8669         this is an explicit interface implementation.
8670
8671 2002-09-17  Martin Baulig  <martin@gnome.org>
8672
8673         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8674         different `IndexerName' attributes.
8675
8676         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8677         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8678         virtual CommonResolve().
8679
8680 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8681
8682         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8683         and convert that to the UnderlyingType.
8684
8685         * statement.cs (Foreach.Resolve): Indexers are just like variables
8686         or PropertyAccesses.
8687
8688         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8689         inside quoted strings, we were not doing this before.
8690
8691 2002-09-16  Martin Baulig  <martin@gnome.org>
8692
8693         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8694         resolve it.  This is needed for the definite assignment check of the
8695         instance expression, fixes bug #29846.
8696         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8697
8698 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8699
8700         * parameter.cs: Fix compile error.  Cannot reference static member
8701         from an instance object.  Is this an mcs bug?
8702
8703 2002-09-14  Martin Baulig  <martin@gnome.org>
8704
8705         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8706         multiple times.  Fixes bug #30295, added test-166.cs.
8707
8708 2002-09-14  Martin Baulig  <martin@gnome.org>
8709
8710         * statement.cs (Block.Emit): Don't emit unreachable code.
8711         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8712         `break' statements.
8713         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8714
8715 2002-09-14  Martin Baulig  <martin@gnome.org>
8716
8717         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8718         is set.
8719
8720 2002-09-14  Martin Baulig  <martin@gnome.org>
8721
8722         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8723         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8724         be false on the ms runtime.
8725
8726 2002-09-13  Martin Baulig  <martin@gnome.org>
8727
8728         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8729         the CS0038 error message.
8730
8731 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8732
8733         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8734         constant inside, return it.
8735
8736 2002-09-12  Martin Baulig  <martin@gnome.org>
8737
8738         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8739         implicit conversion can be done between enum types.
8740
8741         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8742         check whether an implicit conversion to the current enum's UnderlyingType
8743         exists and report an error if not.
8744
8745         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8746         without debugging support.
8747
8748         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8749         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8750
8751 2002-09-12  Martin Baulig  <martin@gnome.org>
8752
8753         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8754
8755         * ecore.cs (IMemberExpr.DeclaringType): New property.
8756         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8757         nonstatic member of an outer type (CS0038).
8758
8759 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8760
8761         * driver.cs: Activate the using-error detector at warning level
8762         4 (at least for MS-compatible APIs).
8763
8764         * namespace.cs (VerifyUsing): Small buglett fix.
8765
8766         * pending.cs (PendingImplementation): pass the container pointer. 
8767
8768         * interface.cs (GetMethods): Allow for recursive definition.  Long
8769         term, I would like to move every type to support recursive
8770         definitions, not the current ordering mechanism that we have right
8771         now.
8772
8773         The situation is this: Attributes are handled before interfaces,
8774         so we can apply attributes to interfaces.  But some attributes
8775         implement interfaces, we will now handle the simple cases
8776         (recursive definitions will just get an error).  
8777
8778         * parameter.cs: Only invalidate types at the end if we fail to
8779         lookup all types.  
8780
8781 2002-09-09  Martin Baulig  <martin@gnome.org>
8782
8783         * ecore.cs (PropertyExpr.Emit): Also check for
8784         TypeManager.system_int_array_get_length so this'll also work when
8785         compiling corlib.  Fixes #30003.
8786
8787 2002-09-09  Martin Baulig  <martin@gnome.org>
8788
8789         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8790         and throw an exception if we can't get the type's size.  Fixed #30040,
8791         added test-165.cs.
8792
8793 2002-09-09  Martin Baulig  <martin@gnome.org>
8794
8795         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8796
8797         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8798         context.  Fixes bug #30027.
8799
8800         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8801         virtual functions.  Fixes bug #30043, added test-164.cs.
8802
8803 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8804
8805         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8806
8807 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8808
8809         * driver.cs: Use an object to get the windows codepage since it's not a
8810         static property.
8811
8812 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8813
8814         * statement.cs (For.Emit): for infinite loops (test == null)
8815         return whether there is a break inside, not always "true".
8816
8817         * namespace.cs (UsingEntry): New struct to hold the name of the
8818         using definition, the location where it is defined, and whether it
8819         has been used in a successful type lookup.
8820
8821         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8822         strings.
8823
8824         * decl.cs: ditto.
8825
8826 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8827
8828         * attribute.cs : Fix incorrect code which relied on catching
8829         a NullReferenceException to detect a null being passed in
8830         where an object was expected.
8831
8832 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8833
8834         * statement.cs (Try): flag the catch variable as assigned
8835
8836         * expression.cs (Cast): Simplified by using ResolveType instead of
8837         manually resolving.
8838
8839         * statement.cs (Catch): Fix bug by using ResolveType.
8840
8841 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8842
8843         * expression.cs (BetterConversion): Special case for when we have
8844         a NullLiteral as the argument and we have to choose between string
8845         and object types - we choose string the way csc does.
8846
8847         * attribute.cs (Attribute.Resolve): Catch the
8848         NullReferenceException and report error #182 since the Mono
8849         runtime no more has the bug and having this exception raised means
8850         we tried to select a constructor which takes an object and is
8851         passed a null.
8852
8853 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8854
8855         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8856         message (1502, 1503) when we can't locate a method after overload
8857         resolution. This is much more informative and closes the bug
8858         Miguel reported.
8859
8860         * interface.cs (PopulateMethod): Return if there are no argument
8861         types. Fixes a NullReferenceException bug.
8862
8863         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8864         expressions too. Previously we were checking only in one place for
8865         positional arguments leaving out named arguments.
8866
8867         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8868         type to the enum type is not allowed. Remove code corresponding to
8869         that.
8870
8871         (ConvertNumericExplicit): Allow explicit conversions from
8872         the underlying type to enum type. This precisely follows the spec
8873         and closes a bug filed by Gonzalo.
8874
8875 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8876
8877         * compiler.csproj:
8878         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8879
8880 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8881
8882         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8883         it was important that we stored the right value after the
8884         reduction in `converted'.
8885
8886 2002-09-04  Martin Baulig  <martin@gnome.org>
8887
8888         * location.cs (Location.SymbolDocument): Use full pathnames for the
8889         source files.
8890
8891 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8892
8893         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8894         of the expression resolve mechanism, because that will catch the
8895         SimpleName error failures.
8896
8897         (Conditional): If we can not resolve the
8898         expression, return, do not crash.
8899
8900 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8901
8902         * cs-tokenizer.cs:
8903         (location): display token name instead of its number.
8904
8905 2002-08-28  Martin Baulig  <martin@gnome.org>
8906
8907         * expression.cs (Binary.ResolveOperator): Don't silently return
8908         but return an error if an operator cannot be applied between two
8909         enum types.
8910
8911 2002-08-28  Martin Baulig  <martin@gnome.org>
8912
8913         * class.cs (Constructor.Define): Set the permission attributes
8914         correctly instead of making all constructors public.
8915
8916 2002-08-28  Martin Baulig  <martin@gnome.org>
8917
8918         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8919         for private members before reporting a CS0103; if we find anything,
8920         it's a CS0122.
8921
8922 2002-08-28  Martin Baulig  <martin@gnome.org>
8923
8924         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8925         to check whether `closure_start_type == closure_invocation_type',
8926         we also need to check whether `m.DeclaringType == closure_invocation_type'
8927         before bypassing the permission checks.  We might be accessing
8928         protected/private members from the base class.
8929         (TypeManager.RealMemberLookup): Only set private_ok if private
8930         members were requested via BindingFlags.NonPublic.
8931
8932         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8933
8934         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8935         MethodGroupExpr.IsExplicitImpl if appropriate.
8936         (Invocation.DoResolve): Don't report the CS0120 for explicit
8937         interface implementations.
8938
8939 2002-08-27  Martin Baulig  <martin@gnome.org>
8940
8941         * expression.cs (Invocation.DoResolve): If this is a static
8942         method and we don't have an InstanceExpression, we must report
8943         a CS0120.
8944
8945 2002-08-25  Martin Baulig  <martin@gnome.org>
8946
8947         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8948         `==' between a valuetype and an object.
8949
8950 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8951
8952         * ecore.cs (TypeExpr): Provide a ToString method.
8953
8954 2002-08-24  Martin Baulig  <martin@gnome.org>
8955
8956         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8957         now called proggie.dbg and it's a binary file.
8958
8959 2002-08-23  Martin Baulig  <martin@gnome.org>
8960
8961         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8962
8963 2002-08-23  Martin Baulig  <martin@gnome.org>
8964
8965         * struct.cs (MyStructInfo.ctor): Make this work with empty
8966         structs; it's not allowed to use foreach() on null.
8967
8968 2002-08-23  Martin Baulig  <martin@gnome.org>
8969
8970         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8971         writer the full pathname of the generated assembly.
8972
8973 2002-08-23  Martin Baulig  <martin@gnome.org>
8974
8975         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8976         A `finally' block never returns or breaks; improved handling of
8977         unreachable code.
8978
8979 2002-08-23  Martin Baulig  <martin@gnome.org>
8980
8981         * statement.cs (Throw.Resolve): Allow `throw null'.
8982
8983 2002-08-23  Martin Baulig  <martin@gnome.org>
8984
8985         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8986         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8987         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8988         MemberLookup would return a wrong event if this is an explicit
8989         interface implementation and the class has an event with the same
8990         name.
8991
8992 2002-08-23  Martin Baulig  <martin@gnome.org>
8993
8994         * statement.cs (Block.AddChildVariableNames): New public method.
8995         (Block.AddChildVariableName): Likewise.
8996         (Block.IsVariableNameUsedInChildBlock): Likewise.
8997         (Block.AddVariable): Check whether a variable name has already
8998         been used in a child block.
8999
9000         * cs-parser.jay (declare_local_variables): Mark all variable names
9001         from the current block as being used in a child block in the
9002         implicit block.
9003
9004 2002-08-23  Martin Baulig  <martin@gnome.org>
9005
9006         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9007         find the symbol writer.
9008
9009         * driver.cs: csc also allows the arguments to /define being
9010         separated by commas, not only by semicolons.
9011
9012 2002-08-23  Martin Baulig  <martin@gnome.org>
9013
9014         * interface.cs (Interface.GetMembers): Added static check for events.
9015
9016 2002-08-15  Martin Baulig  <martin@gnome.org>
9017
9018         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9019         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9020
9021         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9022         why the MethodData.EmitDestructor() change was necessary.
9023
9024 2002-08-20  Martin Baulig  <martin@gnome.org>
9025
9026         * class.cs (TypeContainer.FindMembers): Added static check for events.
9027
9028         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9029
9030         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9031         use Type.GetEvents(), not Type.FindMembers().
9032
9033 2002-08-20  Martin Baulig  <martin@gnome.org>
9034
9035         * decl.cs (MemberCache): Added a special method cache which will
9036         be used for method-only searched.  This ensures that a method
9037         search will return a MethodInfo with the correct ReflectedType for
9038         inherited methods.      
9039
9040 2002-08-20  Martin Baulig  <martin@gnome.org>
9041
9042         * decl.cs (DeclSpace.FindMembers): Made this public.
9043
9044 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9045
9046         * delegate.cs: fixed build on windows.
9047         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9048
9049 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9050
9051         * ecore.cs (StandardConversionExists): Return a false
9052         if we are trying to convert the void type to anything else
9053         since that is not allowed.
9054
9055         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9056         we flag error 70 in the event an event is trying to be accessed
9057         directly from outside the declaring type.
9058
9059 2002-08-20  Martin Baulig  <martin@gnome.org>
9060
9061         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9062         MemberCache from typemanager.cs to decl.cs.
9063
9064 2002-08-19  Martin Baulig  <martin@gnome.org>
9065
9066         * class.cs (TypeContainer): Implement IMemberContainer.
9067         (TypeContainer.DefineMembers): Create the MemberCache.
9068         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9069         return public members if BindingFlags.Public was given, check
9070         whether members are static.
9071
9072 2002-08-16  Martin Baulig  <martin@gnome.org>
9073
9074         * decl.cs (DeclSpace.Define): Splitted this in Define and
9075         DefineMembers.  DefineMembers is called first and initializes the
9076         MemberCache.
9077
9078         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9079         DefineMembers() on all our DeclSpaces.
9080
9081         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9082         but call DefineMembers() on all nested interfaces.  We call their
9083         Define() in our new Define() function.
9084
9085         * interface.cs (Interface): Implement IMemberContainer.
9086         (Interface.Define): Moved all code except the attribute stuf to
9087         DefineMembers().
9088         (Interface.DefineMembers): Initialize the member cache.
9089
9090         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9091         need this anymore since we can use MemberCache.FindMembers directly.
9092
9093 2002-08-19  Martin Baulig  <martin@gnome.org>
9094
9095         * typemanager.cs (MemberCache): When creating the cache for an
9096         interface type, add all inherited members.
9097         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9098         to `out bool used_cache' and documented it.
9099         (TypeManager.MemberLookup): If we already used the cache in the first
9100         iteration, we don't need to do the interfaces check.
9101
9102 2002-08-19  Martin Baulig  <martin@gnome.org>
9103
9104         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9105         here from IMemberFinder and don't implement this interface anymore.
9106         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9107
9108         * typemanager.cs (IMemberFinder): This interface is now only used by
9109         classes which actually support the member cache.
9110         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9111         since we only put DeclSpaces into this Hashtable.
9112         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9113         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9114
9115 2002-08-16  Martin Baulig  <martin@gnome.org>
9116
9117         * typemanager.cs (ICachingMemberFinder): Removed.
9118         (IMemberFinder.MemberCache): New property.
9119         (TypeManager.FindMembers): Merged this with RealFindMembers().
9120         This function will never be called from TypeManager.MemberLookup()
9121         so we can't use the cache here, just the IMemberFinder.
9122         (TypeManager.MemberLookup_FindMembers): Check whether the
9123         IMemberFinder has a MemberCache and call the cache's FindMembers
9124         function.
9125         (MemberCache): Rewrote larger parts of this yet another time and
9126         cleaned it up a bit.
9127
9128 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9129
9130         * driver.cs (LoadArgs): Support quoting.
9131
9132         (Usage): Show the CSC-like command line arguments.
9133
9134         Improved a few error messages.
9135
9136 2002-08-15  Martin Baulig  <martin@gnome.org>
9137
9138         * typemanager.cs (IMemberContainer.Type): New property.
9139         (IMemberContainer.IsInterface): New property.
9140
9141         The following changes are conditional to BROKEN_RUNTIME, which is
9142         defined at the top of the file.
9143
9144         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9145         class'es members, but add all members from TypeHandle.ObjectType
9146         if we're an interface.
9147         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9148         is the current type.
9149         (MemberCache.CacheEntry.Container): Removed this field.
9150         (TypeHandle.GetMembers): Include inherited members.
9151
9152 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9153
9154         * typemanager.cs: fixed compilation and added a comment on a field that
9155         is never used.
9156
9157 2002-08-15  Martin Baulig  <martin@gnome.org>
9158
9159         * class.cs (ConstructorInitializer.Resolve): In the
9160         Expression.MemberLookup call, use the queried_type as
9161         invocation_type.
9162
9163         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9164         declared' attribute, it's always true.
9165         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9166         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9167         temporary wrapper for FindMembers which tells MemberLookup whether
9168         members from the base classes are included in the return value.
9169         This will go away soon.
9170         (TypeManager.MemberLookup): Use this temporary hack here; once the
9171         new MemberCache is completed, we don't need to do the DeclaredOnly
9172         looping here anymore since the MemberCache will take care of this.
9173         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9174         (MemberCache): When creating the MemberCache for a class, get
9175         members from the current class and all its base classes.
9176         (MemberCache.CacheEntry.Container): New field.  This is a
9177         temporary hack until the Mono runtime is fixed to distinguish
9178         between ReflectedType and DeclaringType.  It allows us to use MCS
9179         with both the MS runtime and the unfixed Mono runtime without
9180         problems and without accecting performance.
9181         (MemberCache.SearchMembers): The DeclaredOnly looping from
9182         TypeManager.MemberLookup is now done here.      
9183
9184 2002-08-14  Martin Baulig  <martin@gnome.org>
9185
9186         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9187         Type.GetFields on dynamic types but get the fields from the
9188         corresponding TypeContainer.
9189         (MyStructInfo.GetStructInfo): Added check for enum types.
9190
9191         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9192         (MemberList.SyncRoot): Implemented.
9193         (TypeManager.FilterWithClosure): No need to check permissions if
9194         closure_start_type == closure_invocation_type, don't crash if
9195         closure_invocation_type is null.
9196
9197 2002-08-13  Martin Baulig  <martin@gnome.org>
9198
9199         Rewrote TypeContainer.FindMembers to use a member cache.  This
9200         gives us a speed increase of about 35% for the self-hosting MCS
9201         build and of about 15-20% for the class libs (both on GNU/Linux).
9202
9203         * report.cs (Timer): New class to get enhanced profiling.  This
9204         whole class is "TIMER" conditional since it remarkably slows down
9205         compilation speed.
9206
9207         * class.cs (MemberList): New class.  This is an IList wrapper
9208         which we're now using instead of passing MemberInfo[]'s around to
9209         avoid copying this array unnecessarily.
9210         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9211         (ICachingMemberFinder, IMemberContainer): New interface.
9212         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9213         has already been checked, otherwise use it for the name comparision.
9214         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9215         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9216         if possible.  Returns a MemberList, not a MemberInfo [].
9217         (TypeHandle): New class, implements IMemberContainer.  We create
9218         one instance of this class per type, it contains a MemberCache
9219         which is used to do the member lookups.
9220         (MemberCache): New class.  Each instance of this class contains
9221         all members of a type and a name-based hash table.
9222         (MemberCache.FindMembers): This is our new member lookup
9223         function.  First, it looks up all members of the requested name in
9224         the hash table.  Then, it walks this list and sorts out all
9225         applicable members and returns them.
9226
9227 2002-08-13  Martin Baulig  <martin@gnome.org>
9228
9229         In addition to a nice code cleanup, this gives us a performance
9230         increase of about 1.4% on GNU/Linux - not much, but it's already
9231         half a second for the self-hosting MCS compilation.
9232
9233         * typemanager.cs (IMemberFinder): New interface.  It is used by
9234         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9235         Enum, Delegate or Interface.
9236         (TypeManager.finder_to_member_finder): New PtrHashtable.
9237         (TypeManager.finder_to_container): Removed.
9238         (TypeManager.finder_to_delegate): Removed.
9239         (TypeManager.finder_to_interface): Removed.
9240         (TypeManager.finder_to_enum): Removed.
9241
9242         * interface.cs (Interface): Implement IMemberFinder.
9243
9244         * delegate.cs (Delegate): Implement IMemberFinder.
9245
9246         * enum.cs (Enum): Implement IMemberFinder.
9247
9248         * class.cs (TypeContainer): Implement IMemberFinder.
9249
9250 2002-08-12  Martin Baulig  <martin@gnome.org>
9251
9252         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9253
9254 2002-08-12  Martin Baulig  <martin@gnome.org>
9255
9256         * ecore.cs (ITypeExpression): New interface for expressions which
9257         resolve to a type.
9258         (TypeExpression): Renamed to TypeLookupExpression.
9259         (Expression.DoResolve): If we're doing a types-only lookup, the
9260         expression must implement the ITypeExpression interface and we
9261         call DoResolveType() on it.
9262         (SimpleName): Implement the new ITypeExpression interface.
9263         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9264         hack, the situation that we're only looking up types can't happen
9265         anymore when this method is called.  Moved the type lookup code to
9266         DoResolveType() and call it.
9267         (SimpleName.DoResolveType): This ITypeExpression interface method
9268         is now doing the types-only lookup.
9269         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9270         (ResolveFlags): Added MaskExprClass.
9271
9272         * expression.cs (MemberAccess): Implement the ITypeExpression
9273         interface.
9274         (MemberAccess.DoResolve): Added support for a types-only lookup
9275         when we're called via ITypeExpression.DoResolveType().
9276         (ComposedCast): Implement the ITypeExpression interface.
9277
9278         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9279         Expression.Resolve() with ResolveFlags.Type instead.
9280
9281 2002-08-12  Martin Baulig  <martin@gnome.org>
9282
9283         * interface.cs (Interface.Define): Apply attributes.
9284
9285         * attribute.cs (Attribute.ApplyAttributes): Added support for
9286         interface attributes.
9287
9288 2002-08-11  Martin Baulig  <martin@gnome.org>
9289
9290         * statement.cs (Block.Emit): Only check the "this" variable if we
9291         do not always throw an exception.
9292
9293         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9294         whether the property has a set accessor.
9295
9296 2002-08-11  Martin Baulig  <martin@gnome.org>
9297
9298         Added control flow analysis support for structs.
9299
9300         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9301         with control flow analysis turned off.
9302         (IVariable): New interface.
9303         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9304         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9305         (FieldExpr.DoResolve): Resolve the instance expression with flow
9306         analysis turned off and do the definite assignment check after the
9307         resolving when we know what the expression will resolve to.
9308
9309         * expression.cs (LocalVariableReference, ParameterReference):
9310         Implement the new IVariable interface, only call the flow analysis
9311         code if ec.DoFlowAnalysis is true.
9312         (This): Added constructor which takes a Block argument.  Implement
9313         the new IVariable interface.
9314         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9315         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9316         This does the definite assignment checks for struct members.
9317
9318         * class.cs (Constructor.Emit): If this is a non-static `struct'
9319         constructor which doesn't have any initializer, call
9320         Block.AddThisVariable() to tell the flow analysis code that all
9321         struct elements must be initialized before control returns from
9322         the constructor.
9323
9324         * statement.cs (MyStructInfo): New public class.
9325         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9326         argument to this indexer.  If non-zero, check an individual struct
9327         member, not the whole struct.
9328         (FlowBranching.CheckOutParameters): Check struct members.
9329         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9330         overloaded versions of these methods which take an additional
9331         `int field_idx' argument to check struct members.
9332         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9333         overloaded versions of these methods which take an additional
9334         `string field_name' argument to check struct member.s
9335         (VariableInfo): Implement the IVariable interface.
9336         (VariableInfo.StructInfo): New public property.  Returns the
9337         MyStructInfo instance of the variable if it's a struct or null.
9338         (Block.AddThisVariable): New public method.  This is called from
9339         Constructor.Emit() for non-static `struct' constructor which do
9340         not have any initializer.  It creates a special variable for the
9341         "this" instance variable which will be checked by the flow
9342         analysis code to ensure that all of the struct's fields are
9343         initialized before control returns from the constructor.
9344         (UsageVector): Added support for struct members.  If a
9345         variable/parameter is a struct with N members, we reserve a slot
9346         in the usage vector for each member.  A struct is considered fully
9347         initialized if either the struct itself (slot 0) or all its
9348         members are initialized.
9349
9350 2002-08-08  Martin Baulig  <martin@gnome.org>
9351
9352         * driver.cs (Driver.MainDriver): Only report an error CS5001
9353         if there were no compilation errors.
9354
9355         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9356         `UnsafeContext' property to determine whether the parent is in
9357         unsafe context rather than checking the parent's ModFlags:
9358         classes nested in an unsafe class are unsafe as well.
9359
9360 2002-08-08  Martin Baulig  <martin@gnome.org>
9361
9362         * statement.cs (UsageVector.MergeChildren): Distinguish between
9363         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9364         we return.  Added test17() and test18() to test-154.cs.
9365
9366 2002-08-08  Martin Baulig  <martin@gnome.org>
9367
9368         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9369         Family access, make sure the invoking type isn't a subclass of the
9370         queried type (that'd be a CS1540).
9371
9372         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9373         this method which takes an additional `Type invocation_type'.
9374
9375         * expression.cs (BaseAccess.DoResolve): Use the base type as
9376         invocation and query type.
9377         (MemberAccess.DoResolve): If the lookup failed and we're about to
9378         report a CS0122, try a lookup with the ec.ContainerType - if this
9379         succeeds, we must report a CS1540.
9380
9381 2002-08-08  Martin Baulig  <martin@gnome.org>
9382
9383         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9384         (MethodGroupExpr): Implement the IMemberExpr interface.
9385
9386         * expression (MemberAccess.ResolveMemberAccess): No need to have
9387         any special code for MethodGroupExprs anymore, they're now
9388         IMemberExprs.   
9389
9390 2002-08-08  Martin Baulig  <martin@gnome.org>
9391
9392         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9393         Family, FamANDAssem and FamORAssem permissions.
9394         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9395
9396 2002-08-08  Martin Baulig  <martin@gnome.org>
9397
9398         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9399         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9400         or loop block.
9401
9402 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9403
9404         * driver.cs: implemented /resource option to embed managed resources.
9405
9406 2002-08-07  Martin Baulig  <martin@gnome.org>
9407
9408         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9409         (FieldBase.HasFieldInitializer): New public property.
9410         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9411         returns the field initializer and makes sure it is only resolved once.
9412         (TypeContainer.EmitFieldInitializers): Call
9413         FieldBase.GetInitializerExpression to get the initializer, this ensures
9414         that it isn't resolved multiple times.
9415
9416         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9417         the resolving process (SimpleName/MemberLookup) that we're currently
9418         emitting a field initializer (which must not access any instance members,
9419         this is an error CS0236).
9420
9421         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9422         argument, if the `IsFieldInitializer' flag is set, we must report and
9423         error CS0236 and not an error CS0120.   
9424
9425 2002-08-07  Martin Baulig  <martin@gnome.org>
9426
9427         * ecore.cs (IMemberExpr): New public interface.
9428         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9429         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9430         if the expression is an IMemberExpr.
9431
9432         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9433         to be null, implicitly default to `this' if we're non-static in
9434         this case.  Simplified the code a lot by using the new IMemberExpr
9435         interface.  Also fixed bug #28176 here.
9436
9437 2002-08-06  Martin Baulig  <martin@gnome.org>
9438
9439         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9440         ParameterReferences during semantic analysis so that we can do a
9441         type-only search when resolving Cast, TypeOf and SizeOf.
9442         (block): Pass the `current_local_parameters' to the Block's
9443         constructor.
9444
9445         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9446         argument to the constructor.
9447         (ConstructorInitializer.Resolve): Create a temporary implicit
9448         block with the parameters.
9449
9450         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9451         references here if we aren't doing a type-only search.
9452
9453         * statement.cs (Block): Added constructor which takes a
9454         `Parameters parameters' argument.
9455         (Block.Parameters): New public property.
9456
9457         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9458         to `Parameters' and made it public readonly.
9459
9460 2002-08-06  Martin Baulig  <martin@gnome.org>
9461
9462         * ecore.cs (Expression.Warning): Made this public as well.
9463
9464         * report.cs (Report.Debug): Print the contents of collections.
9465
9466 2002-08-06  Martin Baulig  <martin@gnome.org>
9467
9468         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9469         used to tell Resolve() which kinds of expressions it may return.
9470         (Expression.Resolve): Added overloaded version of this method which
9471         takes a `ResolveFlags flags' argument.  This can be used to tell
9472         Resolve() which kinds of expressions it may return.  Reports a
9473         CS0118 on error.
9474         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9475         ResolveFlags.SimpleName.
9476         (Expression.Error118): Added overloaded version of this method which
9477         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9478         which kinds of expressions are allowed.
9479
9480         * expression.cs (Argument.ResolveMethodGroup): New public method.
9481         Resolves an argument, but allows a MethodGroup to be returned.
9482         This is used when invoking a delegate.
9483
9484         * TODO: Updated a bit.
9485
9486 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9487
9488         Fixed compilation with csc.
9489
9490         * ecore.cs: Expression.Error made public. Is this correct? Should
9491         Warning be made public too?
9492
9493         * expression.cs: use ea.Location instead of ea.loc.
9494         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9495
9496 2002-08-06  Martin Baulig  <martin@gnome.org>
9497
9498         * ecore.cs (Expression.loc): Moved the location here instead of
9499         duplicating it in all derived classes.
9500         (Expression.Location): New public property.
9501         (Expression.Error, Expression.Warning): Made them non-static and
9502         removed the location argument.
9503         (Expression.Warning): Added overloaded version which takes an
9504         `int level' argument.
9505         (Expression.Error118): Make this non-static and removed the
9506         expression and location arguments.
9507         (TypeExpr): Added location argument to the constructor.
9508
9509         * expression.cs (StaticCallExpr): Added location argument to
9510         the constructor.
9511         (Indirection, PointerArithmetic): Likewise.
9512         (CheckedExpr, UnCheckedExpr): Likewise.
9513         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9514         (StringPtr): Likewise.
9515
9516
9517 2002-08-05  Martin Baulig  <martin@gnome.org>
9518
9519         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9520
9521         * assign.cs (Assign.DoResolve): Check whether the source
9522         expression is a value or variable.
9523
9524         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9525         while resolving the corresponding blocks.
9526
9527         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9528         an error, don't silently return null.
9529
9530         * statement.cs (Block.AddVariable): Do the error reporting here
9531         and distinguish between CS0128 and CS0136.
9532         (Block.DoResolve): Report all unused labels (warning CS0164).
9533         (LabeledStatement): Pass the location to the constructor.
9534         (LabeledStatement.HasBeenReferenced): New property.
9535         (LabeledStatement.Resolve): Set it to true here.
9536
9537         * statement.cs (Return.Emit): Return success even after reporting
9538         a type mismatch error (CS0126 or CS0127), this is what csc does and
9539         it avoids confusing the users with any consecutive errors.
9540
9541 2002-08-05  Martin Baulig  <martin@gnome.org>
9542
9543         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9544
9545         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9546
9547         * expression.cs (MemberAccess.DoResolve): Silently return if an
9548         error has already been reported.
9549
9550         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9551         error has already been reported.
9552
9553 2002-08-05  Martin Baulig  <martin@gnome.org>
9554
9555         * statement.cs (UsageVector): Only initialize the `parameters'
9556         vector if we actually have any "out" parameters.
9557
9558 2002-08-05  Martin Baulig  <martin@gnome.org>
9559
9560         * expression.cs (Binary.ResolveOperator): When combining delegates,
9561         they must have the same type.
9562
9563 2002-08-05  Martin Baulig  <martin@gnome.org>
9564
9565         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9566         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9567         work with the ms runtime and we also don't need it: if we're a
9568         PropertyBuilder and not in the `indexer_arguments' hash, then we
9569         are a property and not an indexer.
9570
9571         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9572         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9573         since the latter one doesn't work with the ms runtime.
9574
9575 2002-08-03  Martin Baulig  <martin@gnome.org>
9576
9577         Fixed bugs #27998 and #22735.
9578
9579         * class.cs (Method.IsOperator): New public field.
9580         (Method.CheckBase): Report CS0111 if there's already a method
9581         with the same parameters in the current class.  Report CS0508 when
9582         attempting to change the return type of an inherited method.
9583         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9584         and it's not marked abstract or extern.
9585         (PropertyBase): New abstract base class for Property and Indexer.
9586         (PropertyBase.CheckBase): Moved here from Property and made it work
9587         for indexers.
9588         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9589         the same so we can reuse it there.
9590         (Property, Indexer): Derive from PropertyBase.
9591         (MethodSignature.inheritable_property_signature_filter): New delegate
9592         to find properties and indexers.
9593
9594         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9595         argument and improved error reporting.
9596
9597         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9598         EmptyReadOnlyParameters and made it a property.
9599
9600         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9601         version of this method which takes a `PropertyInfo indexer'.
9602         (TypeManager.RegisterIndexer): New method.
9603
9604         * class.cs: Added myself as author of this file :-)
9605
9606 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9607
9608         * class.cs: fixed compilation on windoze.
9609
9610 2002-08-03  Martin Baulig  <martin@gnome.org>
9611
9612         * interface.cs (Interface.GetInterfaceBases): Check whether all
9613         base interfaces are at least as accessible than the current one.
9614
9615         * class.cs (TypeContainer.GetClassBases): Check whether base types
9616         are at least as accessible than the current type.
9617         (TypeContainer.AsAccessible): Implemented and made non-static.
9618         (MemberBase.CheckParameters): Report errors if the accessibility
9619         checks fail.
9620
9621         * delegate.cs (Delegate.Delegate): The default visibility is
9622         internal for top-level types and private for nested types.
9623         (Delegate.Define): Report errors if the accessibility checks fail.
9624
9625         * enum.cs (Enum.Enum): The default visibility is internal for
9626         top-level types and private for nested types.
9627         (Enum.DefineType): Compute the correct visibility.
9628
9629         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9630         function which takes a `bool is_toplevel' instead of a TypeContainer.
9631
9632         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9633         builtin type.
9634
9635 2002-08-02  Martin Baulig  <martin@gnome.org>
9636
9637         * expression.cs (LocalVariableReferenc): Added constructor which
9638         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9639         (LocalVariableReference.IsReadOnly): New property.
9640         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9641         variable is readonly, use our own readonly flag to do this; you can
9642         use the new constructor to get a writable reference to a read-only
9643         variable.
9644
9645         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9646         reference to the local variable.
9647
9648 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9649
9650         * rootcontext.cs (ResolveCore): Also include System.Exception
9651
9652         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9653         we reach an EmptyStatement.
9654
9655         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9656         is also fine.
9657
9658         * expression.cs (Binary.ResolveOperator): Check error result in
9659         two places.
9660
9661         use brtrue/brfalse directly and avoid compares to null.
9662
9663 2002-08-02  Martin Baulig  <martin@gnome.org>
9664
9665         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9666         Fixes bug #28407, added test-155.cs.
9667
9668 2002-08-01  Martin Baulig  <martin@gnome.org>
9669
9670         * class.cs (Event.EmitDefaultMethod): Make this work with static
9671         events.  Fixes #28311, added verify-3.cs.
9672
9673 2002-08-01  Martin Baulig  <martin@gnome.org>
9674
9675         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9676         `is_disposable' fields.
9677         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9678         `hm.is_disposable' if we're using the collection pattern.
9679         (Foreach.EmitCollectionForeach): Use the correct type for the
9680         enumerator's local variable, only emit the try/finally block if
9681         necessary (fixes #27713).
9682
9683 2002-08-01  Martin Baulig  <martin@gnome.org>
9684
9685         * ecore.cs (Expression.report118): Renamed to Error118 and made
9686         it public static.
9687
9688         * statement.cs (Throw.Resolve): Check whether the expression is of
9689         the correct type (CS0118) and whether the type derives from
9690         System.Exception (CS0155).
9691         (Catch.Resolve): New method.  Do the type lookup here and check
9692         whether it derives from System.Exception (CS0155).
9693         (Catch.CatchType, Catch.IsGeneral): New public properties.
9694
9695         * typemanager.cs (TypeManager.exception_type): Added.
9696
9697 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9698
9699         * driver.cs: Updated About function.
9700
9701 2002-07-31  Martin Baulig  <martin@gnome.org>
9702
9703         Implemented Control Flow Analysis.
9704
9705         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9706         (EmitContext.CurrentBranching): Added.
9707         (EmitContext.StartFlowBranching): Added.
9708         (EmitContext.EndFlowBranching): Added.
9709         (EmitContext.KillFlowBranching): Added.
9710         (EmitContext.IsVariableAssigned): Added.
9711         (EmitContext.SetVariableAssigned): Added.
9712         (EmitContext.IsParameterAssigned): Added.
9713         (EmitContext.SetParameterAssigned): Added.
9714         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9715         Added control flow analysis stuff here.
9716
9717         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9718         resolve the expression as lvalue.
9719         (LocalVariableReference.DoResolve): Check whether the variable has
9720         already been assigned.
9721         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9722         the parameter as assigned here.
9723         (ParameterReference.DoResolve): Check whether the parameter has already
9724         been assigned.
9725         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9726         expression as lvalue.
9727
9728         * statement.cs (FlowBranching): New class for the flow analysis code.
9729         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9730         (LabeledStatement.IsDefined): New public property.
9731         (LabeledStatement.AddUsageVector): New public method to tell flow
9732         analyis that the label may be reached via a forward jump.
9733         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9734         flow analysis.
9735         (VariableInfo.Number): New public field.  This is used by flow analysis
9736         to number all locals of a block.
9737         (Block.CountVariables): New public property.  This is the number of
9738         local variables in this block (including the locals from all parent
9739         blocks).
9740         (Block.EmitMeta): Number all the variables.
9741
9742         * statement.cs: Added flow analysis support to all classes.
9743
9744 2002-07-31  Martin Baulig  <martin@gnome.org>
9745
9746         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9747         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9748         then use this argument.
9749
9750         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9751
9752         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9753         use this to specify /define options.
9754
9755 2002-07-29  Martin Baulig  <martin@gnome.org>
9756
9757         * statement.cs (Fixed): Moved all code that does variable lookups
9758         and resolvings from Emit to Resolve.
9759
9760         * statement.cs (For): Moved all code that does variable lookups
9761         and resolvings from Emit to Resolve.
9762
9763         * statement.cs (Using): Moved all code that does variable lookups
9764         and resolvings from Emit to Resolve.
9765
9766 2002-07-29  Martin Baulig  <martin@gnome.org>
9767
9768         * attribute.cs (Attribute.Resolve): Explicitly catch a
9769         System.NullReferenceException when creating the
9770         CustromAttributeBuilder and report a different warning message.
9771
9772 2002-07-29  Martin Baulig  <martin@gnome.org>
9773
9774         * support.cs (ParameterData.ParameterName): Added method to
9775         get the name of a parameter.
9776
9777         * typemanager.cs (TypeManager.IsValueType): New public method.
9778
9779 2002-07-29  Martin Baulig  <martin@gnome.org>
9780
9781         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9782         is a flag which specifies that it's either ref or out.
9783         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9784         the out parameter to `out Parameter.Modifier mod', also set the
9785         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9786
9787         * support.cs (InternalParameters.ParameterModifier): Distinguish
9788         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9789         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9790
9791         * expression.cs (Argument.GetParameterModifier): Distinguish
9792         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9793         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9794
9795 2002-07-29  Martin Baulig  <martin@gnome.org>
9796
9797         * expression.cs (ParameterReference.ParameterReference): Added
9798         `Location loc' argument to the constructor.
9799
9800         * cs-parser.jay: Pass location to ParameterReference.
9801
9802 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9803
9804         * statement.cs (Try): Initialize the location.
9805
9806         * cs-parser.jay: pass location to Try.
9807
9808         * expression.cs (Unary.Reduce): Change the prototype to return
9809         whether a constant fold could be performed or not.  The result is
9810         returned in an out parameters.  In the case of Indirection and
9811         AddressOf, we want to perform the full tests.
9812
9813 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9814
9815         * statement.cs (Statement.Emit): Flag dead code.
9816
9817 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9818
9819         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9820
9821 2002-07-27  Martin Baulig  <martin@gnome.org>
9822
9823         * class.cs (MethodData.Define): Put back call to
9824         TypeManager.AddMethod(), accidentally commented this out.
9825
9826         * report.cs (Debug): New public method to print debugging information,
9827         this is `[Conditional ("DEBUG")]'.
9828
9829 2002-07-26  Martin Baulig  <martin@gnome.org>
9830
9831         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9832         (switch_statement): Push the current_block to the switch_stack and
9833         pop it again when we're done with the switch.
9834         (switch_section): The new block is a child of the current_block.
9835         Fixes bug #24007, added test-152.cs.
9836
9837 2002-07-27  Martin Baulig  <martin@gnome.org>
9838
9839         * expression.cs (Invocation.EmitArguments): When calling a varargs
9840         function with only its fixed arguments, we need to pass an empty
9841         array.
9842
9843 2002-07-27  Martin Baulig  <martin@gnome.org>
9844
9845         Mono 0.13 has been released.
9846
9847 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9848
9849         * driver.cs: Rename --resource to --linkres, because that is what
9850         we do currently, we dont support --resource yet.
9851
9852         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9853
9854 2002-07-25  Martin Baulig  <martin@gnome.org>
9855
9856         * class.cs (MethodData): New public class.  This is a `method builder'
9857         class for a method or one accessor of a Property/Indexer/Event.
9858         (MethodData.GetMethodFlags): Moved here from MemberBase.
9859         (MethodData.ApplyAttributes): Likewise.
9860         (MethodData.ApplyObsoleteAttribute): Likewise.
9861         (MethodData.ApplyConditionalAttribute): Likewise.
9862         (MethodData.ApplyDllImportAttribute): Likewise.
9863         (MethodData.CheckAbstractAndExternal): Likewise.
9864         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9865         (MethodData.Emit): Formerly known as Method.Emit().
9866         (MemberBase): Moved everything which was specific to a single
9867         accessor/method to MethodData.
9868         (Method): Create a new MethodData and call Define() and Emit() on it.
9869         (Property, Indexer, Event): Create a new MethodData objects for each
9870         accessor and call Define() and Emit() on them.
9871
9872 2002-07-25  Martin Baulig  <martin@gnome.org>
9873
9874         Made MethodCore derive from MemberBase to reuse the code from there.
9875         MemberBase now also checks for attributes.
9876
9877         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9878         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9879         as virtual.
9880         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9881         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9882         (MemberBase.ApplyAttributes): New virtual method; applies the
9883         attributes to a method or accessor.
9884         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9885         (MemberBase.ApplyConditionalAttribute): Likewise.
9886         (MemberBase.ApplyDllImportAttribute): Likewise.
9887         (MemberBase.CheckAbstractAndExternal): Likewise.
9888         (MethodCore.ParameterTypes): This is now a property instead of a
9889         method, it's initialized from DoDefineParameters().
9890         (MethodCore.ParameterInfo): Removed the set accessor.
9891         (MethodCore.DoDefineParameters): New protected virtual method to
9892         initialize ParameterTypes and ParameterInfo.
9893         (Method.GetReturnType): We can now simply return the MemberType.
9894         (Method.GetMethodFlags): Override the MemberBase version and add
9895         the conditional flags.
9896         (Method.CheckBase): Moved some code from Define() here, call
9897         DoDefineParameters() here.
9898         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9899         here to avoid some larger code duplication.
9900         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9901         ensure that abstract and external accessors don't declare a body.
9902
9903         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9904         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9905         lookup in the attribute's parent classes, so we need to abort as soon
9906         as we found the first match.
9907         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9908         the attribute has no arguments.
9909
9910         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9911         of a Method.
9912
9913 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9914
9915         * cs-parser.jay: reverted previous patch.
9916
9917 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9918
9919         * cs-parser.jay: fixed bug #22119.
9920
9921 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9922
9923         * attribute.cs: fixed compilation. The error was:
9924         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9925         be assigned to before control leaves the current method."
9926         [FIXME:  Filed as bug #28186: MCS must report this error.]
9927
9928 2002-07-25  Martin Baulig  <martin@gnome.org>
9929
9930         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9931         method to pull the condition name ouf of a Conditional attribute.
9932         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9933         the obsolete message and error flag out of an Obsolete attribute.
9934
9935         * class.cs (Method.GetMethodFlags): New public method to get the
9936         TypeManager.MethodFlags for this method.
9937         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9938         private methods.
9939         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9940         if we're overriding a virtual function, set the new private variable
9941         `parent_method'; call the new TypeManager.AddMethod().
9942
9943         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9944         the MethodBuilder and the Method in a PtrHashtable.
9945         (TypeManager.builder_to_method): Added for this purpose.
9946         (TypeManager.MethodFlags): Added IsObsoleteError.
9947         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9948         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9949         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9950         the message from the attribute.
9951
9952 2002-07-24  Martin Baulig  <martin@gnome.org>
9953
9954         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9955         preprocessor directives, ensure that the argument to #define/#undef is
9956         exactly one identifier and that it's actually an identifier.
9957
9958         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9959         did not work ....
9960
9961 2002-07-24  Martin Baulig  <martin@gnome.org>
9962
9963         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9964         initialize it to TypeManager.object_type in the constructor.
9965         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9966         of the `hm.get_current' method if we're using the collection pattern.
9967         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9968         for the explicit conversion to make it work when we're using the collection
9969         pattern and the `Current' property has a different return type than `object'.
9970         Fixes #27713.
9971
9972 2002-07-24  Martin Baulig  <martin@gnome.org>
9973
9974         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9975         does not match, but don't report any errors.  This method is called in
9976         order for all methods in a MethodGroupExpr until a matching method is
9977         found, so we don't want to bail out if the first method doesn't match.
9978         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9979         matches, report the 123.  Fixes #28070.
9980
9981 2002-07-24  Martin Baulig  <martin@gnome.org>
9982
9983         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9984         TypeManager.TypeToCoreType() to the top of the method so the
9985         following equality checks will work.  Fixes #28107.
9986
9987 2002-07-24  Martin Baulig  <martin@gnome.org>
9988
9989         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9990         operand is of type uint, and the other operand is of type sbyte,
9991         short or int, the operands are converted to type long." -
9992         Actually do what this comment already told us.  Fixes bug #28106,
9993         added test-150.cs.
9994
9995 2002-07-24  Martin Baulig  <martin@gnome.org>
9996
9997         * class.cs (MethodBase): New abstract class.  This is now a base
9998         class for Property, Indexer and Event to avoid some code duplication
9999         in their Define() and DefineMethods() methods.
10000         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10001         generic methods for Define() and DefineMethods().
10002         (FieldBase): Derive from MemberBase, not MemberCore.
10003         (Property): Derive from MemberBase, not MemberCore.
10004         (Property.DefineMethod): Moved all the code from this method to the
10005         new MethodBase.DefineAccessor(), just call it with appropriate
10006         argumetnts.
10007         (Property.Define): Call the new Property.DoDefine(), this does some
10008         sanity checks and we don't need to duplicate the code everywhere.
10009         (Event): Derive from MemberBase, not MemberCore.
10010         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10011         accessors, this will also make them work with interface events.
10012         (Indexer): Derive from MemberBase, not MemberCore.
10013         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10014         (Indexer.Define): Use the new MethodBase functions.
10015
10016         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10017         argument to the constructor.
10018         (Interface.FindMembers): Added support for interface events.
10019         (Interface.PopluateEvent): Implemented.
10020
10021         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10022
10023 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10024
10025         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10026         but this is required to check for a method name being the same as
10027         the containing class.  
10028
10029         Handle this now.
10030
10031 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10032
10033         * interface.cs: initialize variable.
10034
10035 2002-07-23  Martin Baulig  <martin@gnome.org>
10036
10037         Implemented the IndexerName attribute in interfaces.
10038
10039         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10040         name if this is an explicit interface implementation.
10041         (Indexer.InterfaceIndexerName): New public variable.  If we're
10042         implementing an interface indexer, this is the IndexerName in that
10043         interface.  Otherwise, it's the IndexerName.
10044         (Indexer.DefineMethod): If we're implementing interface indexer,
10045         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10046         and Pending.ImplementIndexer methods.
10047         (Indexer.Define): Also define the PropertyBuilder if we're
10048         implementing an interface indexer and this is neither an explicit
10049         interface implementation nor do the IndexerName match the one in
10050         the interface.
10051
10052         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10053         If a method is defined here, then we always need to create a proxy
10054         for it.  This is used when implementing interface indexers.
10055         (Pending.IsInterfaceIndexer): New public method.
10056         (Pending.ImplementIndexer): New public method.
10057         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10058         This is used when implementing interface indexers to define a proxy
10059         if necessary.
10060         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10061         define a proxy if necessary.
10062
10063         * interface.cs (Interface.IndexerName): New public variable.
10064         (Interface.PopulateIndexer): Set the IndexerName.
10065         (Interface.DefineIndexers): New private method.  Populate all the
10066         indexers and make sure their IndexerNames match.
10067
10068         * typemanager.cs (IndexerPropertyName): Added support for interface
10069         indexers.
10070
10071 2002-07-22  Martin Baulig  <martin@gnome.org>
10072
10073         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10074         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10075         ret if HasReturnLabel.
10076         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10077         variables.
10078
10079         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10080         and set the ec.LoopBeginTryCatchLevel.
10081         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10082         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10083         the current ec.TryCatchLevel, the branch goes out of an exception
10084         block.  In this case, we need to use Leave and not Br.
10085
10086 2002-07-22  Martin Baulig  <martin@gnome.org>
10087
10088         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10089         block unless the block does not always return or it is contained in
10090         another try { ... } catch { ... } block.  Fixes bug #26506.
10091         Added verify-1.cs to the test suite.
10092
10093 2002-07-22  Martin Baulig  <martin@gnome.org>
10094
10095         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10096         then we do not always return.  Fixes bug #24985.
10097
10098 2002-07-22  Martin Baulig  <martin@gnome.org>
10099
10100         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10101         lookup on a per-class level; ie. walk up the class hierarchy until we
10102         found at least one applicable method, then choose the best among them.
10103         Fixes bug #24463 and test-29.cs.
10104
10105 2002-07-22  Martin Baulig  <martin@gnome.org>
10106
10107         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10108         return types of the methods.  The return type is not part of the
10109         signature and we must not check it to make the `new' modifier work.
10110         Fixes bug #27999, also added test-147.cs.
10111         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10112
10113         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10114         on the method's return type.
10115
10116 2002-07-21  Martin Baulig  <martin@gnome.org>
10117
10118         * assign.cs: Make this work if the rightmost source is a constant and
10119         we need to do an implicit type conversion.  Also adding a few more tests
10120         to test-38.cs which should have caught this.
10121
10122         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10123         target in the makefile for this.  The makefile.gnu is primarily intended
10124         for end-users who don't want to debug the compiler.
10125
10126 2002-07-21  Martin Baulig  <martin@gnome.org>
10127
10128         * assign.cs: Improved the Assign class so it can now handle embedded
10129         assignments (X = Y = Z = something).  As a side-effect this'll now also
10130         consume less local variables.  test-38.cs now passes with MCS, added
10131         a few new test cases to that test.
10132
10133 2002-07-20  Martin Baulig  <martin@gnome.org>
10134
10135         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10136         instructions.  Fixes bug #27977, also added test-146.cs.
10137
10138 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10139
10140         * cs-tokenizer.cs: fixed getHex ().
10141
10142 2002-07-19  Martin Baulig  <martin@gnome.org>
10143
10144         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10145         not Type.GetType() to lookup the array type.  This is needed when
10146         we're constructing an array of a user-defined type.
10147         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10148         single-dimensional arrays, but also for single-dimensial arrays of
10149         type decimal.
10150
10151 2002-07-19  Martin Baulig  <martin@gnome.org>
10152
10153         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10154         this function is called, it's not allowed to share LocalBuilders
10155         among ILGenerators.
10156
10157 2002-07-19  Martin Baulig  <martin@gnome.org>
10158
10159         * expression.cs (Argument.Resolve): Report an error 118 when trying
10160         to pass a type as argument.
10161
10162 2002-07-18  Martin Baulig  <martin@gnome.org>
10163
10164         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10165         Conv_R_Un for the signed `long' type.
10166
10167 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10168
10169         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10170         `expr' for the temporary result, as that will fail if we do
10171         multiple resolves on the same expression.
10172
10173 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10174
10175         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10176         ec.TypeContainer for looking up aliases. 
10177
10178         * class.cs (TypeContainer): Remove LookupAlias from here.
10179
10180         * decl.cs (DeclSpace); Move here.
10181
10182 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10183
10184         * class.cs (FindMembers): Only call filter if the constructor
10185         bulider is not null.
10186
10187         Also handle delegates in `NestedTypes' now.  Now we will perform
10188         type lookups using the standard resolution process.  This also
10189         fixes a bug.
10190
10191         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10192         This uses Expressions (the limited kind that can be parsed by the
10193         tree) instead of strings.
10194
10195         * expression.cs (ComposedCast.ToString): Implement, used to flag
10196         errors since now we have to render expressions.
10197
10198         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10199         FormArrayType. 
10200
10201         * ecore.cs (SimpleName.ToString): ditto.
10202
10203         * cs-parser.jay: Instead of using strings to assemble types, use
10204         Expressions to assemble the type (using SimpleName, ComposedCast,
10205         MemberAccess).  This should fix the type lookups in declarations,
10206         because we were using a different code path for this.
10207
10208         * statement.cs (Block.Resolve): Continue processing statements
10209         even when there is an error.
10210
10211 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10212
10213         * class.cs (Event.Define): Also remove the `remove' method from
10214         the list of pending items.
10215
10216         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10217         generate more compact code. 
10218
10219 2002-07-17  Martin Baulig  <martin@gnome.org>
10220
10221         * const.cs (Const.LookupConstantValue): Add support for constant
10222         `unchecked' and `checked' expressions.
10223         Also adding test case test-140.cs for this.
10224
10225 2002-07-17  Martin Baulig  <martin@gnome.org>
10226
10227         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10228         check whether mi.ReturnType implements the IEnumerator interface; the
10229         `==' and the IsAssignableFrom() will fail in this situation.
10230
10231 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10232
10233         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10234         here too.
10235
10236 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10237
10238         * expression.cs: fixed bug #27811.
10239
10240 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10241
10242         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10243         Molaro: when we are a ref, the value already contains a pointer
10244         value, do not take the address of it.
10245
10246 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10247         * removed mb-parser.jay and mb-tokenizer.cs
10248
10249 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10250
10251         * expression.cs: check against the building corlib void type.
10252
10253 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10254
10255         * ecore.cs: fix for valuetype static readonly fields: when 
10256         initializing them, we need their address, not the address of a copy.
10257
10258 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10259
10260         * typemanager.cs: register also enum_type in corlib.
10261
10262 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10263
10264         * class.cs: allow calling this (but not base) initializers in structs.
10265
10266 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10267
10268         * ecore.cs: make sure we compare against the building base types
10269         in GetTypeSize ().
10270
10271 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10272
10273         * typemanager.cs: fix TypeToCoreType() to handle void and object
10274         (corlib gets no more typerefs after this change).
10275
10276 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10277
10278         * expression.cs (ArrayCreation.EmitArrayArguments): use
10279         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10280
10281         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10282         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10283         array indexes, the runtime actually forbids them.
10284
10285         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10286         for array arguments here.
10287
10288         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10289         instead of the default for ValueTypes.
10290
10291         (New.DoEmit): Use IsValueType instead of
10292         IsSubclassOf (value_type)
10293         (New.DoResolve): ditto.
10294         (Invocation.EmitCall): ditto.
10295
10296         * assign.cs (Assign): ditto.
10297
10298         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10299         Statements *are* currently doing part of their resolution during
10300         Emit.  
10301
10302         Expressions do always resolve during resolve, but statements are
10303         only required to propagate resolution to their children.
10304
10305 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10306
10307         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10308
10309         (LoadAssembly): Do not add the dll if it is already specified
10310
10311         (MainDriver): Add the System directory to the link path at the end,
10312         after all the other -L arguments. 
10313
10314         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10315         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10316         ldelem.u1) and using the opposite for sbytes.
10317
10318         This fixes Digger, and we can finally run it.
10319
10320         * driver.cs (UnixParseOption): Move the option parsing here.  
10321         (CSCParseOption): Implement CSC-like parsing of options.
10322
10323         We now support both modes of operation, the old Unix way, and the
10324         new CSC-like way.  This should help those who wanted to make cross
10325         platform makefiles.
10326
10327         The only thing broken is that /r:, /reference: and /lib: are not
10328         implemented, because I want to make those have the same semantics
10329         as the CSC compiler has, and kill once and for all the confussion
10330         around this.   Will be doing this tomorrow.
10331
10332         * statement.cs (Unsafe.Resolve): The state is checked during
10333         resolve, not emit, so we have to set the flags for IsUnsfe here.
10334
10335 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10336
10337         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10338         not catch the Error_ObjectRefRequired in SimpleName (as it is
10339         possible to have a class/instance variable name that later gets
10340         deambiguated), we have to check this here.      
10341
10342 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10343
10344         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10345         make static and put into Expression.
10346
10347         (Event.Define): Register the private field of the event with the 
10348         TypeManager so that GetFieldFromEvent can get at it.
10349
10350         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10351         keep track of the private field associated with an event which
10352         has no accessors.
10353
10354         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10355         private field.
10356
10357         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10358
10359 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10360
10361         * expression.cs (Binary.EmitBranchable): this routine emits the
10362         Binary expression in a branchable context.  This basically means:
10363         we need to branch somewhere, not just get the value on the stack.
10364
10365         This works together with Statement.EmitBoolExpression.
10366
10367         * statement.cs (Statement.EmitBoolExpression): Use
10368         EmitBranchable. 
10369
10370 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10371
10372         * statement.cs (For): Reduce the number of jumps in loops.
10373
10374         (For): Implement loop inversion for the For statement.
10375
10376         (Break): We can be breaking out of a Try/Catch controlled section
10377         (foreach might have an implicit try/catch clause), so we need to
10378         use Leave instead of Br.
10379
10380         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10381         now).  If the instace expression supports IMemoryLocation, we use
10382         the AddressOf method from the IMemoryLocation to extract the
10383         address instead of emitting the instance.
10384
10385         This showed up with `This', as we were emitting the instance
10386         always (Emit) instead of the Address of This.  Particularly
10387         interesting when This is a value type, as we dont want the Emit
10388         effect (which was to load the object).
10389
10390 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10391
10392         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10393
10394         * statement.cs (Checked): Set the CheckedState during the resolve
10395         process too, as the ConvCast operations track the checked state on
10396         the resolve process, and not emit.
10397
10398         * cs-parser.jay (namespace_member_declaration): Flag that we have
10399         found a declaration when we do.  This is used to flag error 1529
10400
10401         * driver.cs: Report ok when we display the help only.
10402
10403 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10404
10405         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10406
10407 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10408
10409         * cs-tokenizer.cs (define): We also have to track locally the
10410         defines.  AllDefines is just used for the Conditional Attribute,
10411         but we also need the local defines for the current source code. 
10412
10413 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10414
10415         * statement.cs (While, For, Do): These loops can exit through a
10416         Break statement, use this information to tell whether the
10417         statement is the last piece of code.
10418
10419         (Break): Flag that we break.
10420
10421         * codegen.cs (EmitContexts): New `Breaks' state variable.
10422
10423 2002-07-03  Martin Baulig  <martin@gnome.org>
10424
10425         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10426         modifiers in method declarations in structs.  Otherwise, you won't
10427         be able to override things like Object.Equals().
10428
10429 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10430
10431         * class.cs (Method, Property, Indexer): Do not allow the public
10432         modifier to be used in explicit interface implementations.
10433
10434         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10435         override modifiers in method declarations in structs
10436
10437 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10438
10439         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10440         integer or real overflow, report an error
10441
10442 2002-07-02  Martin Baulig  <martin@gnome.org>
10443
10444         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10445         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10446         to tell the runtime about our newly created System.Object and
10447         System.ValueType types.
10448
10449 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10450
10451         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10452         struct instead of Ldarg/Starg.
10453
10454 2002-07-02  Martin Baulig  <martin@gnome.org>
10455
10456         * expression.cs (Indirection.Indirection): Call
10457         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10458
10459 2002-07-02  Martin Baulig  <martin@gnome.org>
10460
10461         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10462         ValueType, call TypeManager.TypeToCoreType() on it.
10463         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10464         the OpCodes.Newarr argument.
10465
10466 2002-07-02  Martin Baulig  <martin@gnome.org>
10467
10468         * expression.cs (Invocation.EmitCall): When compiling corlib,
10469         replace all calls to the system's System.Array type to calls to
10470         the newly created one.
10471
10472         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10473         System.Array methods.
10474         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10475         from the system's System.Array type which must be replaced.
10476
10477 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10478
10479         * typemanager.cs: load unverifiable_code_ctor so we can build
10480         corlib using the correct type. Avoid using GetTypeCode() with
10481         TypeBuilders.
10482         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10483         TypeManager.object_type to allow building corlib.
10484
10485 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10486
10487         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10488
10489 2002-07-01  Martin Baulig  <martin@gnome.org>
10490
10491         * class.cs: Make the last change actually work, we need to check
10492         whether `ifaces != null' to avoid a crash.
10493
10494 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10495
10496         * class.cs: when we build structs without fields that implement
10497         interfaces, we need to add the interfaces separately, since there is
10498         no API to both set the size and add the interfaces at type creation
10499         time.
10500
10501 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10502
10503         * expression.cs: the dimension arguments to the array constructors
10504         need to be converted if they are a long.
10505
10506 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10507
10508         * class.cs: don't emit ldarg.0 if there is no parent constructor
10509         (fixes showstopper for corlib).
10510
10511 2002-06-29  Martin Baulig  <martin@gnome.org>
10512
10513         MCS now compiles corlib on GNU/Linux :-)
10514
10515         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10516         ie. check for MethodImplOptions.InternalCall.
10517
10518         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10519         and TypeManager.attribute_type are null, so we must explicitly check
10520         whether parent is not null to find out whether it's an attribute type.
10521         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10522         and SetBuilder, not only if the property is neither abstract nor external.
10523         This is necessary to set the MethodImplOptions on the accessor methods.
10524         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10525         SetBuilder, see Property.Emit().
10526
10527         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10528         populate "System.Object", "System.ValueType" and "System.Attribute" since
10529         they've already been populated from BootCorlib_PopulateCoreTypes().
10530
10531 2002-06-29  Martin Baulig  <martin@gnome.org>
10532
10533         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10534         is the NullLiteral, we also need to make sure that target_type is not
10535         an enum type.   
10536
10537 2002-06-29  Martin Baulig  <martin@gnome.org>
10538
10539         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10540         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10541         before calling BootstrapCorlib_ResolveDelegate ().
10542
10543 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10544
10545         * statement.cs: fixed build-breaker. All tests passed ok.
10546
10547 2002-06-27  Martin Baulig  <martin@gnome.org>
10548
10549         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10550         for System.Decimal when compiling corlib.
10551
10552 2002-06-27  Martin Baulig  <martin@gnome.org>
10553
10554         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10555         switch blocks which contain nothing but a default clause.
10556
10557 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10558
10559        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10560
10561 2002-06-27  Martin Baulig  <martin@gnome.org>
10562
10563         * ecore.cs (PropertyExpr.PropertyExpr): Call
10564         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10565
10566         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10567         is already a TypeBuilder.
10568
10569 2002-06-27  Martin Baulig  <martin@gnome.org>
10570
10571         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10572         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10573         the "from an array-type to System.Array" case.  This makes it work
10574         when compiling corlib.
10575
10576 2002-06-27  Martin Baulig  <martin@gnome.org>
10577
10578         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10579         non-static PropertyExpr, set its InstanceExpression.  This makes
10580         the `ICollection.Count' property work in System/Array.cs.
10581
10582 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10583
10584         * driver.cs: Made error handling more consistent.  Errors now
10585         tracked by Report class, so many methods which used to return int
10586         now return void.  Main() now prints success/failure and 
10587         errors/warnings message.
10588
10589         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10590         the magic number return values (123 and 124).  Now, if the
10591         expected error occurs, the compiler exits with success (exit value
10592         0).  If the compilation completes without seeing that particular
10593         error, the compiler exits with failure (exit value 1).  The
10594         makefile in mcs/errors has been changed to handle the new behaviour.
10595
10596         * report.cs: Made 'expected error' number a property and renamed
10597         it from 'Probe' to 'ExpectedError'.
10598
10599         * genericparser.cs: Removed error handling support, since it is
10600         now all done by Report class.
10601
10602         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10603         class, so parse() no longer returns an int.
10604
10605         * namespace.cs: Use Report.Error instead of GenericParser.error
10606
10607 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10608
10609         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10610         TypeContainer.AddOperator): At the front of the list put the
10611         explicit implementations, so they get resolved/defined first. 
10612
10613 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10614
10615         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10616         interface type is implemented by this TypeContainer.  Used during
10617         explicit interface implementation.
10618
10619         (Property.Define, Indexer.Define, Method.Define): Validate that
10620         the given interface in the explicit implementation is one of the
10621         base classes for the containing type.
10622
10623         Also if we are explicitly implementing an interface, but there is
10624         no match in the pending implementation table, report an error.
10625
10626         (Property.Define): Only define the property if we are
10627         not explicitly implementing a property from an interface.  Use the
10628         correct name also for those properties (the same CSC uses,
10629         although that is really not needed).
10630
10631         (Property.Emit): Do not emit attributes for explicitly implemented
10632         properties, as there is no TypeBuilder.
10633
10634         (Indexer.Emit): ditto.
10635
10636         Hiding then means that we do not really *implement* a pending
10637         implementation, which makes code fail.
10638
10639 2002-06-22  Martin Baulig  <martin@gnome.org>
10640
10641         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10642         the return value of Object.GetType().  [FIXME: we need to do this whenever
10643         we get a type back from the reflection library].
10644
10645 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10646
10647         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10648
10649 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10650
10651         * attribute.cs: Return null if we can not look up the type.
10652
10653         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10654         the interface types found.
10655
10656         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10657         interface types found.
10658
10659         * typemanager.cs (GetInterfaces): Make this routine returns alll
10660         the interfaces and work around the lame differences between
10661         System.Type and System.Reflection.Emit.TypeBuilder in the results
10662         result for GetInterfaces.
10663
10664         (ExpandInterfaces): Given an array of interface types, expand and
10665         eliminate repeated ocurrences of an interface.  This expands in
10666         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10667         be IA, IB, IC.
10668
10669 2002-06-21  Martin Baulig  <martin@gnome.org>
10670
10671         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10672         on System.Enum.
10673
10674 2002-06-21  Martin Baulig  <martin@gnome.org>
10675
10676         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10677         and called with one of the core types, return the corresponding typebuilder for
10678         that type.
10679
10680         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10681         element type.
10682
10683 2002-06-21  Martin Baulig  <martin@gnome.org>
10684
10685         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10686         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10687         (Expression.ConvertReferenceExplicit): Likewise.
10688
10689         * expression.cs (ElementAccess.DoResolve): Likewise.
10690         (ElementAccess.DoResolveLValue): Likewise.
10691
10692 2002-06-10  Martin Baulig  <martin@gnome.org>
10693
10694         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10695         add the "value" parameter to the parameter list.
10696
10697         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10698         to our caller.
10699
10700 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10701
10702         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10703         the argument to an int, uint, long or ulong, per the spec.  Also
10704         catch negative constants in array creation.
10705
10706 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10707
10708         * class.cs: do not allow the same interface to appear twice in
10709         the definition list.
10710
10711 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10712
10713         * ecore.cs: don't use ldlen with System.Array.
10714
10715 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10716
10717         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10718
10719 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10720
10721         * modifiers.cs: produce correct field attributes for protected
10722         internal. Easy fix so miguel can work on ther harder stuff:-)
10723
10724 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10725
10726         * pending.cs: New file.  Move the code from class.cs here.
10727         Support clearning the pending flag for all methods (when not doing
10728         explicit interface implementation).
10729
10730 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10731
10732         * rootcontext.cs: added a couple more types needed to bootstrap.
10733
10734 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10735
10736         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10737         constructor in the type, instead of any constructor in the type
10738         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10739         a bug in the Mono runtime when applying the params attribute). 
10740
10741 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10742         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10743
10744 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10745
10746         * expression.cs (Unary.ResolveOperator): Use TypeManager
10747         to resolve the type.
10748
10749 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10750
10751         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10752         attached.
10753
10754         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10755         with each member too.
10756
10757         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10758         field builders too - this takes care of the enum member case.
10759
10760 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10761
10762         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10763         address-of operator on both value types and pointers.
10764
10765 2002-06-10  Martin Baulig  <martin@gnome.org>
10766
10767         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10768         PropertyBuilder to the `property_builders' list.
10769
10770         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10771         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10772         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10773         find any indexers which are inherited from an interface.
10774
10775 2002-06-09  Martin Baulig  <martin@gnome.org>
10776
10777         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10778         the same type as the constant if necessary.  There's also a test-130.cs
10779         for this.
10780
10781         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10782
10783         * typemanager.cs (TypeManager.ChangeType): Previously known as
10784         Enum.ChangeEnumType().
10785
10786 2002-06-09  Martin Baulig  <martin@gnome.org>
10787
10788         * expression.cs (Cast.TryReduce): Added support for consts.
10789
10790 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10791
10792         * class.cs (Accessor): Hold attributes information so we can pass
10793         it along.
10794
10795         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10796         Modify to pass in attributes attached to the methods.
10797
10798         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10799
10800         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10801         to handle the Accessor kind :-)
10802
10803         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10804
10805 2002-06-08  Martin Baulig  <martin@gnome.org>
10806
10807         * expression.cs (Unary.TryReduceNegative): Added support for
10808         ULongConstants.
10809
10810 2002-06-08  Martin Baulig  <martin@gnome.org>
10811
10812         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10813         name can't be found in the `defined_names' - the caller will do a
10814         MemberLookup in this case and thus find methods in System.Enum
10815         such as Enum.IsDefined().
10816
10817 2002-06-08  Martin Baulig  <martin@gnome.org>
10818
10819         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10820         Convert.ChangeType() which works with TypeBuilder created types.
10821         (Enum.LookupEnumValue, Enum.Define): Use it here.
10822
10823         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10824         `TypeBuilder.BaseType != null' check.
10825         (TypeContainer.FindMembers): Only lookup parent members if we
10826         actually have a parent.
10827         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10828         (ConstructorInitializer.Resolve): Likewise.
10829
10830         * interface.cs (Interface.FindMembers): Added
10831         `TypeBuilder.BaseType != null' check.
10832
10833         * rootcontext.cs (RootContext.ResolveCore): Added
10834         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10835         classes_second_stage.
10836
10837         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10838         debug_type and trace_type when compiling with --nostdlib.       
10839
10840 2002-06-07  Martin Baulig  <martin@gnome.org>
10841
10842         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10843         (AddField): Set it to true when adding a non-static field.
10844         (DefineType): Use `have_nonstatic_fields' to find out whether we
10845         have non-static fields, not `Fields != null'.
10846
10847 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10848
10849         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10850         dereferencing a null on the static-field code path)
10851
10852 2002-05-30  Martin Baulig  <martin@gnome.org>
10853
10854         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10855         to take command line arguments.  Use reflection to call the new
10856         custom `Initialize' function on the symbol writer and pass it the
10857         command line arguments.
10858
10859         * driver.cs (--debug-args): New command line argument to pass command
10860         line arguments to the symbol writer.
10861
10862 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10863
10864         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10865         the target type for indexers and properties.  Thanks to Joe for
10866         catching this.
10867
10868 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10869
10870         * typemanager.cs (MethodFlags): returns the method flags
10871         (Obsolete/ShouldIgnore) that control warning emission and whether
10872         the invocation should be made, or ignored. 
10873
10874         * expression.cs (Invocation.Emit): Remove previous hack, we should
10875         not do this on matching a base type, we should do this based on an attribute
10876
10877         Only emit calls to System.Diagnostics.Debug and
10878         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10879         on the command line.
10880
10881         * rootcontext.cs: Global settings for tracing and debugging.
10882
10883         * cs-tokenizer.cs (define): New utility function to track
10884         defines.   Set the global settings for TRACE and DEBUG if found.
10885
10886 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10887
10888         * interface.cs (Populate*): Pass in the TypeContainer as well as
10889         the DeclSpace as parameters so that we can create EmitContexts and
10890         then use that to apply attributes etc.
10891
10892         (PopulateMethod, PopulateEvent, PopulateProperty)
10893         (PopulateIndexer): Apply attributes everywhere.
10894
10895         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10896         etc.
10897
10898         (ApplyAttributes): Update accordingly.
10899
10900         We now apply interface attributes for all members too.
10901
10902 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10903
10904         * class.cs (Indexer.Define); Correctly check if we are explicit
10905         implementation (instead of checking the Name for a ".", we
10906         directly look up if the InterfaceType was specified).
10907
10908         Delay the creation of the PropertyBuilder.
10909
10910         Only create the PropertyBuilder if we are not an explicit
10911         interface implementation.   This means that explicit interface
10912         implementation members do not participate in regular function
10913         lookups, and hence fixes another major ambiguity problem in
10914         overload resolution (that was the visible effect).
10915
10916         (DefineMethod): Return whether we are doing an interface
10917         implementation. 
10918
10919         * typemanager.cs: Temporary hack until we get attributes in
10920         interfaces (Ravi is working on that) and we get IndexerName
10921         support in interfaces.
10922
10923         * interface.cs: Register the indexers as properties.
10924
10925         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10926         warning, I have verified that this is a bug in the .NET runtime
10927         (JavaScript suffers of the same problem).
10928
10929         * typemanager.cs (MemberLookup): When looking up members for
10930         interfaces, the parent of an interface is the implicit
10931         System.Object (so we succeed in searches of Object methods in an
10932         interface method invocation.  Example:  IEnumerable x;  x.ToString
10933         ()) 
10934
10935 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10936
10937         * class.cs (Event): Events should also register if they do
10938         implement the methods that an interface requires.
10939
10940         * typemanager.cs (MemberLookup); use the new GetInterfaces
10941         method. 
10942
10943         (GetInterfaces): The code used to lookup interfaces for a type is
10944         used in more than one place, factor it here. 
10945
10946         * driver.cs: Track the errors at the bottom of the file, we kept
10947         on going.
10948
10949         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10950         instance if the method we are calling is static!
10951
10952 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10953
10954         * attribute.cs (ApplyAttributes): Make this function filter out
10955         the IndexerName attribute (as that attribute in reality is never
10956         applied) and return the string constant for the IndexerName
10957         attribute. 
10958
10959         * class.cs (TypeContainer.Emit): Validate that all the indexers
10960         have the same IndexerName attribute, and if so, set the
10961         DefaultName attribute on the class. 
10962
10963         * typemanager.cs: The return value might contain other stuff (not
10964         only methods).  For instance, consider a method with an "Item"
10965         property and an Item method.
10966
10967         * class.cs: If there is a problem with the parameter types,
10968         return. 
10969
10970 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10971
10972         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10973         looks at user defined conversion after making a call to 
10974         StandardConversionExists - we need this for overload resolution.
10975
10976         * expression.cs : Update accordingly the various method calls.
10977
10978         This fixes 2 bugs filed against implicit user defined conversions 
10979
10980 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10981
10982         * statement.cs: Track the result of the assignment.
10983
10984 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10985
10986         * expression.cs (MemberAccess): Improved error reporting for
10987         inaccessible members.
10988
10989 2002-05-22  Martin Baulig  <martin@gnome.org>
10990
10991         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10992         itself with debugging support.
10993
10994 2002-05-22  Martin Baulig  <martin@gnome.org>
10995
10996         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10997         Removed, this isn't needed anymore.
10998
10999 2002-05-20  Martin Baulig  <martin@gnome.org>
11000
11001         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11002         be underlying type for an enum.
11003
11004 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11005
11006         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11007         that splits out the loading of just the core types.
11008
11009         * rootcontext.cs (ResolveCore): Split the struct resolution in
11010         two, so we can load the enumeration underlying types before any
11011         enums are used.
11012
11013         * expression.cs (Is): Bandaid until we fix properly Switch (see
11014         bug #24985 for details).
11015
11016         * typemanager.cs (ImplementsInterface): The hashtable will contain
11017         a null if there are no interfaces implemented.
11018
11019 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11020
11021         * cs-parser.jay (indexer_declarator): It is fine to have array
11022         parameters
11023
11024 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11025
11026         * typemanager.cs: (RegisterBuilder): New function used to register
11027         TypeBuilders that implement interfaces.  Since
11028         TypeBuilder.GetInterfaces (as usual) does not work with lame
11029         Reflection.Emit. 
11030         (AddUserType): register interfaces.
11031
11032         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11033         dealing with TypeBuilder.  Also, arrays are showing up as
11034         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11035         methods can not be invoked on them!
11036
11037         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11038         (ImplicitReferenceConversionExists): Split out from
11039         StandardConversionExists. 
11040
11041         * expression.cs (As): We were only implementing one of the three
11042         cases for the as operator.  We now implement them all.
11043         (Is): Implement the various other cases for Is as well.
11044
11045         * typemanager.cs (CACHE): New define used to control if we want or
11046         not the FindMembers cache.  Seems to have a negative impact on
11047         performance currently
11048
11049         (MemberLookup): Nested types have full acess to
11050         enclosing type members
11051
11052         Remove code that coped with instance/static returns for events, we
11053         now catch this in RealFindMembers.
11054
11055         (RealFindMembers): only perform static lookup if the instance
11056         lookup did not return a type or an event.  
11057
11058 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11059
11060         * assign.cs (CompoundAssign): We pass more semantic information
11061         now to Compound Assignments than we did before: now we have all
11062         the information at hand, and now we resolve the target *before* we
11063         do the expression expansion, which allows the "CacheValue" method
11064         to have the effect we intended (before, a [x] += 1 would generate
11065         two differen ArrayAccess expressions from the ElementAccess,
11066         during the resolution process).
11067
11068         (CompoundAssign.DoResolve): Resolve target and original_source here.
11069
11070 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11071
11072         * expression.cs (ArrayAccess): dropped debugging information. 
11073
11074         * typemanager.cs: Small bug fix: I was always returning i_members,
11075         instead of one of i_members or s_members (depending on which had
11076         the content).
11077
11078         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11079         method is invoked before any code generation takes place, and it
11080         is a mechanism to inform that the expression will be invoked more
11081         than once, and that the method should use temporary values to
11082         avoid having side effects
11083
11084         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11085
11086         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11087         implementation.
11088
11089         * expression.cs (Indirection, ArrayAccess): Add support for
11090         CacheTemporaries in these two bad boys. 
11091
11092         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11093         ldobj or ldind_ref.  
11094         (StoreFromPtr): Handle stobj as well.
11095
11096         * expression.cs (UnaryMutator): Share more code.
11097
11098         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11099         down: I was not tracking the Filter function as well, which
11100         was affecting the results of the cache.
11101
11102 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11103
11104         * attribute.cs: Remove the hack to handle the CharSet property on
11105         StructLayouts. 
11106
11107 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11108
11109         * attribute.cs (DoResolve): More uglyness, we now only try to
11110         resolve the attribute partially, to extract the CharSet
11111         information (only if we are a StructLayout attribute).  Otherwise 
11112
11113         (GetExtraTypeInfo): Add some code to conditionally kill in the
11114         future this.   I am more and more convinced that the .NET
11115         framework has special code to handle the attribute setting on
11116         certain elements.
11117
11118         * expression.cs (IsParamsMethodApplicable): Revert my previous
11119         foreach change here, it was wrong.
11120
11121 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11122
11123         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11124         (pp_expr): do not abort on unknown input, just return.
11125         (eval): abort if there are pending chars.
11126
11127         * attribute.cs (Attribute.Resolve): Positional parameters are
11128         optional.  Deal with that case.
11129
11130         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11131         the Ansi/Unicode/Auto information for the type.
11132
11133         (TypeContainer.DefineType): instantiate the EmitContext here, as
11134         we will be using it during the type definition (to resolve
11135         attributes) and during the emit phase.
11136
11137         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11138         to pull type information out of the attributes
11139
11140         (Attribute.Resolve): track the constructor builder, and allow for
11141         multiple invocations (structs and classes will use this).
11142
11143         * ecore.cs (MemberLookupFinal): new version with all the
11144         parameters customizable.
11145
11146         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11147         constructors.  Return if the result value is null (as the error
11148         would have been flagged already by MemberLookupFinal)
11149
11150         Do not allow instances of abstract classes or interfaces to be
11151         created.
11152
11153         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11154         We have to compare the assembly property here when dealing with
11155         FamANDAssem and Assembly access modifiers, because we might be
11156         creating an assembly from *modules* (that means that we are not
11157         getting TypeBuilders for types defined in other modules that are
11158         part of this assembly).
11159
11160         (Method.Emit): If the method is marked abstract and has a body,
11161         emit an error. 
11162
11163         (TypeContainer.DefineMembers): If both the defined member and the
11164         parent name match are methods, then do not emit any warnings: let
11165         the Method.Define routine take care of flagging warnings.  But if
11166         there is a mismatch (method overrides something else, or method is
11167         overriwritten by something, then emit warning).
11168
11169         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11170         set to null, this means `do not check for the return type on the
11171         signature'. 
11172
11173         (Method.Define): set the return type for the method signature to
11174         null, so that we get methods with the same name and parameters and
11175         different return types.  This is used to flag warning 114 (you are
11176         hiding a method, and you probably want to use the new/override
11177         keywords instead).
11178
11179         * typemanager.cs (MemberLookup): Implemented proper access
11180         control, closing a long standing set of bug reports.  The problem
11181         was that the Framework only has two bits: Public and NonPublic,
11182         and NonPublic includes private and protected methods, but we need
11183         to enforce the FamANDAssem, FamOrAssem and Family. 
11184
11185 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11186
11187         * statement.cs (GotoCase): Return true: Ammounts to giving up
11188         knowledge on whether we return or not, and letting the other case
11189         be responsible for it.
11190
11191 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11192
11193         * driver.cs: Do not load directories for each file processed, only
11194         do it if there is a pattern.
11195
11196         * ecore.cs: Report readonly assigns here as well, as we might have
11197         been resolved only by MemberAccess.
11198
11199         (SimpleName.SimpleNameResolve): Also be useful for LValue
11200         resolution.   We need this to propagate assign to local readonly variables
11201
11202         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11203         do not want to reuse potential criteria memory.
11204
11205         * class.cs (MyEventBuilder): Set reflected_type;
11206
11207         * ecore.cs (Constantify): Added support for constifying bools.
11208
11209         (RootContext.LookupType): Added a cache for values looked up in
11210         the declaration space.
11211
11212         * typemanager.cs (FindMembers): Now is a front-end to
11213         RealFindMembers, and provides a two-level hashtable-based cache to
11214         the request.  
11215
11216         15% performance improvement: from 22.5 to 19.2 seconds.
11217
11218         * expression.cs (IsParamsMethodApplicable): use foreach.
11219         (Invocation.DoResolve): ditto.
11220         (New.DoResolve): ditto.
11221         (ArrayCreation.DoResolve): ditto.
11222
11223         * ecore.cs (FindMostEncompassingType): use foreach.
11224
11225         * delegate.cs (NewDelegate.DoResolve): Use foreach
11226
11227         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11228         (RemoveMethods): use foreach.
11229
11230         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11231         nested foreach statements instead of for, and also break out of
11232         the inner loop once a match is found.
11233
11234         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11235
11236 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11237
11238         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11239         we actually unwrap the expression to allow for extra information
11240         to be extracted. 
11241
11242         * expression.cs: Use Shr_Un on unsigned operations. 
11243
11244 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11245
11246         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11247         applicable operators was not being considered correctly. This closes
11248         the bug Miguel reported.
11249
11250 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11251
11252         * attribute.cs: check that the type derives from System.Attribute
11253         and report the correct error in that case (moved the duplicate code to
11254         its own method, too).
11255
11256 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11257
11258         * attribute.cs: lookup attribute type name as the spec says: first the
11259         bare attribute name and then name + "Attribute" (nant compiles with
11260         mcs after this fix).
11261
11262 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11263
11264         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11265         Because of the way we parse things, we should try to see if a
11266         UIntConstant can fit in an integer.
11267
11268 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11269
11270         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11271         when we are in an explicit context.
11272
11273         (ConvertReferenceExplicit): When converting from Iface type S to Class
11274         T make sure the rules are implemented as an OR.
11275
11276         * parameter.cs (ParameterType): Make it a property for now although the
11277         purpose really isn't anything immediate.
11278
11279         * expression.cs (Is*Applicable): Do better checking on the parameter type
11280         of a ref/out parameter. The ones from the system assemblies are already 
11281         marked with the correct type so we don't need to do any correction.
11282
11283         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11284         the object type is standard too so include that.
11285
11286 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11287
11288         * ecore.cs (StandardConversionExists): Augment with missing code:
11289         deal with IntConstant, LongConstants and Enumerations.
11290
11291         * assign.cs: Report the error, instead of failing silently
11292
11293         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11294         typecontainer that they are declared, because the
11295         typecontainer/namespace will have the list of using clauses that
11296         need to be applied.
11297
11298         Assembly Attributes were escaping the normal registration
11299         mechanism. 
11300
11301         (EmitCode): Apply attributes within an EmitContext that represents
11302         the container they were declared on.
11303
11304         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11305
11306 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11307
11308         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11309         Revamp completely - make much cleaner as we now operate only
11310         on a set of Types.
11311
11312         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11313         to implement the logic detailed in the spec more correctly.
11314
11315         (UserDefinedConversion): Update accordingly.
11316
11317 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11318
11319         * statement.cs: Return flow analysis information up.
11320
11321         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11322         and the default.
11323
11324         (token): Do not consume an extra character before calling
11325         decimal_digits.
11326
11327 2002-05-06  Piers Haken <piersh@friskit.com>
11328
11329         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11330
11331 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11332
11333         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11334         EmitContext during the instance constructor initializer
11335         resolution, to stop access to instance variables.
11336
11337         This is mandated by the spec, last paragraph of the `constructor
11338         initializers' section. 
11339
11340 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11341
11342         * cs-parser.jay, class.cs (Accessor): new class used to represent
11343         an accessor (get or set).  In the past we used `null' to represent
11344         a missing accessor.  But this is ambiguous because there was no
11345         way to tell in abstract indexers/properties if one of them was
11346         specified.
11347
11348         Now there is a way of addressing that.
11349
11350         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11351         instead of FindMembers.
11352
11353         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11354         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11355
11356         * attribute.cs: Treat indexers and properties as the same in terms
11357         of applying attributes
11358
11359         * ecore.cs (FindMostEncompassedType): Use statically initialized
11360         EmptyExpressions()s like we do elsewhere to avoid creating useless
11361         objects (and we take this out of the tight loop).
11362
11363         (GetConversionOperators): Move the code to extract the actual
11364         operators to a separate routine to clean things up.
11365
11366 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11367
11368         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11369         events are always registered FieldBuilders.
11370
11371         * class.cs (FieldBase): New class shared by Fields 
11372
11373         * delegate.cs: If we are a toplevel delegate, use our full name.
11374         If we are a nested delegate, then only use our tail name.
11375
11376 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11377
11378         * expression.cs (IsApplicable): Ensure that we add the "&" to
11379         ref/out types before comparing it with the type of the argument.
11380
11381         (IsParamsMethodApplicable): Ditto.
11382
11383         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11384         silly me ;-)
11385
11386         * delegate.cs : Handle the case when we have more than one applicable
11387         method. Flag an error only when we finish checking all.
11388
11389 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11390
11391         * expression.cs: Add support for boolean static initializers.
11392
11393 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11394
11395         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11396
11397         * parameter.cs (ComputeParameterTypes,
11398         ComputeAndDefineParameterTypes): Better error handling: now we
11399         clear the `types' cache if we fail during any of the type lookups.
11400         We also return the status code correctly to our caller
11401
11402         * delegate.cs: If we fail to define a delegate, abort the extra
11403         steps. 
11404
11405         * expression.cs (Binary.ResolveOperator): for
11406         operator==(object,object) and operator !=(object, object) we also
11407         have to verify that there is an implicit conversion from one to
11408         the other.
11409
11410         (ArrayAccess.DoResolve): Array Access can operate on
11411         non-variables. 
11412
11413 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11414
11415         * assign.cs (CompoundAssign): A new class used as a "flag" that
11416         the assignment actually is happening as part of a compound
11417         assignment operator.
11418
11419         During compound assignment, a few new rules exist to enable things
11420         like:
11421
11422         byte b |= 1 + 2
11423
11424         From the spec:
11425
11426         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11427         to the type of x) if y is implicitly convertible to the type of x,
11428         and the operator is a builtin operator and the return type of the
11429         operator is explicitly convertible to the type of x. 
11430
11431         * rootcontext.cs: Reset warning level to 2.  4 catches various
11432         "interesting" features in mcs, we must clean this up at some
11433         point, but currently am trying to kill other bugs ;-)
11434
11435         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11436         in container classes as well.  
11437
11438         * expression.cs (Binary.ResolveOperator): Handle string case
11439         before anything else (as operator overloading does emit an error
11440         before doing anything else).
11441
11442         This code could go away when we move to a table driven model, but
11443         i could not come up with a good plan last night.
11444
11445 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11446
11447         * typemanager.cs (CSharpName): reimplementation using regex.
11448         * class.cs: added null check for fields in Emit
11449         * rootcontext.cs: set warninglevel to 4
11450
11451 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11452
11453         * typemanager.cs (CSharpName): reimplemented with Lupus
11454         suggestion.
11455
11456 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11457
11458         * statement.cs (If): correclty implement Resolve, because we were
11459         not catching sem errors in there.  The same process is needed
11460         everywhere else. 
11461         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11462
11463
11464         (Statement.Warning_DeadCodeFound): Factorize code.
11465         (While): Report dead code here too.
11466
11467         (Statement): Added Resolve virtual method to allow
11468         for resolution split from the emit code.
11469
11470 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11471
11472         * statement.cs (EmitBoolExpression): No longer try to resolve the
11473         expression here.    
11474         (MakeBoolean): New utility function that resolve, implicitly
11475         converts to boolean and tags the expression. 
11476
11477
11478         (If, Do): Implement dead code elimination.
11479         (While): Implement loop inversion
11480
11481         (Do, While, For, If): Resolve the expression prior to calling our
11482         code generation.
11483
11484 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11485
11486         * class.cs:
11487           - added method Report28 (warning: program has more than one entry point)
11488           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11489           - modified method Method.Define, the part at the end of the method
11490
11491         * rootcontext.cs: added static public Location EntryPointLocation;
11492           
11493         * ../errors/cs0028.cs : Add test case for the above warning.              
11494
11495         * typemanager.cs:
11496           - modified method CSharpName to allow arrays of primitive type to
11497             be printed nicely (e.g. instead of System.Int32[][] it now prints
11498             int[][])
11499           - added method CSharpSignature: returns the signature of a method
11500             in string format to be used in reporting errors, warnings, etc.
11501
11502         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11503         with String.Empty.
11504
11505 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11506
11507         * delegate.cs (Define): Fix extremely silly bug where I was
11508         setting the type of the 'object' parameter of the BeginInvoke
11509         method to System.IAsyncResult instead of System.Object ;-)
11510
11511 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11512
11513         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11514         here. 
11515
11516         (Constructor.Emit): return if we fail to initialize the
11517         constructor.  Another door closed!  
11518
11519         * expression.cs (New.DoResolve): Improve error message (from -6 to
11520         1501).  Use DeclaredOnly lookup to find the exact constructor.
11521
11522         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11523         loop.  This is useful.
11524
11525         * cs-parser.jay: Adjust the default parameters so that destructors
11526         have the proper signature.
11527
11528 2002-04-26  Martin Baulig  <martin@gnome.org>
11529
11530         * driver.cs (LoadAssembly): If `assembly' contains any characters
11531         which are only valid in path names and not in assembly names
11532         (currently slash, backslash and point), use Assembly.LoadFrom ()
11533         instead of Assembly.Load () on the `assembly' (before iteration
11534         over the link_paths).
11535
11536 2002-04-26  Martin Baulig  <martin@gnome.org>
11537
11538         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11539
11540 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11541
11542         * class.cs (Property): use the new typemanager.MemberLookup
11543
11544         (TypeContainer.MemberLookup): Implement using the
11545         TypeManager.MemberLookup now. 
11546
11547         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11548         and return MemberInfos, so that these can be used without an
11549         EmitContext (what we had before).
11550
11551 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11552
11553         * expression.cs: Fix the case where the argument to params if the
11554         type of the params.  I omitted handling this before.   Fixed
11555
11556 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11557
11558         * driver.cs: Call BootCorlib_PopulateCoreType
11559
11560         * class.cs (Property.CheckBase): Check for properties only, not
11561         for all members. 
11562
11563         * interface.cs: Temporary hack: try/catch around the
11564         CustomAttributeBuilder, because I am getting an exception that I
11565         do not understand.
11566
11567         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11568         types whose definitions are required to be there (attributes are
11569         defined before standard types).
11570
11571         Compute definitions as we boot the various types, as they are used
11572         immediately (value_type class will need object_type, but if we do
11573         not initialize object_type, we will pass a null, which will let
11574         the runtime pick the System.Object from the existing corlib, which
11575         is not what we want).
11576
11577 2002-04-22  Patrik Torstensson <totte@labs2.com>
11578
11579         * cs-tokenizer.cs: fixed a number of trim() issues.
11580
11581 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11582
11583         * expression.cs (Argument.Type): Ensure that we return the correct
11584         type when we have out or ref parameters [in which case we 
11585         append a "&"].
11586
11587 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11588
11589         * class.cs (Property, Indexer): Allow extern modifier in there. 
11590
11591         * typemanager.cs (InitBaseTypes): Initializes object_type and
11592         value_type, since those will be used early on during the bootstrap
11593         process to compile corlib.
11594
11595         (InitCoreTypes): Move code from here to InitBaseTypes.
11596
11597 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11598
11599         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11600         single-dimension arrays as using the ldlen opcode.  
11601
11602         Daniel Lewis discovered this optimization.  
11603
11604         * typemanager.cs: Add signature for System.Array::get_Length
11605
11606 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11607
11608         * statement.cs: report the error when the foreach does not apply to an
11609         array nor a collection.
11610
11611 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11612
11613         * expression.cs: Add implicit conversions to the operator ~.
11614
11615         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11616
11617         * typemanager.cs: Locate the decimal constructor.
11618
11619 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11620
11621         * attribute.cs: use the new property of TypeOf.
11622         * expression.cs: added 'get' property around typearg.
11623
11624         These changes fix a build breaker reported by NickD. Is this the
11625         correct way to fix?  If not, please, revert my changes and make it
11626         work :-).
11627
11628 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11629
11630         * attribute.cs: Add support for typeof in attribute invocations.
11631         I am not sure that this is right though.
11632
11633 2002-04-14  Duncan Mak  <duncan@ximian.com>
11634
11635         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11636         Binary.Operator.Division case.
11637
11638 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11639
11640         * class.cs (DefineType): Ensure that we do a proper check on
11641         attribute types and also register it with the TypeManager.
11642
11643         (TypeContainer.Targets): The default for attribute types is
11644         AttributeTargets.All.
11645
11646         * attribute.cs (ApplyAttributes): Registering the attribute type
11647         is done elsewhere, not when we discover we have a Usage attribute.
11648
11649 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11650
11651         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11652         and get rid of is_delegate parameter.
11653
11654         * everywhere : update.
11655
11656 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11657
11658         * cs-parser.jay (compilation_unit): Revamp completely to use
11659         some new ideas that I got from Rhys' grammar to solve the problems
11660         with assembly level attributes.
11661
11662         (outer_declaration): New grammar production.
11663
11664         (attribute_sections): Add.
11665
11666         (opt_attributes): Base on attribute_sections
11667
11668         (namespace_declaration): Allow opt_attributes to tackle the case
11669         when we have assembly level attributes - we are clever in this
11670         regard now ;-)
11671
11672         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11673         attributes in the non-global context.
11674
11675         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11676         instead of SetGlobalAttributes.
11677
11678         * class.cs, rootcontext.cs : Ensure we define and generate 
11679         attribute types before anything else.
11680
11681         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11682         and flag the new error -20 for the case when the attribute type
11683         does not have valid targets specified. csc does not catch this.
11684
11685         * ../errors/errors.txt : update for error # -20
11686
11687 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11688
11689         * support.cs (InternalParameters.ParameterModifier): Do some null
11690         checking and return sane values.
11691
11692         * class.cs (Method.Define): If we are a PInvoke method, ensure
11693         that we are static and extern. Report error # 601
11694
11695         * ../errors/cs0601.cs : Add test case for the above error.
11696
11697 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11698
11699         * rootcontext.cs (attribute_types): We need to keep type of
11700         all attribute types separately and emit code for them first.
11701
11702         (RegisterAttribute) : Implement.
11703
11704         * class.cs (DefineType): Check if the current Type is a custom
11705         attribute type and register it accordingly.
11706
11707         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11708         adding the first attribute twice and rename to
11709
11710         (SetGlobalAttributes): this.
11711
11712         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11713         lookups.
11714
11715         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11716         if we are processing global arguments. Hmm, I am unsure of this.
11717
11718 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11719
11720         * expression.cs: added static array of strings to avoid calling
11721         Enum.ToString () for Operator in Binary. Significant recover of
11722         performance.
11723
11724 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11725
11726         * class.cs (FindMembers): Allow the Builders of the various
11727         members to be null.  If they are skip them.  This only happens
11728         during the PInvoke declaration.
11729
11730 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11731
11732         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11733         failure, so we do not keep going afterwards.
11734
11735         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11736         wanted to pass `false' as the `is_delegate' argument.  If this is
11737         the case, why not use delegate_type == null to mean `is_delegate =
11738         false' and anything else as is_delegate = true.
11739
11740 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11741
11742         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11743         code for the section, not the beginning of the tests.
11744
11745 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11746
11747         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11748
11749         * expression.cs (Binary): same.  Warn about errors where we have
11750         Enum/Enum in operator + as well.
11751
11752 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11753
11754         * statement.cs:
11755                 - added support for switch(bool)
11756                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11757                 - add TableSwitchEmit() to handle table-based switch statements
11758
11759 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11760
11761         * expression.cs (Invocation.OverloadResolve): Factor out code which
11762         does parameter compatibility checking with arguments so that we can 
11763         re-use the code even from Delegate.VerifyApplicability
11764
11765         (VerifyArgumentsCompat): Move above code here.
11766
11767         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11768         and instead make a call to the above method.
11769
11770 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11771
11772         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11773         We use it to keep track of classes which are attribute types.
11774
11775 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11776
11777         * delegate.cs (Delegate.Define): Correctly define the types in the
11778         presence of fixed and array parameters.
11779
11780         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11781         doing FindMembers.
11782
11783         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11784         include NonPublic after the first iteration.
11785
11786         * class.cs (Indexer.CheckBase): Only check if both parents are
11787         non-null. 
11788
11789         * cs-parser.jay (accessor_body): If empty, set to null.
11790
11791         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11792         same code path here to resolve constants names that we did have in
11793         MemberAccess.DoResolve.  There is too much code duplicated here.
11794
11795 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11796
11797         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11798
11799         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11800         to MakeUnionSet.
11801
11802         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11803         tokens, numbers and strings.
11804
11805         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11806         parenthesis.
11807
11808         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11809         asyncronous parameters and the regular parameters.  
11810
11811         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11812         specify the target directory.
11813
11814         * expression.cs: (This.DoResolve): Simplify
11815         (As.Emit): Optimize, do not generate IsInst if the expression is
11816         always of the given type.
11817
11818         (Is.DoResolve): Bug fix, we were reporting both always/never for
11819         the is expression.
11820
11821         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11822         creating too many unnecessary arrays.
11823
11824 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11825
11826         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11827         fields instead of rolling our own initializer.   Takes care of all
11828         implicit conversions, and drops unnecessary static checks/argument.
11829
11830 2002-03-31  Dick Porter  <dick@ximian.com>
11831
11832         * driver.cs: use the GetDirectories() return values properly, and
11833         use "/" as path separator.
11834
11835 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11836
11837         * expression.cs (Unary): Optimize - - expr into expr.
11838         (Binary): Optimize a + (-b) into a -b.
11839
11840         * codegen.cs (CodeGen): Made all methods static.
11841
11842 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11843
11844         * rootcontext.cs: 
11845
11846         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11847         TypeBuilder property.
11848
11849         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11850         instead. 
11851
11852         * tree.cs: Removed the various RecordXXXX, and replaced with a
11853         single RecordDecl.  Removed all the accessor methods, and just
11854         left a single access point Type 
11855
11856         * enum.cs: Rename DefineEnum to DefineType.
11857
11858         * decl.cs: New abstract method `DefineType' used to unify the
11859         Defines for Enumerations, Interfaces, TypeContainers and
11860         Delegates.
11861
11862         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11863         LookupBaseClasses method that used to live in class.cs and
11864         interface.cs here, and renamed to FindType.
11865
11866         * delegate.cs: Implement DefineType.  Take advantage of the
11867         refactored pattern for locating the parent builder without taking
11868         the parent_builder argument (which we know does not work if we are
11869         nested, and triggering a toplevel definition).
11870
11871 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11872
11873         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11874         accessibility of a member has changed during override and report
11875         an error if so.
11876
11877         * class.cs (Method.Define, Property.Define): Only complain on
11878         overrides if the method is private, any other accessibility is
11879         fine (and since we just checked the permission is the same, we are
11880         good to go).
11881
11882         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11883         and elif are processed always.  The other pre-processing
11884         directives are only processed if we are "taking" the path
11885
11886 2002-03-29  Martin Baulig  <martin@gnome.org>
11887
11888         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11889         current location is not Null.
11890
11891         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11892         a separate method so we can profile it.
11893
11894         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11895         `span.Seconds' are just seconds, but no minutes or hours.
11896         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11897
11898 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11899
11900         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11901         Remove the gratuitous set of Final:
11902
11903                                 // If an interface implementation, then we can set Final.
11904                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11905                                     implementing.DeclaringType.IsInterface)
11906                                         flags |= MethodAttributes.Final;
11907
11908         I do not know what I was smoking when I used that.
11909
11910
11911         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11912         step into fixing the name resolution issues for delegates and
11913         unifying the toplevel name resolution.
11914
11915 2002-03-28  Martin Baulig  <martin@gnome.org>
11916
11917         * class.cs (Method.Emit): If we have a symbol writer, call its
11918         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11919         tell it about the current method.
11920
11921         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11922         writer that we're going to emit the first byte of IL code for a new
11923         statement (a new source line).
11924         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11925         EmitContext.Mark() before emitting any code.
11926
11927         * location.cs (SymbolDocument): Return null when we're Null.
11928
11929         * statement.cs (Statement): Moved the `Location loc' variable here.
11930         (Statement.EmitBoolExpression): If we have a symbol writer, call
11931         ec.Mark() before emitting any code to tell it that we're at the
11932         beginning of a new statement.
11933         (StatementExpression): Added `Location' argument to the constructor.
11934         (Block): Added public readonly variable `StartLocation' and public
11935         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11936         (Block): Added constructor which takes a start and end location.
11937         (Block.SetEndLocation): New method. This sets the end location.
11938         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11939         local variables we create.
11940         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11941         each statement and do also mark the begin and end of the block.
11942
11943         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11944         tell it the current lexer.Location, use Location.Null for the end of the
11945         block.
11946         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11947         current block, set its end location using SetEndLocation().
11948         (statement_expression): StatementExpression constructor now takes the
11949         lexer.Location as additional argument.
11950         (for_statement, declare_local_variables): Likewise.
11951         (declare_local_variables): When creating a new implicit block, use the
11952         new Block constructor and pass it the lexer.Location.
11953
11954 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11955
11956         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11957         members also on the parent interfaces recursively.
11958
11959 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11960
11961         * report.cs: Use new formats, since Gonzalo finished the missing
11962         bits. 
11963
11964         * expression.cs (Binary.ResolveOperator): added missing operator|
11965         operator& and operator^ for bool/bool.
11966
11967         * cs-parser.jay: CheckDef now takes a Location argument that is
11968         used to report errors more precisly (instead of reporting the end
11969         of a definition, we try to track something which is a lot closer
11970         to the source of the problem).
11971
11972         * cs-tokenizer.cs: Track global token use, so we can properly flag
11973         the use of #define/#undef after the first token has been seen.
11974
11975         Also, rename the reportXXXX to Error_DescriptiveName
11976
11977         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11978         TypeContainer, so that Enum and Interface can use this too.
11979
11980         * class.cs (TypeContainer.LookupInterfaceOrClass,
11981         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11982         `builder' argument.  Typically this was used to pass the parent
11983         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11984         the definition).  
11985
11986         The problem is that a nested class could trigger the definition of
11987         a toplevel class, and the builder would be obviously wrong in that
11988         case. 
11989
11990         So we drop this argument, and we compute dynamically the
11991         TypeBuilder/ModuleBuilder (the correct information was available
11992         to us anyways from DeclSpace.Parent)
11993
11994         * interface.cs (Interface.DefineInterface): Drop builder
11995         parameter cleanup like class.cs
11996
11997         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11998         like class.cs
11999
12000         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12001         values. 
12002
12003         (Try.Emit): Propagate the returns value from the statement.
12004
12005         (Return.Emit): Even if we are leavning 
12006
12007         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12008
12009         * modifiers.cs: Fix the computation of MethodAttributes flags.
12010
12011 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12012
12013         * driver.cs: allow compilation of files that start with '/'.
12014         Add a default case when checking the argument of --target.
12015
12016 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12017
12018         * interface.cs: Implement the same search algorithm for types in
12019         the interface code.
12020
12021         * delegate.cs: Do not allow multiple definition.
12022
12023         * Recovered ChangeLog that got accidentally amputated
12024
12025         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12026
12027         * rootcontext.cs: Load manually enum to allow core classes to
12028         contain enumerations.
12029
12030         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12031         Update to new static methods in TypeManager.
12032
12033         * typemanager.cs (GetMethod, GetConstructor): Use our
12034         implementation of FindMembers to find the members, since during
12035         corlib compilation, the types are TypeBuilders and GetMethod and
12036         GetConstructor do not work.
12037
12038         Make all methods in TypeManager static.
12039
12040         (InitCodeHelpers): Split the functionality from
12041         the InitCodeTypes function.
12042
12043         * driver.cs: Call InitCodeHelpers after we have populated the
12044         types. 
12045
12046         * cs-parser.jay (delegate_declaration): we did not used to compute
12047         the delegate name correctly for void delegates.
12048
12049 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12050
12051         * rootcontext.cs (RootContext): Init the interface_resolve_order
12052         and type_container_resolve_order always.
12053
12054         (ResolveCore, BootstrapCorlib_ResolveClass,
12055         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12056         compiler when compiling with --nostdlib
12057
12058         * class.cs (TypeContainer.DefineType): Check that our parent is
12059         not null.  This test is most important when we are bootstraping
12060         the core types.
12061
12062         * codegen.cs: Split out the symbol writing code.
12063
12064 2002-03-25  Martin Baulig  <martin@gnome.org>
12065
12066         * driver.cs (-g): Made -g an alias for --debug.
12067
12068 2002-03-24  Martin Baulig  <martin@gnome.org>
12069
12070         * codegen.cs (SymbolWriter): New public variable. Returns the
12071         current symbol writer.
12072         (CodeGen): Added `bool want_debugging_support' argument to the
12073          constructor. If true, tell the ModuleBuild that we want debugging
12074         support and ask it for the ISymbolWriter.
12075         (Save): If we have a symbol writer, call it's Close() method after
12076         saving the assembly.
12077
12078         * driver.c (--debug): New command line argument to create a
12079         debugger information file.
12080
12081         * location.cs (SymbolDocument): New public property. Returns an
12082         ISymbolDocumentWriter object for the current source file or null
12083         if we don't have a symbol writer.
12084
12085 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12086
12087         * driver.cs (LoadAssembly): Correctly return when all the paths
12088         have been tried and not before.
12089
12090         * statement.cs (Switch.Emit): return the actual coverage for this
12091         statement (returns/not-returns)
12092
12093         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12094         switch of the statement if we are the last switch section.  That
12095         kills two problems: try/catch problems (we used to emit an empty
12096         nop at the end) and switch statements where all branches would
12097         return. 
12098
12099 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12100
12101         * driver.cs: Add default assemblies (the equivalent to the
12102         Microsoft CSC.RSP file)
12103
12104         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12105         also update tokens_seen and set it to false.
12106
12107         * driver.cs: Implement --recurse for Mike.
12108
12109         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12110         correctly splitting out the paths.
12111
12112 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12113
12114         * interface.cs (Interface.PopulateProperty): Instead of using
12115         `parent' as the declaration space for the set parameters, use
12116         `this' 
12117
12118         * support.cs (InternalParameters): InternalParameters constructor
12119         takes a DeclSpace instead of a TypeContainer.
12120
12121         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12122         types are being initialized, load the address of it before calling
12123         the function.  
12124
12125         (New): Provide a mechanism to disable the generation of local
12126         value type temporaries when the caller will be providing us with
12127         an address to store it.
12128
12129         (ArrayCreation.EmitDynamicInitializers): Use it.
12130
12131 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12132
12133         * expression.cs (Invocation.EmitArguments): Only probe for array
12134         property if there is more than one argument.  Sorry about that.
12135
12136         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12137         empty param arrays.
12138
12139         * class.cs (Method.LabelParameters): Fix incorrect code path that
12140         prevented the `ParamArrayAttribute' from being applied to the
12141         params attribute.
12142
12143 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12144
12145         * support.cs (ReflectionParameters): Correctly compute whether the
12146         last argument is a params array.  Fixes the problem with
12147         string.Split ('a')
12148
12149         * typemanager.cs: Make the assemblies array always be non-null
12150         (empty, but non-null)
12151
12152         * tree.cs (RecordDecl): New function that abstracts the recording
12153         of names.  This reports error 101, and provides a pointer to the
12154         previous declaration.  Fixes a crash in the compiler.
12155
12156         * cs-parser.jay (constructor_declaration): Update to new grammar,
12157         and provide a constructor_body that can be empty.
12158
12159 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12160
12161         * driver.cs: Add support for --resources.
12162
12163         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12164         Make all types for the various array helper methods be integer.
12165
12166         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12167         CheckState to ConvCast.
12168
12169         (ConvCast): Now it takes a `checked' state argument, to avoid
12170         depending on the emit context for the conversion, and just using
12171         the resolve time setting.
12172
12173         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12174         instead of Invocation.EmitArguments.  We do not emit the original
12175         arguments, instead we emit those which have been converted to
12176         unsigned int expressions.
12177
12178         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12179
12180         * codegen.cs: ditto.
12181
12182         * expression.cs (LocalVariableReference): Drop the use of the
12183         Store function that depended on the variable index.
12184
12185         * statement.cs (VariableInfo): Drop the `Idx' property from this
12186         class, as this is not taking into account the indexes for
12187         temporaries tat we generate during the execution, getting the
12188         indexes wrong.
12189
12190         * class.cs: First emit class initializers, then call the parent
12191         constructor. 
12192
12193         * expression.cs (Binary): Fix opcode emision.
12194         (UnaryMutator.EmitCode): Support checked code generation
12195
12196         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12197         matches for events for both the Static and Instance scans,
12198         pointing to the same element.   Fix that.
12199
12200 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12201
12202         * rootcontext.cs (ResolveTree): Always set the
12203         interface_resolve_order, because nested interfaces will be calling
12204         into us.
12205
12206         * class.cs (GetInterfaceOrClass): Track the same resolution
12207         process used by TypeManager.LookupType.  This fixes the nested
12208         type lookups in class declarations (separate path from
12209         LookupType). 
12210
12211         (TypeContainer.DefineType): Also define nested interfaces.
12212         (TypeContainer.RegisterOrder): New public function used to
12213         register the order in which child interfaces need to be closed.
12214
12215         Nested interfaces need to be closed after their parents have been
12216         created. 
12217
12218         * interface.cs (InterfaceAttr): Put all the logic for computing
12219         the interface attribute here. 
12220
12221         (DefineInterface): Register our interface order with the
12222         RootContext or with the TypeContainer depending on the case.
12223
12224 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12225
12226         * cs-parser.jay: rework foreach statement to work with the new
12227         changes to the policy on SimpleNames.
12228
12229         * report.cs: support Stacktrace on warnings as well.
12230
12231         * makefile: drop --unsafe and /unsafe from the compile.
12232
12233 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12234
12235         * ecore.cs (StandardConversionExists): Modify to take an Expression
12236         as the first parameter. Ensure we do null -> reference type conversion
12237         checking.
12238
12239         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12240         temporary Expression objects.
12241
12242 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12243
12244         * interface.cs: workaround bug in method overloading resolution
12245         (there is already a bugzilla bug for it).
12246
12247 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12248
12249         We could also solve this problem by having a separate path for
12250         performing type lookups, instead of DoResolve, we could have a
12251         ResolveType entry point, and only participating pieces of the
12252         production (simplename, deref, array) would implement this. 
12253
12254         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12255         signal SimpleName to only resolve type names and not attempt to
12256         resolve anything else.
12257
12258         * expression.cs (Cast): Set the flag.
12259
12260         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12261
12262         * class.cs: Only report 108 if there is no `new' modifier.
12263
12264         * cs-parser.jay: rework foreach statement to work with the new
12265         changes to the policy on SimpleNames.
12266
12267         * report.cs: support Stacktrace on warnings as well.
12268
12269         * makefile: drop --unsafe and /unsafe from the compile.
12270
12271 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12272
12273         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12274         lookups here, instead of doing that at parse time.  This means
12275         that our grammar will not introduce `LocalVariableReferences' as
12276         expressions at this point.  That solves the problem of code like
12277         this:
12278
12279         class X {
12280            static void Main ()
12281            { int X = 1;
12282             { X x = null }}}
12283
12284         This is only half the fix.  The full fix requires parameters to
12285         also be handled in this way.
12286
12287         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12288         makes the use more obvious of the DeclSpace.  The
12289         ec.TypeContainer.TypeBuilder is now only used to pull the
12290         TypeBuilder for it.
12291
12292         My theory is that I can get rid of the TypeBuilder completely from
12293         the EmitContext, and have typecasts where it is used (from
12294         DeclSpace to where it matters).  
12295
12296         The only pending problem is that the code that implements Aliases
12297         is on TypeContainer, and probably should go in DeclSpace.
12298
12299         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12300         lookups here, instead of doing that at parse time.  This means
12301         that our grammar will not introduce `LocalVariableReferences' as
12302         expressions at this point.  That solves the problem of code like
12303         this:
12304
12305         class X {
12306            static void Main ()
12307            { int X = 1;
12308             { X x = null }}}
12309
12310         This is only half the fix.  The full fix requires parameters to
12311         also be handled in this way.
12312
12313         * class.cs (Property.DefineMethod): When implementing an interface
12314         method, set newslot, when implementing an abstract method, do not
12315         set the flag (before we tried never setting it, or always setting
12316         it, which is the difference).
12317         (Indexer.DefineMethod): same.
12318         (Method.DefineMethod): same.
12319
12320         * ecore.cs: Only set the status used flag if we get back a Field.
12321
12322         * attribute.cs: Temporary hack, so Paolo can keep working.
12323
12324 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12325
12326         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12327         the unmanaged type in the case we have a MarshalAs attribute.
12328
12329         (Resolve): Handle the case when we are parsing the special MarshalAs
12330         attribute [we need to store the unmanaged type to use later]
12331
12332         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12333         MarshalAs Attribute.
12334
12335         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12336         on parameters and accordingly set the marshalling info.
12337
12338 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12339
12340         * class.cs: Optimizing slightly by removing redundant code after
12341         we switched to the `NoTypes' return value.
12342         (Property.DefineMethod): use NoTypes here too.
12343
12344         This fixes the bug I introduced in my last batch of changes.
12345
12346 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12347
12348         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12349
12350         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12351         Enums since those are types too. 
12352
12353         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12354
12355         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12356         thanks to a call during the lookup process.
12357
12358 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12359
12360         * statement.cs (Foreach): Lots of work to accomodate a particular
12361         kind of foreach statement that I had not kept in mind.  It is
12362         possible to have foreachs on classes that provide a GetEnumerator
12363         method that return objects that implement the "pattern" for using
12364         a foreach, there is no need to support GetEnumerator
12365         specifically. 
12366
12367         This is needed to compile nant.
12368
12369         * decl.cs: Only report 114 if the member is not `Finalize' and if
12370         the warning level is at least 2.
12371
12372         * class.cs: Moved the compare function from Method to
12373         MethodSignature. 
12374
12375         (MethodSignature.InheritableMemberSignatureCompare): Add new
12376         filter function that is used to extract inheritable methods from a
12377         class. 
12378
12379         (Method.Define): Use the new `inheritable_method_signature_filter'
12380         delegate
12381
12382         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12383         command. 
12384
12385 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12386
12387         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12388
12389         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12390
12391         * expression.cs: Pass location information to
12392         ConvertImplicitStandard. 
12393
12394         * class.cs: Added debugging code to track return values from
12395         interfaces. 
12396
12397 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12398
12399         * expression.cs (Is.DoResolve): If either side of the `is' is an
12400         interface, do not flag the warning.
12401
12402         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12403         for interfaces
12404
12405         * report.cs: Allow for --fatal to be used with --probe.
12406
12407         * typemanager.cs (NoTypes): Move the definition for the empty Type
12408         array here. 
12409
12410         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12411         properties. 
12412         (TypeContainer.DefineProxy): New function used to proxy to parent
12413         implementations when implementing interfaces.
12414         (TypeContainer.ParentImplements): used to lookup if our parent
12415         implements a public function that is required by an interface.
12416         (TypeContainer.VerifyPendingMethods): Hook this up.
12417
12418         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12419         `modules' and `assemblies' arraylists into arrays.  We only grow
12420         these are the very early start up of the program, so this improves
12421         the speedof LookupType (nicely measured).
12422
12423         * expression.cs (MakeByteBlob): Replaced unsafe code with
12424         BitConverter, as suggested by Paolo.
12425
12426         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12427         folding of string concatenation, but if either side is a string,
12428         and the other is not, then return null, and let the runtime use
12429         the concatenation on the string plus the object (using
12430         `Object.ToString'). 
12431
12432 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12433
12434         Constant Folding has been implemented now.
12435
12436         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12437         the error instead on types that are not supported in one's
12438         complement. 
12439
12440         * constant.cs (Constant and all children): New set of functions to
12441         perform implict and explicit conversions.
12442
12443         * ecore.cs (EnumConstant): Implement the new functions to perform
12444         conversion by proxying to the child expression.
12445
12446         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12447         own separate setting that can not be turned off from the command
12448         line using --unchecked or --checked and is only controlled using
12449         the checked/unchecked statements and expressions.  This setting is
12450         used by the constant folder to flag errors.
12451
12452         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12453         ConstantCheckState as well.   
12454
12455         During Resolve, they also have to flag the state, because the
12456         constant folder runs completely in the Resolve phase.
12457
12458         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12459         well.
12460
12461 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12462
12463         * cfold.cs: New file, this file contains the constant folder.
12464
12465         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12466         argument to track whether we are using the resulting address to
12467         load or store a value and provide better error messages. 
12468
12469         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12470         new AddressOf arguments.
12471
12472         * statement.cs (Foreach.EmitCollectionForeach): Update
12473
12474         * expression.cs (Argument.Emit): Call AddressOf with proper
12475         arguments to track usage.
12476
12477         (New.DoEmit): Call AddressOf with new arguments.
12478
12479         (Unary.Emit): Adjust AddressOf call.
12480
12481 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12482
12483         * cs-parser.jay (member_access): Change the case for pre-defined types
12484         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12485         this suggestion.
12486
12487         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12488         a method body.
12489
12490         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12491         essentially like methods and apply attributes like MethodImplOptions to them too.
12492
12493         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12494         not being null.
12495
12496         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12497         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12498         is the DeclSpace.
12499
12500         * Update code everywhere accordingly.
12501
12502         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12503
12504         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12505
12506 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12507
12508         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12509         try performing lookups against those instead of jumping straight into using
12510         the 'using' clauses.
12511
12512         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12513
12514         (LookupType): Perform lookups in implicit parents too.
12515
12516         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12517         sequence as RootContext.LookupType. 
12518
12519         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12520         the various cases of namespace lookups into this method.
12521
12522 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12523
12524         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12525         in positional arguments)
12526
12527         * class.cs (Operator): Update the AllowedModifiers to contain
12528         extern. 
12529
12530         * cs-parser.jay: Update operator declaration to allow for the
12531         operator body to be empty.
12532
12533         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12534         values. 
12535
12536 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12537
12538         * class.cs (Method.Emit): Label parameters.
12539
12540         * driver.cs: Return 1 or 0 as the program exit code.
12541
12542 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12543
12544         * expression.cs: Special case the `null' object when trying to
12545         auto-compute the type, as anything can be explicitly converted to
12546         that. 
12547
12548         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12549         spotting this Paolo.
12550
12551         (Expression.ImplicitNumericConversion): Perform comparissions of
12552         the type using the underlying type in the case of an enumeration
12553         rather than using the enumeration type for the compare.
12554
12555         Cope with the underlying == type case, which is not possible to
12556         catch before. 
12557
12558         (Expression.ConvertNumericExplicit): Perform comparissions of
12559         the type using the underlying type in the case of an enumeration
12560         rather than using the enumeration type for the compare.
12561
12562         * driver.cs: If the user does not supply an extension, assume .exe
12563
12564         * cs-parser.jay (if_statement): Rewrote so that we can track the
12565         location for the if statement.
12566
12567         * expression.cs (Binary.ConstantFold): Only concat strings when
12568         the operation is "+", not everything ;-)
12569
12570         * statement.cs (Statement.EmitBoolExpression): Take a location
12571         argument. 
12572         (If, While, Do): Track location.
12573
12574         * expression.cs (Binary.ResolveOperator): In the object + string
12575         case, I was missing a call to ConvertImplicit
12576
12577 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12578
12579         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12580         Location arguments. Ensure we use RootContext.LookupType to do our work
12581         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12582
12583         * interface.cs (PopulateMethod): Handle the type of the parameter being
12584         null gracefully.
12585
12586         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12587         have a params method with no fixed arguments and a call is made with no
12588         arguments.
12589
12590 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12591
12592         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12593         the verbatim-string-literal
12594
12595         * support.cs (InternalParameters.ParameterModifier): handle null
12596         fixed parameters.
12597         (InternalParameters.ParameterType): ditto.
12598
12599         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12600         duplicating the name of the variable parameter.
12601         (GetParameterByName): Fix bug where we were not looking up array
12602         paramters if they were the only present (thanks Paolo!).
12603         (GetParameterInfo): We only have an empty set of types if both
12604         fixed and array are set to null.
12605         (GetParameterInfo-idx): Handle FixedParameter == null
12606
12607         * cs-parser.jay: Handle the case where there is no catch
12608         statements (missing null test).
12609
12610 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12611
12612         * driver.cs (MainDriver): Be conservative on our command line
12613         handling.
12614
12615         Catch DirectoryNotFoundException when calling GetFiles.
12616
12617         (SplitPathAndPattern): Used to split the input specification into
12618         a path and a pattern that we can feed to Directory.GetFiles.
12619
12620 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12621
12622         * statement.cs (Fixed): Implement the last case of the Fixed
12623         statement (string handling).
12624
12625         * expression.cs (StringPtr): New class used to return a char * to
12626         a string;  Used by the Fixed statement.
12627
12628         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12629
12630         * expression.cs (Binary.ResolveOperator): Remove redundant
12631         MemberLookup pn parent type.
12632         Optimize union call, we do not need a union if the types are the same.
12633         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12634         type.
12635
12636         Specialize the use of MemberLookup everywhere, instead of using
12637         the default settings. 
12638
12639         (StackAlloc): Implement stackalloc keyword.
12640
12641         * cs-parser.jay: Add rule to parse stackalloc.
12642
12643         * driver.cs: Handle /h, /help, /?
12644
12645         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12646         before we supported unsafe code.
12647
12648         * makefile: add --unsafe to the self compilation of mcs.
12649
12650 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12651
12652         * expression.cs (PointerArithmetic): New class that is used to
12653         perform pointer arithmetic.
12654         (Binary.Resolve): Handle pointer arithmetic
12655         Handle pointer comparission.
12656         (ArrayPtr): Utility expression class that is used to take the
12657         address of an array.
12658
12659         (ElementAccess): Implement array access for pointers
12660
12661         * statement.cs (Fixed): Implement fixed statement for arrays, we
12662         are missing one more case before we are done.
12663
12664         * expression.cs (Indirection): Implement EmitAssign and set the
12665         ExprClass to Variable.  This allows pointer dereferences to be
12666         treated as variables, and to have values assigned to them.
12667
12668         * ecore.cs (Expression.StoreFromPtr): New utility function to
12669         store values dereferencing.
12670
12671 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12672
12673         * expression.cs (Binary.ResolveOperator): Ensure that we are
12674         not trying to operate on a void type - this fixes the reported
12675         bug.
12676
12677         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12678         the parent implementation is sealed.
12679
12680         * ../errors/cs0239.cs : Add.
12681
12682         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12683
12684         * typemanager.cs (unverifiable_code_type): Corresponds to 
12685         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12686         which have unsafe code in them.
12687
12688         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12689         unsafe context.
12690
12691 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12692
12693         * cs-tokenizer.cs: Add support for @"litreal strings"
12694
12695         Make tokenizer accept pre-processor directives
12696         on any column (remove the old C-like limitation). 
12697
12698         * rootcontext.cs (EmitCode): Emit any global attributes.
12699         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12700
12701         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12702
12703         * cs-parser.jay: Add support for global attributes.  
12704
12705 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12706
12707         * expression.cs (Indirection): New helper class.  Unary will
12708         create Indirection classes to be able to implement the
12709         IMemoryLocation interface on it.
12710
12711 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12712
12713         * cs-parser.jay (fixed_statement): reference the right statement.
12714
12715         * statement.cs (Fixed.Emit): Finish implementing the fixed
12716         statement for the &x case.
12717
12718 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12719
12720         * class.cs (Property.Define, Method.Define): Remove newslot when
12721         `implementing'.  
12722
12723         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12724         wrong.  NewSlot should only be used if the `new' keyword is present.
12725
12726         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12727         locating our system dir.  Sorry about this.
12728
12729 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12730
12731         * driver.cs (GetSystemDir): Compute correctly the location of our
12732         system assemblies.  I was using the compiler directory instead of
12733         the library directory.
12734
12735 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12736
12737         * expression.cs (BetterFunction): Put back in what Miguel commented out
12738         since it is the correct fix. The problem is elsewhere ;-)
12739
12740         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12741         parameters of the parms method are themselves compatible or not !
12742
12743         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12744         to check that a class implements an interface before saying that an implicit
12745         conversion was allowed. Use ImplementsInterface to do the checking.
12746
12747 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12748
12749         * class.cs (Method.Define): Track whether we are an explicit
12750         implementation or not.  And only call DefineMethodOverride if we
12751         are an explicit implementation.
12752
12753         (Property.DefineMethod): Ditto.
12754
12755 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12756
12757         * expression.cs (BetterFunction): Catch hideous bug which was
12758          preventing us from detecting ambiguous calls due to implicit casts i.e
12759         cs0121.
12760
12761 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12762
12763         * support.cs (Pair): Remove un-needed method.  I figured why I was
12764         getting the error in cs-parser.jay, the variable in a foreach loop
12765         is readonly, and the compiler does not really treat this as a variable.
12766
12767         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12768         instead of EQUALS in grammar.  
12769
12770         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12771
12772         * expression.cs (Unary.DoResolve): Check whether the argument is
12773         managed or not.
12774
12775 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12776
12777         * support.cs: Api for Pair to set a value.  Despite the fact that
12778         the variables are public the MS C# compiler refuses to compile
12779         code that accesses the field if the variable is part of a foreach
12780         statement. 
12781
12782         * statement.cs (Fixed): Begin implementation of the fixed
12783         statement.
12784
12785         (Block.AddVariable): Return the VariableInfo on success and null
12786         on failure instead of true/false. 
12787
12788         * cs-parser.jay (foreach): Catch errors on variables already
12789         defined (we were ignoring this value before) and properly unwind
12790         the block hierarchy
12791
12792         (fixed_statement): grammar for the fixed statement.
12793
12794 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12795
12796         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12797         pointer types to be incretemented.
12798
12799         (SizeOf): Implement.
12800
12801         * cs-parser.jay (pointer_member_access): Implement
12802         expr->IDENTIFIER production.
12803
12804         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12805         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12806         on safe contexts.
12807
12808         (Unary): Implement indirection.
12809
12810         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12811         use in non-unsafe context).
12812
12813         (SimpleName.DoResolve): Check for pointers in field access on safe
12814         contexts. 
12815
12816         (Expression.LoadFromPtr): Factor the load-indirect code in this
12817         function.  This was duplicated in UnboxCast and ParameterReference
12818
12819 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12820
12821         * expression.cs (ComposedCast): report an error if a pointer cast
12822         is used in a safe region.
12823
12824         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12825         pointer type casts in unsafe context.
12826
12827         * codegen.cs (EmitContext): Set up IsUnsafe.
12828
12829         * cs-parser.jay (non_expression_type): Add productions for pointer
12830         casts. 
12831
12832         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12833         code.  We should not use force into static mode if the method is
12834         not virtual.  Fixes bug in MIS
12835
12836         * statement.cs (Do.Emit, While.Emit, For.Emit,
12837         Statement.EmitBoolExpression): Add support to Do and While to
12838         propagate infinite loop as `I do return' semantics.
12839
12840         Improve the For case to also test for boolean constants.
12841
12842         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12843         to the list of attributes we can add.
12844
12845         Remove `EmitContext' argument.
12846
12847         * class.cs (Method.Define): Apply parameter attributes.
12848         (Constructor.Define): Apply parameter attributes.
12849         (MethodCore.LabelParameters): Move here the core of labeling
12850         parameters. 
12851
12852         * support.cs (ReflectionParameters.ParameterModifier,
12853         InternalParameters.ParameterModifier): Use IsByRef on the type and
12854         only return the OUT bit for these parameters instead of in/out/ref
12855         flags.
12856
12857         This is because I miss-understood things.  The ParameterInfo.IsIn
12858         and IsOut represent whether the parameter has the [In] and [Out]
12859         attributes set.  
12860
12861 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12862
12863         * ecore.cs (FieldExpr.Emit): Release temporaries.
12864
12865         * assign.cs (LocalTemporary.Release): new function.
12866
12867         * codegen.cs (EmitContext.GetTemporaryStorage,
12868         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12869         temporary storage.  Now we can "put back" localbuilders when we
12870         are done with them
12871
12872 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12873
12874         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12875         need to make a copy of the variable to generate verifiable code.
12876
12877 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12878
12879         * driver.cs: Compute dynamically the system directory.
12880
12881         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12882         Slower, but more generally useful.  Used by the abstract
12883         registering implementation. 
12884
12885         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12886         the rules for the special rule on Type/instances.  First check if
12887         we have the same name, and if so, try that special static path
12888         rather than the instance path.
12889
12890 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12891
12892         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12893         for, while and if.
12894
12895         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12896         Enum, ValueType, Delegate or Array for non-corlib compiles.
12897
12898         * cs-tokenizer.cs: Catch long identifiers (645)
12899
12900         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12901         piece of code.
12902
12903         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12904         fix, we were returning too early, so we were not registering
12905         pending methods from abstract classes.
12906
12907         Do not register pending methods if the class is abstract.
12908
12909         * expression.cs (Conditional.DoResolve): Report circular implicit
12910         conversions when we neecd to compute it for conditional
12911         expressions. 
12912
12913         (Is.DoResolve): If the expression is always of the provided type,
12914         flag warning 183.  If the expression can not ever be of the
12915         provided type flag warning 184.
12916
12917         * class.cs: Catch 169 as well.
12918
12919         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12920         read. 
12921
12922 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12923
12924         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12925
12926 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12927
12928         * interface.cs: (PopulateMethod): Check for pointers being defined
12929         only if the unsafe context is active.
12930         (PopulateProperty): ditto.
12931         (PopulateIndexer): ditto.
12932
12933         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12934         specified.  If pointers are present, make sure that they are
12935         present in an unsafe context.
12936         (Constructor, Constructor.Define): ditto.
12937         (Field, Field.Define): ditto.
12938         (Property, Property.Define): ditto.
12939         (Event, Event.Define): ditto.
12940
12941         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12942         hashtable if there are classes or structs defined.
12943
12944         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12945         code, as the constant resolution moved.
12946
12947         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12948         the metadata, so we can flag error 133. 
12949
12950         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12951         pointer is being declared in an unsafe context.
12952
12953 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12954
12955         * modifiers.cs (Modifiers.Check): Require a Location argument.
12956         Report error 227 for Unsafe use.
12957
12958         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12959
12960         * statement.cs (For.Emit): If the test is null, then report that
12961         we do `return', as we wont reach anything afterwards.
12962
12963         (Switch.SwitchGoverningType): Track the expression that matched
12964         the conversion.
12965
12966         * driver.cs: Allow negative numbers as an error code to flag.
12967
12968         * cs-parser.jay: Handle 1551.
12969
12970         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12971
12972 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12973
12974         * cs-parser.jay: Report 1518 (type declaration can only contain
12975         class, struct, interface, enum or delegate)
12976
12977         (switch_label): Report 1523 (keywords `case' or `default' must
12978         preced code)
12979
12980         (opt_switch_sections): Report 1522 (empty switch)
12981
12982         * driver.cs: Report 1515 (response file specified multiple times)
12983         Report 1516 (Source file specified multiple times).
12984
12985         * expression.cs (Argument.Resolve): Signal 1510
12986
12987         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12988         access not allowed in static code)
12989
12990 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12991
12992         * typemanager.cs (IsPointerType): Utility method which we are going
12993         to need a lot.
12994
12995         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12996         the object type, so we take care of that.
12997
12998         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12999
13000         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13001         added to non-params parameters :-)
13002
13003         * typemanager.cs (CSharpName): Include 'void' type too. 
13004
13005         (void_ptr_type): Include in the set of core types.
13006
13007         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13008         duplicating code.
13009
13010         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13011         an unsafe context.
13012
13013         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13014         completely forgotten about it.
13015
13016 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13017
13018         * cs-parser.jay (pointer_type): Add. This begins our implementation
13019         of parsing rules for unsafe code.
13020
13021         (unsafe_statement): Implement.
13022
13023         (embedded_statement): Modify to include the above.
13024
13025         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13026
13027         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13028         if the current context is an unsafe one.
13029
13030         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13031         are handled differently, we need separate rules for them.
13032
13033         (local_variable_declaration): Update to use local_variable_pointer_type
13034         to allow variable declarations of unmanaged pointer types.
13035
13036         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13037         in unsafe contexts.
13038
13039         * ../errors/cs0214.cs : Add.
13040
13041 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13042
13043         * makefile: remove 'response' file when cleaning.
13044
13045 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13046
13047         * cs-parser.jay: Report 1524.
13048
13049 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13050
13051         * typemanager.cs (RegisterMethod): drop checking if we have
13052         registered this from here
13053
13054 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13055
13056         * class.cs (Method.EmitDestructor): Implement calling our base
13057         destructor. 
13058
13059         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13060         value of InFinally.
13061
13062         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13063         this routine and will wrap the call in a try/catch block.  Deal
13064         with the case.
13065
13066 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13067
13068         * ecore.cs (Expression.MemberLookup): instead of taking a
13069         parameter `same_type' that was used to tell whether we could
13070         access private members we compute our containing type from the
13071         EmitContext.
13072
13073         (FieldExpr): Added partial support for volatile fields.  This does
13074         not work for volatile fields exposed from assemblies, as I can not
13075         figure out how to extract the modreq from it.
13076
13077         Updated all the source files to use this.
13078
13079         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13080         because it is referenced by MemberLookup very often. 
13081
13082 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13083
13084         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13085         TypeBuilder.GetCustomAttributes to retrieve what we need.
13086
13087         Get rid of redundant default_member_attr_type as this is the same as
13088         default_member_type which already exists.
13089
13090         * interface.cs, attribute.cs : Update accordingly.
13091
13092 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13093
13094         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13095         work for TYpeBuilders though.  Ravi, can you please fix this?
13096
13097         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13098
13099         * expression.cs (Argument.Emit): Handle the case of ref objects
13100         being passed to ref functions;  
13101
13102         (ParameterReference.EmitLoad): Loads the content of the pointer
13103         without dereferencing.
13104
13105 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13106
13107         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13108
13109 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13110
13111         * class.cs (Indexer.DefineMethod): Incorporate the interface
13112         type in the name of the method if we are doing explicit interface
13113         implementation.
13114
13115         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13116
13117         (BetterConversion): Fix extremely trivial bug where we were referring to
13118         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13119         again !
13120
13121         * ../errors/bug16.cs : Add although we have fixed it.
13122
13123 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13124
13125         * expression.cs (BaseIndexer): Begin implementation.
13126
13127         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13128
13129         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13130         production directly to remove a shift/reduce, and implement
13131         explicit interface implementation.
13132
13133         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13134         after a floating point suffix.
13135
13136         * expression.cs (DoNumericPromotions): Improved the conversion for
13137         uint/uint.  If we have a constant, we avoid doing a typecast to a
13138         larger type.
13139
13140         * class.cs (Indexer): Implement explicit interface implementation
13141         for indexers.
13142
13143 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13144
13145         * class.cs: make the default instance constructor public and hidebysig.
13146
13147 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13148
13149         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13150         so we can call it from elsewhere.
13151
13152         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13153         we emit it internally if the class has a defined indexer; otherwise the user
13154         emits it by decorating the class definition with the DefaultMemberAttribute.
13155
13156         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13157         attribute is not used on a type which defines an indexer.
13158
13159         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13160         character when we skip whitespace.
13161
13162         * ../errors/cs0646.cs : Add.
13163
13164 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13165
13166         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13167         again. 
13168
13169         * makefile: Add practical target `mcs3.exe' which builds the third
13170         generation compiler. 
13171
13172         * expression.cs (New): Fix structures constructor calling.
13173
13174         * class.cs (Property, Method, Indexer): Emit Final flag on the
13175         method if we are an interface implementation and we are not
13176         abstract. 
13177
13178         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13179         whether this property is referencing a `base' method.
13180
13181         * expression.cs (Invocation.EmitCall): take an extra argument:
13182         is_base, this is used to determine whether the `call' or
13183         `callvirt' opcode should be used.
13184
13185
13186         * delegate.cs: update EmitCall.
13187
13188         * class.cs (Method.Define): Set NewSlot for the cases where we are
13189         not implementing an interface method.
13190
13191         (Property.Define): ditto.
13192
13193 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13194
13195         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13196         'r'.  Allows mcs to parse itself fully.
13197
13198 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13199
13200         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13201         of the number of initializers that require the InitializeArray method.
13202
13203         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13204         update the above field where necessary.
13205
13206         (MakeByteBlob): Update accordingly.
13207
13208         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13209         greater than 2.
13210
13211         (EmitDynamicInitializers): Update in accordance with the new optimization.
13212
13213         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13214         same OpCode applies.
13215
13216         * cs-parser.jay : Fix some glaring errors I introduced.
13217
13218 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13219
13220         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13221         so that we can check for name clashes there too.
13222
13223         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13224         for interface indexers.
13225
13226         * interfaces.cs (Define): Emit the default member attribute.
13227
13228         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13229         variable was being referred to while setting the value ;-)
13230
13231 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13232
13233         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13234         byte-by-byte information when we know the data is zero.
13235
13236         Make the block always a multiple of 4, because
13237         DefineInitializedData has a bug.
13238
13239         * assign.cs: Fix, we should assign from the temporary, not from
13240         the source. 
13241
13242         * expression.cs (MakeByteBlob): Fix my incorrect code.
13243
13244 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13245
13246         * typemanager.cs (EnumToUnderlying): This function is used to get
13247         the underlying type from an enumeration, because it does not
13248         always work. 
13249
13250         * constant.cs: Use the I4_S form for values between -128 and 127.
13251
13252         * statement.cs (Block.LookupLabel): Looks up a label.
13253         (Block): Drop support for labeled blocks.
13254
13255         (LabeledStatement): New kind of statement that represents a label
13256         only.
13257
13258         (Goto): Finally implement this bad boy.
13259
13260         * cs-parser.jay: Update to reflect new mechanism to implement
13261         labels.
13262
13263 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13264
13265         * codegen.cs (EmitContext.This): a codegen property that keeps the
13266         a single instance of this instead of creating many different this
13267         instances. 
13268
13269         * delegate.cs (Delegate.DoResolve): Update to use the property;
13270
13271         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13272
13273         * expression.cs (BaseAccess.DoResolve): Ditto.
13274
13275 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13276
13277         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13278         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13279
13280         (InitCoreTypes): Update accordingly.
13281
13282         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13283         so we can quickly store the state.
13284
13285         (ApplyAttributes): Set the correct implementation flags
13286         for InternalCall methods.
13287
13288 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * expression.cs (EmitCall): if a method is not virtual, then do
13291         not use callvirt on it.
13292
13293         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13294         user defined stuff) requires the use of stobj, which takes an
13295         address on the stack instead of an array and an index.  So emit
13296         the Ldelema operation for it.
13297
13298         (EmitStoreOpcode): Use stobj for valuetypes.
13299
13300         (UnaryMutator.EmitCode): Use the right 1 value depending on
13301         whether we are dealing with int64/uint64, float or doubles.
13302
13303         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13304         constructors that I implemented last night.
13305
13306         (Constructor.IsDefault): Fix to work properly for static
13307         constructors.
13308
13309         * cs-parser.jay (CheckDef): report method signature errors.
13310         Update error number 103 to be 132.
13311
13312         * decl.cs: New AdditionResult enumeration value: MethodExists.
13313         Although we do this check for methods later on in the semantic
13314         analysis, catching repeated default constructors is so easy that
13315         we catch these here. 
13316
13317         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13318         promotions code.
13319
13320         (ParameterReference.EmitAssign, Emit): handle
13321         bools as bytes.
13322
13323         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13324         (ArrayAccess.EmitStoreOpcode): ditto.
13325
13326         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13327
13328         * expression.cs (MakeByteBlob): Complete all the missing types
13329         (uint, short, ushort, byte, sbyte)
13330
13331         * class.cs: Only init instance field initializers on instance
13332         constructors. 
13333
13334         Rename `constructors' to instance_constructors. 
13335
13336         (TypeContainer.AddConstructor): Only add constructors to the list
13337         if it is not static.
13338
13339         Make sure that we handle default_static_constructor independently
13340         everywhere where we handle instance_constructors
13341
13342 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13343
13344         * class.cs: Do not lookup or create a base initializer for a
13345         static constructor.
13346
13347         (ConstructorInitializer.Resolve): use the proper type to lookup
13348         for constructors.
13349
13350         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13351
13352         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13353         in DeclSpace. 
13354
13355         * decl.cs: CloseType is now an virtual method, the default
13356         implementation just closes this type.
13357
13358 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13359
13360         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13361         to PreserveSig by default. Also emit HideBySig on such methods.
13362
13363         Basically, set the defaults to standard values.
13364
13365         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13366         argument, if candidate is better, it can't be worse than the best !
13367
13368         (Invocation): Re-write bits to differentiate between methods being
13369         applicable in their expanded form and their normal form - for params
13370         methods of course.
13371
13372         Get rid of use_standard everywhere as only standard conversions are allowed
13373         in overload resolution. 
13374
13375         More spec conformance.
13376
13377 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13378
13379         * driver.cs: Add --timestamp, to see where the compiler spends
13380         most of its time.
13381
13382         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13383         `this' in static code.
13384
13385         (SimpleName.DoResolve): Implement in terms of a helper function
13386         that allows static-references to be passed upstream to
13387         MemberAccess.
13388
13389         (Expression.ResolveWithSimpleName): Resolve specially simple
13390         names when called by MemberAccess to implement the special
13391         semantics. 
13392
13393         (Expression.ImplicitReferenceConversion): Handle conversions from
13394         Null to reference types before others, as Null's type is
13395         System.Object. 
13396
13397         * expression.cs (Invocation.EmitCall): Handle the special case of
13398         calling methods declared on a reference type from a ValueType
13399         (Base classes System.Object and System.Enum)
13400
13401         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13402         the left hand side is a TypeExpr, not on every enumeration. 
13403
13404         (Binary.Resolve): If types are reference types, then do a cast to
13405         object on operators != and == of both arguments.
13406
13407         * typemanager.cs (FindMembers): Extract instance and static
13408         members if requested.
13409
13410         * interface.cs (PopulateProperty): Use void_type instead of null
13411         as the return type for the setter method.
13412
13413         (PopulateIndexer): ditto.
13414
13415 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13416
13417         * support.cs (ReflectionParameters): Fix minor bug where we
13418         were examining the wrong parameter for the ParamArray attribute.
13419
13420         Cope with requests for the type of the parameter at position
13421         greater than the params parameter's. We now return the element
13422         type of the params array as that makes more sense.
13423
13424         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13425         accordingly as we no longer have to extract the element type
13426         ourselves.
13427
13428         (Invocation.OverloadResolve): Update.
13429
13430 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13431
13432         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13433         against IEnumerator, test whether the return value is a descendant
13434         of the IEnumerator interface.
13435
13436         * class.cs (Indexer.Define): Use an auxiliary method to implement
13437         the other bits of the method definition.  Begin support for
13438         explicit interface implementation.
13439
13440         (Property.DefineMethod): Use TypeManager.void_type instead of null
13441         for an empty return value.
13442
13443 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13444
13445         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13446         dealing with a FieldExpr which is composed of a FieldBuilder, in
13447         the code path we did extract the constant, but we should have
13448         obtained the underlying value to be able to cast it (otherwise we
13449         end up in an infinite loop, this is what Ravi was running into).
13450
13451         (ArrayCreation.UpdateIndices): Arrays might be empty.
13452
13453         (MemberAccess.ResolveMemberAccess): Add support for section
13454         14.5.4.1 that deals with the special case of E.I when E is a type
13455         and something else, that I can be a reference to a static member.
13456
13457         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13458         handle a particular array type to create byte blobs, it is just
13459         something we dont generate byteblobs for.
13460
13461         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13462         arguments. 
13463
13464         * location.cs (Push): remove the key from the hashtable that we
13465         are about to add.   This happens for empty files.
13466
13467         * driver.cs: Dispose files after we have parsed them.
13468
13469         (tokenize): new function that only runs the tokenizer on its
13470         input, for speed testing.
13471
13472 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13473
13474         * class.cs (Event.Define): Define the private field only if there
13475         are no accessors defined.
13476
13477         * expression.cs (ResolveMemberAccess): If there is no associated
13478         field with the event, that means we have an event defined with its
13479         own accessors and we should flag error cs0070 since transforming
13480         ourselves into a field is not valid in that case.
13481
13482         * ecore.cs (SimpleName.DoResolve): Same as above.
13483
13484         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13485         and charset to sane values.
13486
13487 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13488
13489         * assign.cs (DoResolve): Perform check on events only if they 
13490         are being accessed outside the declaring type.
13491
13492         * cs-parser.jay (event_declarations): Update rules to correctly
13493         set the type of the implicit parameter etc.
13494
13495         (add_accessor, remove_accessor): Set current local parameters.
13496
13497         * expression.cs (Binary): For delegate addition and subtraction,
13498         cast the return value from the method into the appropriate delegate
13499         type.
13500
13501 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13502
13503         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13504         of these as the workaround is unnecessary.
13505
13506         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13507         delegate data - none of that is needed at all.
13508
13509         Re-write bits to extract the instance expression and the delegate method
13510         correctly.
13511
13512         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13513         on delegates too.
13514
13515         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13516         of attaching attributes instead of duplicating code everywhere.
13517
13518         * everywhere : Update code to do attribute emission using the above method.
13519
13520 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13521
13522         * expression.cs (IsParamsMethodApplicable): if there are not
13523         parameters, return immediately.
13524
13525         * ecore.cs: The 0 literal can be implicity converted to an enum
13526         type. 
13527
13528         (SimpleName.DoResolve): First lookup the type, then lookup the
13529         members. 
13530
13531         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13532         want to get its address.  If the InstanceExpression is not
13533         addressable, store the result in a temporary variable, then get
13534         the address of it.
13535
13536         * codegen.cs: Only display 219 errors on warning level or above. 
13537
13538         * expression.cs (ArrayAccess): Make it implement the
13539         IMemoryLocation interface.
13540
13541         (Binary.DoResolve): handle the operator == (object a, object b)
13542         and operator != (object a, object b) without incurring into a
13543         BoxedCast (because 5 != o should never be performed).
13544
13545         Handle binary enumerator operators.
13546
13547         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13548         value type, otherwise use Ldelem_ref.
13549
13550         Use precomputed names;
13551
13552         (AddressOf): Implement address of
13553
13554         * cs-parser.jay (labeled_statement): Fix recursive block
13555         addition by reworking the production.
13556
13557         * expression.cs (New.DoEmit): New has a special case:
13558                 
13559                  If we are dealing with a ValueType, we have a few
13560                  situations to deal with:
13561                 
13562                     * The target of New is a ValueType variable, that is
13563                       easy, we just pass this as the variable reference
13564                 
13565                     * The target of New is being passed as an argument,
13566                       to a boxing operation or a function that takes a
13567                       ValueType.
13568                 
13569                       In this case, we need to create a temporary variable
13570                       that is the argument of New.
13571
13572
13573 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13574
13575         * rootcontext.cs (LookupType): Check that current_type is not null before
13576         going about looking at nested types.
13577
13578         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13579         not implement the IAssignMethod interface any more.
13580
13581         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13582         where we tranform them into FieldExprs if they are being resolved from within
13583         the declaring type.
13584
13585         * ecore.cs (SimpleName.DoResolve): Do the same here.
13586
13587         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13588
13589         * ../errors/bug10.cs : Add.
13590
13591         * ../errors/cs0070.cs : Add.
13592
13593         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13594
13595         * assign.cs : Get rid of EventIsLocal everywhere.
13596
13597 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13598
13599         * ecore.cs (ConvertIntLiteral): finished the implementation.
13600
13601         * statement.cs (SwitchLabel): Convert the value we are using as a
13602         key before looking up the table.
13603
13604 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13605
13606         * codegen.cs (EmitTopBlock): Require a Location argument now.
13607
13608         * cs-parser.jay (constructor_declarator): We need to setup
13609         current_local_parameters before we parse the
13610         opt_constructor_initializer, to allow the variables to be bound
13611         to the constructor arguments.
13612
13613         * rootcontext.cs (LookupType): First lookup nested classes in our
13614         class and our parents before we go looking outside our class.
13615
13616         * expression.cs (ConstantFold): Extract/debox the values at the
13617         beginnning. 
13618
13619         * rootcontext.cs (EmitCode): Resolve the constants first before we
13620         resolve the types.  This is not really needed, but it helps debugging.
13621
13622         * statement.cs: report location.
13623
13624         * cs-parser.jay: pass location to throw statement.
13625
13626         * driver.cs: Small bug fix.
13627
13628         * report.cs: Updated format to be 4-zero filled digits.
13629
13630 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13631
13632         * expression.cs (CheckIndices): Fix minor bug where the wrong
13633         variable was being referred to ;-)
13634
13635         (DoEmit): Do not call EmitStaticInitializers when the 
13636         underlying type is System.Object.
13637
13638 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13639
13640         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13641         and do the usual workaround for SRE.
13642
13643         * class.cs (MyEventBuilder.EventType): New member to get at the type
13644         of the event, quickly.
13645
13646         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13647
13648         * assign.cs (Assign.DoResolve): Handle the case when the target
13649         is an EventExpr and perform the necessary checks.
13650
13651         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13652         interface.
13653
13654         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13655
13656         (EventExpr): Set the type in the constructor itself since we 
13657         are meant to be born fully resolved.
13658
13659         (EventExpr.Define): Revert code I wrote earlier.
13660                 
13661         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13662         instance expression is null. The instance expression is a This in that case
13663         or a null, depending on whether it is a static method or not.
13664
13665         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13666         refers to more than one method.
13667
13668         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13669         and accordingly flag errors.
13670
13671 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13672
13673         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13674
13675 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13676
13677         * location.cs (ToString): Provide useful rutine.
13678
13679 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13680
13681         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13682         objects, return the actual integral boxed.
13683
13684         * statement.cs (SwitchLabel): define an ILLabel for each
13685         SwitchLabel. 
13686
13687         (Switch.CheckSwitch): If the value is a Literal, extract
13688         the underlying literal.
13689
13690         Also in the unused hashtable we had, add the SwitchLabel so we can
13691         quickly look this value up.
13692
13693         * constant.cs: Implement a bunch of new constants.  Rewrite
13694         Literal based on this.  Made changes everywhere to adapt to this.
13695
13696         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13697         dereferencing array only once, and also copes with enumrations.
13698
13699         bytes are two bytes wide, not one.
13700
13701         (Cast): Perform constant conversions.
13702
13703         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13704         wrappers to the literals here.
13705
13706         * expression.cs (DoNumericPromotions): long literals can converted
13707         to ulong implicity (this is taken care of elsewhere, but I was
13708         missing this spot).
13709
13710         * ecore.cs (Expression.Literalize): Make the return type Literal,
13711         to improve type checking.
13712
13713         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13714
13715 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13716
13717         * literal.cs: Revert code from ravi that checked the bounds.  The
13718         bounds are sane by the definition of the type itself. 
13719
13720         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13721         need to actually look up in our parent hierarchy for interfaces
13722         implemented. 
13723
13724         * const.cs: Use the underlying type for enumerations
13725
13726         * delegate.cs: Compute the basename for the delegate creation,
13727         that should fix the delegate test case, and restore the correct
13728         Type Lookup semantics in rootcontext
13729
13730         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13731         referencing a nested type with the Reflection API is using the "+"
13732         sign. 
13733
13734         * cs-parser.jay: Do not require EOF token at the end.
13735
13736 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13737
13738         * rootcontext.cs (LookupType): Concatenate type names with
13739         a '.' instead of a '+' The test suite passes again.
13740
13741         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13742         field of the enumeration.
13743
13744         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13745         the case when the member is an EventExpr.
13746
13747         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13748         static has an associated instance expression.
13749
13750         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13751
13752         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13753
13754         * class.cs (Event.Define): Register event and perform appropriate checks
13755         for error #111.
13756
13757         We define the Add and Remove methods even if the use provides none because
13758         in that case, we provide default implementations ourselves.
13759
13760         Define a private field of the type of the event. This is done by the CSC compiler
13761         and we should be doing it too ;-)
13762
13763         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13764         More methods we use in code we generate.
13765
13766         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13767         is important.
13768
13769         (InitCoreTypes): Update accordingly for the above.
13770
13771         * class.cs (Event.Emit): Generate code for default accessors that we provide
13772
13773         (EmitDefaultMethod): Do the job in the above.
13774
13775         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13776         appropriate place.
13777
13778 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13779
13780         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13781         builders even if we were missing one.
13782
13783         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13784         pass the Basename as our class name instead of the Name.  The
13785         basename will be correctly composed for us.
13786
13787         * parameter.cs (Paramters): Now takes a Location argument.
13788
13789         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13790         make all the code call directly LookupType in RootContext and take
13791         this chance to pass the Location information everywhere.
13792
13793         * Everywhere: pass Location information.
13794
13795 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13796
13797         * class.cs (Constructor.Define): Updated way of detecting the
13798         length of the parameters.
13799
13800         (TypeContainer.DefineType): Use basename as the type name for
13801         nested types.
13802
13803         (TypeContainer.Define): Do not recursively define types here, as
13804         definition is taken care in order by the RootContext.
13805
13806         * tree.cs: Keep track of namespaces in a per-file basis.
13807
13808         * parameter.cs (Parameter.ComputeSignature): Update to use
13809         DeclSpace. 
13810
13811         (Parameters.GetSignature): ditto.
13812
13813         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13814         instead of a TypeContainer.
13815
13816         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13817         resolve names.  Because we need to be resolve in our context, not
13818         our parents.
13819
13820         * driver.cs: Implement response files.
13821
13822         * class.cs (TypeContainer.DefineType): If we are defined, do not
13823         redefine ourselves.
13824
13825         (Event.Emit): Emit the code for add/remove handlers.
13826         (Event.Define): Save the MethodBuilders for add/remove.
13827
13828         * typemanager.cs: Use pair here too.
13829
13830         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13831         DictionaryEntry requires the first argument to be non-null.  
13832
13833         (enum_declaration): Compute full name for registering the
13834         enumeration.
13835
13836         (delegate_declaration): Instead of using
13837         formal_parameter_list, use opt_formal_parameter_list as the list
13838         can be empty.
13839
13840         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13841         (EventParsing): New property that controls whether `add' and
13842         `remove' are returned as tokens or identifiers (for events);
13843
13844 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13845
13846         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13847         use MyEventBuilder only and let it wrap the real builder for us.
13848
13849         (MyEventBuilder): Revamp constructor etc.
13850
13851         Implement all operations that we perform on EventBuilder in precisely the same
13852         way here too.
13853
13854         (FindMembers): Update to use the EventBuilder member.
13855
13856         (Event.Emit): Update accordingly.
13857
13858 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13859
13860         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13861         by calling the appropriate methods.
13862
13863         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13864         useful.
13865
13866         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13867
13868 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13869
13870         * delegate.cs (Delegate.Populate): Check that the return type
13871         and various parameters types are indeed accessible.
13872
13873         * class.cs (Constructor.Define): Same here.
13874
13875         (Field.Define): Ditto.
13876
13877         (Event.Define): Ditto.
13878
13879         (Operator.Define): Check that the underlying Method defined itself
13880         correctly - so it's MethodBuilder should not be null.
13881
13882         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13883         expression happens to be null.
13884
13885         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13886         members but as of now we don't seem to be able to do anything really useful with it.
13887
13888         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13889         not the EventBuilder.
13890
13891 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13892
13893         * cs-tokenizer.cs: Add support for defines.
13894         Add support for #if, #elif, #else, #endif
13895
13896         (eval_var): evaluates a variable.
13897         (eval): stubbed for evaluating functions.
13898
13899         * cs-parser.jay: Pass the defines information
13900
13901         * driver.cs: Add --define command line option.
13902
13903         * decl.cs: Move MemberCore here.
13904
13905         Make it the base class for DeclSpace.  This allows us to catch and
13906         report 108 and 109 for everything now.
13907
13908         * class.cs (TypeContainer.Define): Extract all the members
13909         before populating and emit the warning 108 (new keyword required
13910         to override) instead of having each member implement this.
13911
13912         (MemberCore.Define): New abstract method, we will be using this in
13913         the warning reporting engine in Populate.
13914
13915         (Operator.Define): Adjust to new MemberCore protocol. 
13916
13917         * const.cs (Const): This does not derive from Expression, it is a
13918         temporary object we use to create fields, it is a MemberCore. 
13919
13920         * class.cs (Method.Define): Allow the entry point to be in a
13921         specific class.
13922
13923         * driver.cs: Rewrite the argument handler to clean it up a bit.
13924
13925         * rootcontext.cs: Made it just an auxiliary namespace feature by
13926         making everything static.
13927
13928         * driver.cs: Adapt code to use RootContext type name instead of
13929         instance variable.
13930
13931         * delegate.cs: Remove RootContext argument.
13932
13933         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13934         argument. 
13935
13936         * class.cs (Event.Define): The lookup can fail.
13937
13938         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13939
13940         * expression.cs: Resolve the this instance before invoking the code.
13941
13942 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13943
13944         * cs-parser.jay: Add a production in element_access that allows
13945         the thing to become a "type" reference.  This way we can parse
13946         things like "(string [])" as a type.
13947
13948         Note that this still does not handle the more complex rules of
13949         casts. 
13950
13951
13952         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13953
13954         * ecore.cs: (CopyNewMethods): new utility function used to
13955         assemble the list of methods from running FindMembers.
13956
13957         (MemberLookup): Rework FindMembers so that 
13958
13959 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13960
13961         * class.cs (TypeContainer): Remove Delegates who fail to be
13962         defined.
13963
13964         * delegate.cs (Populate): Verify that we dont get null return
13965         values.   TODO: Check for AsAccessible.
13966
13967         * cs-parser.jay: Use basename to emit error 574 (destructor should
13968         have the same name as container class), not the full name.
13969
13970         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13971         possible representation.  
13972
13973         Also implements integer type suffixes U and L.
13974
13975 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13976
13977         * expression.cs (ArrayCreation.DoResolve): We need to do the
13978         argument resolution *always*.
13979
13980         * decl.cs: Make this hold the namespace.  Hold the root context as
13981         well.
13982         (LookupType): Move here.
13983
13984         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13985
13986         * location.cs (Row, Name): Fixed the code, it was always returning
13987         references to the first file.
13988
13989         * interface.cs: Register properties defined through interfaces.
13990
13991         * driver.cs: Add support for globbing on the command line
13992
13993         * class.cs (Field): Make it derive from MemberCore as well.
13994         (Event): ditto.
13995
13996 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13997
13998         * class.cs (Event::Define): Check that the type of the event is a delegate
13999         type else flag error #66.
14000
14001         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14002         same.
14003
14004         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14005         values of EntryPoint, CharSet etc etc.
14006
14007         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14008
14009         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14010         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14011         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14012         which needs this to do its work.
14013
14014         * ../errors/cs0066.cs : Add.
14015
14016 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14017
14018         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14019         helper functions.
14020
14021         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14022         clears out the parameters field.
14023         (MemberSignatureCompare): Cleanup
14024
14025         (MemberCore): New base class used to share code between MethodCore
14026         and Property.
14027
14028         (RegisterRequiredImplementations) BindingFlags.Public requires
14029         either BindingFlags.Instace or Static.  Use instance here.
14030
14031         (Property): Refactored code to cope better with the full spec.
14032
14033         * parameter.cs (GetParameterInfo): Return an empty array instead
14034         of null on error.
14035
14036         * class.cs (Property): Abstract or extern properties have no bodies.
14037
14038         * parameter.cs (GetParameterInfo): return a zero-sized array.
14039
14040         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14041         method modifier validation to the typecontainer so we can reuse
14042         this on properties.
14043
14044         (MethodCore.ParameterTypes): return an empty sized array of types.
14045
14046         (Property.Define): Test property modifier validity.
14047
14048         Add tests for sealed/override too.
14049
14050         (Method.Emit): abstract or extern methods have no bodies.
14051
14052 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14053
14054         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14055         thing.
14056
14057         (Method::Define, ::Emit): Modify accordingly.
14058
14059         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14060
14061         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14062
14063         * makefile: Pass in /unsafe.
14064
14065 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14066
14067         * class.cs (MakeKey): Kill routine.
14068
14069         * class.cs (TypeContainer.Define): Correctly define explicit
14070         method implementations (they require the full interface name plus
14071         the method name).
14072
14073         * typemanager.cs: Deply the PtrHashtable here and stop using the
14074         lame keys.  Things work so much better.
14075
14076         This of course broke everyone who depended on `RegisterMethod' to
14077         do the `test for existance' test.  This has to be done elsewhere.
14078
14079         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14080         the object stupid Equals method (because, that like fails all over
14081         the place).  We still do not use it.
14082
14083         * class.cs (TypeContainer.SetRequiredInterface,
14084         TypeContainer.RequireMethods): Killed these two routines and moved
14085         all the functionality to RegisterRequiredImplementations.
14086
14087         (TypeContainer.RegisterRequiredImplementations): This routine now
14088         registers all the implementations required in an array for the
14089         interfaces and abstract methods.  We use an array of structures
14090         which can be computed ahead of time to reduce memory usage and we
14091         also assume that lookups are cheap as most classes will not
14092         implement too many interfaces.
14093
14094         We also avoid creating too many MethodSignatures.
14095
14096         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14097         clear the "pending" bit if we find that there are problems with
14098         the declaration.
14099
14100         (TypeContainer.VerifyPendingMethods): Update to report errors of
14101         methods that look like implementations but are not.
14102
14103         (TypeContainer.Define): Add support for explicit interface method
14104         implementation. 
14105
14106 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14107
14108         * typemanager.cs: Keep track of the parameters here instead of
14109         being a feature of the TypeContainer.
14110
14111         * class.cs: Drop the registration of parameters here, as
14112         InterfaceMethods are also interface declarations.
14113
14114         * delegate.cs: Register methods with the TypeManager not only with
14115         the TypeContainer.  This code was buggy.
14116
14117         * interface.cs: Full registation here.
14118
14119 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14120
14121         * expression.cs: Remove reducer for binary expressions, it can not
14122         be done this way.
14123
14124         * const.cs: Put here the code that used to go into constant.cs
14125
14126         * constant.cs: Put here the code for constants, this is a new base
14127         class for Literals.
14128
14129         * literal.cs: Make Literal derive from Constant.
14130
14131 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14132
14133         * statement.cs (Return.Emit): Report error 157 if the user
14134         attempts to return from a finally block.
14135
14136         (Return.Emit): Instead of emitting a return, jump to the end of
14137         the function.
14138
14139         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14140         LocalBuilder to store the result of the function.  ReturnLabel is
14141         the target where we jump.
14142
14143
14144 2001-12-09  Radek Doulik  <rodo@ximian.com>
14145
14146         * cs-parser.jay: remember alias in current namespace
14147
14148         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14149         namespaces
14150
14151         * class.cs (LookupAlias): lookup alias in my_namespace
14152
14153         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14154         aliases hashtable
14155         (LookupAlias): lookup alias in this and if needed in parent
14156         namespaces
14157
14158 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14159
14160         * support.cs: 
14161
14162         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14163         making things static.  I need this to avoid passing the
14164         TypeContainer when calling ParameterType.
14165
14166         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14167         that did string manipulation to compute the type and then call
14168         GetType.  Use Parameter.ParameterType instead.
14169
14170         * cs-tokenizer.cs: Consume the suffix for floating values.
14171
14172         * expression.cs (ParameterReference): figure out whether this is a
14173         reference parameter or not.  Kill an extra variable by computing
14174         the arg_idx during emission.
14175
14176         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14177         function that returns whether a parameter is an out/ref value or not.
14178
14179         (Parameter.ParameterType): The type of the parameter (base,
14180         without ref/out applied).
14181
14182         (Parameter.Resolve): Perform resolution here.
14183         (Parameter.ExternalType): The full type (with ref/out applied).
14184
14185         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14186         support for expressions on the using statement.
14187
14188 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14189
14190         * statement.cs (Using.EmitLocalVariableDecls): Split the
14191         localvariable handling of the using statement.
14192
14193         (Block.EmitMeta): Keep track of variable count across blocks.  We
14194         were reusing slots on separate branches of blocks.
14195
14196         (Try.Emit): Emit the general code block, we were not emitting it. 
14197
14198         Check the type of the declaration to be an IDisposable or
14199         something that can be implicity converted to it. 
14200
14201         Emit conversions if required.
14202
14203         * ecore.cs (EmptyExpression): New utility class.
14204         (Expression.ImplicitConversionExists): New utility function.
14205
14206 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14207
14208         * statement.cs (Using): Implement.
14209
14210         * expression.cs (LocalVariableReference): Support read only variables.
14211
14212         * statement.cs: Remove the explicit emit for the Leave opcode.
14213         (VariableInfo): Add a readonly field.
14214
14215 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14216
14217         * ecore.cs (ConvCast): new class used to encapsulate the various
14218         explicit integer conversions that works in both checked and
14219         unchecked contexts.
14220
14221         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14222         properly generate the overflow opcodes.
14223
14224 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14225
14226         * statement.cs: The correct type for the EmptyExpression is the
14227         element_type, not the variable type.  Ravi pointed this out.
14228
14229 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14230
14231         * class.cs (Method::Define): Handle PInvoke methods specially
14232         by using DefinePInvokeMethod instead of the usual one.
14233
14234         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14235         above to do the task of extracting information and defining the method.
14236
14237 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14238
14239         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14240         of the condition for string type.
14241
14242         (Emit): Move that here. 
14243
14244         (ArrayCreation::CheckIndices): Keep string literals in their expression
14245         form.
14246
14247         (EmitDynamicInitializers): Handle strings appropriately.
14248
14249 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14250
14251         * codegen.cs (EmitContext): Replace multiple variables with a
14252         single pointer to the current Switch statement.
14253
14254         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14255         EmitContext.
14256
14257 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14258
14259         * statement.cs 
14260
14261         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14262         default'.
14263
14264         (Foreach.Emit): Foreach on arrays was not setting
14265         up the loop variables (for break/continue).
14266
14267         (GotoCase): Semi-implented.
14268
14269 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14270
14271         * attribute.cs (CheckAttribute): Handle system attributes by using
14272         Attribute.GetAttributes to examine information we need.
14273
14274         (GetValidPlaces): Same here.
14275
14276         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14277
14278         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14279
14280         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14281
14282         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14283
14284         (Method::Emit): Handle the case when we are a PInvoke method.
14285
14286 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14287
14288         * expression.cs: Use ResolveWithSimpleName on compound names.
14289
14290 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14291
14292         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14293         before trying to reduce it.
14294
14295         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14296
14297         * constant.cs (LookupConstantValue): Implement.
14298
14299         (EmitConstant): Use the above in emitting the constant.
14300
14301         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14302         that are user-defined by doing a LookupConstantValue on them.
14303
14304         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14305         too, like above.
14306
14307 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14308
14309         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14310
14311         (BaseAccess.DoResolve): Implement.
14312
14313         (MemberAccess.DoResolve): Split this routine into a
14314         ResolveMemberAccess routine that can be used independently
14315
14316 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14317
14318         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14319         As that share bits of the implementation.  Is returns a boolean,
14320         while As returns the Type that is being probed.
14321
14322 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14323
14324         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14325         instead of a Literal - much easier.
14326
14327         (EnumInTransit): Remove - utterly useless :-)
14328
14329         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14330
14331         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14332
14333         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14334         chain when we have no associated expression.
14335
14336 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14337
14338         * constant.cs (Define): Use Location while reporting the errror.
14339
14340         Also emit a warning when 'new' is used and there is no inherited
14341         member to hide.
14342
14343         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14344         populated.
14345
14346         (LookupEnumValue): Implement to lookup an enum member's value and define it
14347         if necessary.
14348
14349         (Populate): Re-write accordingly to use the above routine.
14350
14351 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14352
14353         * expression.cs (This): Fix prototype for DoResolveLValue to
14354         override the base class DoResolveLValue.
14355
14356         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14357         declarations) 
14358
14359         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14360         (we need to load the address of the field here).  This fixes
14361         test-22. 
14362
14363         (FieldExpr.DoResolveLValue): Call the DoResolve
14364         function to initialize the Instance expression.
14365
14366         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14367         correctly the GetEnumerator operation on a value type.
14368
14369         * cs-parser.jay: Add more simple parsing error catches.
14370
14371         * statement.cs (Switch): Add support for string switches.
14372         Handle null specially.
14373
14374         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14375
14376 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14377
14378         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14379
14380         (declare_local_constant): New helper function.
14381
14382         * statement.cs (AddConstant): Keep a separate record of constants
14383
14384         (IsConstant): Implement to determine if a variable is a constant.
14385
14386         (GetConstantExpression): Implement.
14387
14388         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14389
14390         * statement.cs (IsVariableDefined): Re-write.
14391
14392 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14393
14394         * class.cs (TypeContainer::FindMembers): Look for constants
14395         in the case when we are looking for MemberTypes.Field
14396
14397         * expression.cs (MemberAccess::DoResolve): Check that in the
14398         case we are a FieldExpr and a Literal, we are not being accessed
14399         by an instance reference.
14400
14401         * cs-parser.jay (local_constant_declaration): Implement.
14402
14403         (declaration_statement): Implement for constant declarations.
14404
14405 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14406
14407         * statement.cs (Switch): Catch double defaults.
14408
14409         (Switch): More work on the switch() statement
14410         implementation.  It works for integral values now, need to finish
14411         string support.
14412
14413
14414 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14415
14416         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14417         integer literals into other integer literals.  To be used by
14418         switch. 
14419
14420 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14421
14422         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14423         some memory.
14424
14425         (EmitDynamicInitializers): Cope with the above since we extract data
14426         directly from ArrayData now.
14427
14428         (ExpectInitializers): Keep track of whether initializers are mandatory
14429         or not.
14430
14431         (Bounds): Make it a hashtable to prevent the same dimension being 
14432         recorded for every element in that dimension.
14433
14434         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14435         from being found.
14436
14437         Also fix bug which was causing the indices to be emitted in the reverse
14438         order.
14439
14440 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14441
14442         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14443         unfinished.  They do not work, because the underlying code is
14444         sloppy.
14445
14446 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14447
14448         * cs-parser.jay: Remove bogus fixme.
14449
14450         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14451         on Switch statement.
14452
14453 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14454
14455         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14456         the same. 
14457
14458         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14459         parameter. Apparently, any expression is allowed. 
14460
14461         (ValidateInitializers): Update accordingly.
14462
14463         (CheckIndices): Fix some tricky bugs thanks to recursion.
14464
14465         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14466         I was being completely brain-dead.
14467
14468         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14469         and re-write acordingly.
14470
14471         (DelegateInvocation): Re-write accordingly.
14472
14473         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14474
14475         (MakeByteBlob): Handle types more correctly.
14476
14477         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14478         initialization from expressions but it is incomplete because I am a complete
14479         Dodo :-|
14480
14481 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14482
14483         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14484         on If.  Basically, we have to return `true' (ie, we do return to
14485         our caller) only if both branches of the if return.
14486
14487         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14488         short-circuit operators, handle them as short circuit operators. 
14489
14490         (Cast.DoResolve): Resolve type.
14491         (Cast.Cast): Take an expression as the target type.
14492
14493         * cs-parser.jay (cast_expression): Remove old hack that only
14494         allowed a limited set of types to be handled.  Now we take a
14495         unary_expression and we resolve to a type during semantic
14496         analysis.
14497
14498         Use the grammar productions from Rhys to handle casts (this is
14499         not complete like Rhys syntax yet, we fail to handle that corner
14500         case that C# has regarding (-x), but we will get there.
14501
14502 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14503
14504         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14505         field which is an array type.
14506
14507         * cs-parser.jay (declare_local_variables): Support array initialization too.
14508
14509         * typemanager.cs (MakeKey): Implement.
14510
14511         (everywhere): Use the above appropriately.
14512
14513         * cs-parser.jay (for_statement): Update for array initialization while
14514         declaring variables.
14515
14516         * ecore.cs : The error message was correct, it's the variable's names that
14517         were misleading ;-) Make the code more readable.
14518
14519         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14520         the correct type etc.
14521
14522         (ConvertExplicit): Handle Enum types by examining the underlying type.
14523
14524 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14525
14526         * parameter.cs (GetCallingConvention): Always return
14527         CallingConventions.Standard for now.
14528
14529 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14530
14531         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14532         and `r' after calling DoNumericPromotions.
14533
14534         * ecore.cs: Fix error message (the types were in the wrong order).
14535
14536         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14537         BindingFlags.Instance as well 
14538
14539         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14540         implicit int literal conversion in an empty cast so that we
14541         propagate the right type upstream.
14542
14543         (UnboxCast): new class used to unbox value types.
14544         (Expression.ConvertExplicit): Add explicit type conversions done
14545         by unboxing.
14546
14547         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14548         the target type before applying the implicit LongLiterals to ULong
14549         literal cast.
14550
14551 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14552
14553         * cs-parser.jay (for_statement): Reworked the way For works: now
14554         we declare manually any variables that are introduced in
14555         for_initializer to solve the problem of having out-of-band code
14556         emition (that is what got for broken).
14557
14558         (declaration_statement): Perform the actual variable declaration
14559         that used to be done in local_variable_declaration here.
14560
14561         (local_variable_declaration): Do not declare anything, just pass
14562         the information on a DictionaryEntry
14563
14564 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14565
14566         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14567         re-write of the logic to now make it recursive.
14568
14569         (UpdateIndices): Re-write accordingly.
14570
14571         Store element data in a separate ArrayData list in the above methods.
14572
14573         (MakeByteBlob): Implement to dump the array data into a byte array.
14574
14575 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14576
14577         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14578         into CheckIndices.
14579
14580         * constant.cs (Define): Implement.
14581
14582         (EmitConstant): Re-write fully.
14583
14584         Pass in location info.
14585
14586         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14587         respectively.
14588
14589         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14590         DictionaryEntry since we need location info too.
14591
14592         (constant_declaration): Update accordingly.
14593
14594         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14595         code into another method : UpdateIndices.
14596
14597 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14598
14599         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14600         some type checking etc.
14601
14602 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14603
14604         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14605         bits to provide dimension info if the user skips doing that.
14606
14607         Update second constructor to store the rank correctly.
14608
14609 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14610
14611         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14612         and try to implement.
14613
14614         * ../errors/cs0150.cs : Add.
14615
14616         * ../errors/cs0178.cs : Add.
14617
14618 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14619
14620         * statement.cs: Implement foreach on multi-dimensional arrays. 
14621
14622         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14623         name of the params argument.
14624
14625         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14626         initializing the array.
14627
14628         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14629         we can use this elsewhere.
14630
14631         * statement.cs: Finish implementation of foreach for single
14632         dimension arrays.
14633
14634         * cs-parser.jay: Use an out-of-band stack to pass information
14635         around, I wonder why I need this.
14636
14637         foreach_block: Make the new foreach_block the current_block.
14638
14639         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14640         function used to return a static Parameters structure.  Used for
14641         empty parameters, as those are created very frequently.
14642
14643         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14644
14645 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14646
14647         * interface.cs : Default modifier is private, not public. The
14648         make verify test passes again.
14649
14650 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14651
14652         * support.cs (ReflectionParameters): Fix logic to determine
14653         whether the last parameter is a params one. Test 9 passes again.
14654
14655         * delegate.cs (Populate): Register the builders we define with
14656         RegisterParameterForBuilder. Test 19 passes again.
14657
14658         * cs-parser.jay (property_declaration): Reference $6 instead
14659         of $$ to get at the location.
14660
14661         (indexer_declaration): Similar stuff.
14662
14663         (attribute): Ditto.
14664
14665         * class.cs (Property): Register parameters for the Get and Set methods
14666         if they exist. Test 23 passes again.
14667
14668         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14669         call to EmitArguments as we are sure there aren't any params arguments. 
14670         Test 32 passes again.
14671
14672         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14673         IndexOutOfRangeException. 
14674
14675         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14676         Test 33 now passes again.
14677
14678 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14679
14680         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14681         broke a bunch of things.  Will have to come up with a better way
14682         of tracking locations.
14683
14684         * statement.cs: Implemented foreach for single dimension arrays.
14685
14686 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14687
14688         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14689         an error.  This removes the lookup from the critical path.
14690
14691         * cs-parser.jay: Removed use of temporary_loc, which is completely
14692         broken. 
14693
14694 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14695
14696         * support.cs (ReflectionParameters.ParameterModifier): Report
14697         whether the argument is a PARAMS argument or not.
14698
14699         * class.cs: Set the attribute `ParamArrayAttribute' on the
14700         parameter argument.
14701
14702         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14703         and cons_param_array_attribute (ConstructorInfo for
14704         ParamArrayAttribute)., 
14705
14706         * codegen.cs: Emit the return using the `Return' statement, that
14707         way we can report the error correctly for missing return values. 
14708
14709         * class.cs (Method.Emit): Clean up.
14710
14711         * expression.cs (Argument.Resolve): Take another argument: the
14712         location where this argument is used.  Notice that this is not
14713         part of the "Argument" class as to reduce the size of the
14714         structure (we know the approximate location anyways).
14715
14716         Test if the argument is a variable-reference, if not, then
14717         complain with a 206.
14718
14719         (Argument.Emit): Emit addresses of variables.
14720
14721         (Argument.FullDesc): Simplify.
14722
14723         (Invocation.DoResolve): Update for Argument.Resolve.
14724
14725         (ElementAccess.DoResolve): ditto.
14726
14727         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14728         method should be virtual, as this method is always virtual.
14729
14730         (NewDelegate.DoResolve): Update for Argument.Resolve.
14731
14732         * class.cs (ConstructorInitializer.DoResolve): ditto.
14733
14734         * attribute.cs (Attribute.Resolve): ditto.
14735
14736 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14737
14738         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14739
14740         * expression.cs (ParameterReference): Drop IStackStorage and implement
14741         IAssignMethod instead. 
14742
14743         (LocalVariableReference): ditto.
14744
14745         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14746         IAssignMethod instead. 
14747
14748 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14749
14750         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14751         enumerations that are used in heavily used structures derive from
14752         byte in a laughable and pathetic attempt to reduce memory usage.
14753         This is the kind of pre-optimzations that you should not do at
14754         home without adult supervision.
14755
14756         * expression.cs (UnaryMutator): New class, used to handle ++ and
14757         -- separatedly from the other unary operators.  Cleans up the
14758         code, and kills the ExpressionStatement dependency in Unary.
14759
14760         (Unary): Removed `method' and `Arguments' from this class, making
14761         it smaller, and moving it all to SimpleCall, so I can reuse this
14762         code in other locations and avoid creating a lot of transient data
14763         strucutres when not required.
14764
14765         * cs-parser.jay: Adjust for new changes.
14766
14767 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14768
14769         * enum.cs (Enum.Populate): If there is a failure during
14770         definition, return
14771
14772         * cs-parser.jay (opt_enum_base): we used to catch type errors
14773         here, but this is really incorrect.  The type error should be
14774         catched during semantic analysis.
14775
14776 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14777
14778         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14779         current_local_parameters as expected since I, in my stupidity, had forgotten
14780         to do this :-)
14781
14782         * attribute.cs (GetValidPlaces): Fix stupid bug.
14783
14784         * class.cs (Method::Emit): Perform check on applicability of attributes.
14785
14786         (Constructor::Emit): Ditto.
14787
14788         (Field::Emit): Ditto.
14789
14790         (Field.Location): Store location information.
14791
14792         (Property, Event, Indexer, Operator): Ditto.
14793
14794         * cs-parser.jay (field_declaration): Pass in location for each field.
14795
14796         * ../errors/cs0592.cs : Add.
14797
14798 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14799
14800         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14801
14802         (InitCoreTypes): Update accordingly.
14803
14804         (RegisterAttrType, LookupAttr): Implement.
14805
14806         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14807         info about the same.
14808
14809         (Resolve): Update to populate the above as necessary.
14810
14811         (Error592): Helper.
14812
14813         (GetValidPlaces): Helper to the above.
14814
14815         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14816
14817         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14818
14819 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14820
14821         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14822
14823         * ../errors/cs0617.cs : Add.
14824
14825 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14826
14827         * enum.cs (Emit): Rename to Populate to be more consistent with what
14828         we expect it to do and when exactly it is called.
14829
14830         * class.cs, rootcontext.cs : Update accordingly.
14831
14832         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14833         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14834
14835         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14836
14837         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14838         of a fieldinfo using the above, when dealing with a FieldBuilder.
14839
14840 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14841
14842         * ../errors/cs0031.cs : Add.
14843
14844         * ../errors/cs1008.cs : Add.
14845
14846         * ../errrors/cs0543.cs : Add.
14847
14848         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14849         enum type.
14850
14851         (FindMembers): Implement.
14852
14853         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14854         enums and delegates too.
14855
14856         (enum_types): Rename to builder_to_enum.
14857
14858         (delegate_types): Rename to builder_to_delegate.
14859
14860         * delegate.cs (FindMembers): Implement.
14861
14862 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14863
14864         * typemanager.cs (IsEnumType): Implement.
14865
14866         * enum.cs (Emit): Re-write parts to account for the underlying type
14867         better and perform checking etc.
14868
14869         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14870         of the underlying type.
14871
14872         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14873         value
14874
14875         * enum.cs (error31): Helper to report error #31.
14876
14877         * cs-parser.jay (enum_declaration): Store location of each member too.
14878
14879         * enum.cs (member_to_location): New hashtable. 
14880
14881         (AddEnumMember): Update location hashtable.
14882
14883         (Emit): Use the location of each member while reporting errors.
14884
14885 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14886
14887         * cs-parser.jay: A for_initializer if is a
14888         local_variable_declaration really ammount to have an implicit
14889         block with the variable declaration and no initializer for for.
14890
14891         * statement.cs (For.Emit): Cope with null initializers.
14892
14893         This fixes the infinite loop on for initializers.
14894
14895 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14896
14897         * enum.cs: More cleanup.
14898
14899         * ecore.cs: Remove dead code.
14900
14901         * class.cs (Property.Emit): More simplification.
14902         (Event.Emit): ditto.
14903
14904         Reworked to have less levels of indentation.
14905
14906 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14907
14908         * class.cs (Property): Emit attributes.
14909
14910         (Field): Ditto.
14911
14912         (Event): Ditto.
14913
14914         (Indexer): Ditto.
14915
14916         (Operator): Ditto.
14917
14918         * enum.cs (Emit): Ditto.
14919
14920         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14921         Enums too.
14922
14923         * class.cs (Field, Event, etc.): Move attribute generation into the
14924         Emit method everywhere.
14925
14926         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14927         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14928         as we had no way of defining nested enums !
14929
14930         * rootcontext.cs : Adjust code accordingly.
14931
14932         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14933
14934 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14935
14936         * expression.cs (EvalConstantExpression): Move into ecore.cs
14937
14938         * enum.cs (Enum): Rename some members and make them public and readonly
14939         according to our convention.
14940
14941         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14942         nothing else.
14943
14944         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14945
14946         (Enum::Emit): Write a simple version for now which doesn't try to compute
14947         expressions. I shall modify this to be more robust in just a while.
14948
14949         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14950
14951         (TypeContainer::CloseType): Create the Enum types too.
14952
14953         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14954
14955         * expression.cs (EvalConstantExpression): Get rid of completely.
14956
14957         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14958         user-defined values and other cases.
14959
14960         (IsValidEnumLiteral): Helper function.
14961
14962         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14963         out there in the case we had a literal FieldExpr.
14964
14965         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14966
14967         (Literalize): Revamp a bit to take two arguments.
14968
14969         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14970
14971 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14972
14973         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14974
14975         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14976
14977         (Resolve): Use the above to ensure we have proper initializers.
14978
14979 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14980
14981         * expression.cs (Expression::EvalConstantExpression): New method to 
14982         evaluate constant expressions.
14983
14984         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14985
14986 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14987
14988         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14989         in an array.
14990
14991         (Binary.ResolveOperator): Handle operator != (object a, object b)
14992         and operator == (object a, object b);
14993
14994         (Binary.DoNumericPromotions): Indicate whether the numeric
14995         promotion was possible.
14996
14997         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14998         Implement.  
14999
15000         Made the ArrayAccess implement interface IAssignMethod instead of
15001         IStackStore as the order in which arguments are passed reflects
15002         this.
15003
15004         * assign.cs: Instead of using expr.ExprClass to select the way of
15005         assinging, probe for the IStackStore/IAssignMethod interfaces.
15006
15007         * typemanager.cs: Load InitializeArray definition.
15008
15009         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15010         static data that can be used to initialize arrays. 
15011
15012 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15013
15014         * expression.cs: Handle operator== and operator!= for booleans.
15015
15016         (Conditioal.Reduce): Implement reducer for the ?: operator.
15017
15018         (Conditional.Resolve): Implement dead code elimination.
15019
15020         (Binary.Resolve): Catch string literals and return a new
15021         concatenated string.
15022
15023         (Unary.Reduce): Implement reduction of unary expressions.
15024
15025         * ecore.cs: Split out the expression core handling here.
15026
15027         (Expression.Reduce): New method used to perform constant folding
15028         and CSE.  This is needed to support constant-expressions. 
15029
15030         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15031         targets, and optimize for !x.
15032
15033 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15034
15035         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15036         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15037         set custom atttributes.
15038
15039         * literal.cs (Literal::GetValue): New abstract method to return the actual
15040         value of the literal, cast as an object.
15041
15042         (*Literal): Implement GetValue method.
15043
15044         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15045         expressions to the arraylist but objects of type Argument.
15046
15047         * class.cs (TypeContainer::Emit): Emit our attributes too.
15048
15049         (Method::Emit, Constructor::Emit): Ditto.
15050
15051         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15052         to be ignoring earlier.
15053
15054 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15055
15056         * attribute.cs (AttributeSection::Define): Implement to do the business
15057         of constructing a CustomAttributeBuilder.
15058
15059         (Attribute): New trivial class. Increases readability of code.  
15060
15061         * cs-parser.jay : Update accordingly.
15062
15063         (positional_argument_list, named_argument_list, named_argument): New rules
15064
15065         (attribute_arguments): Use the above so that we are more correct.
15066
15067 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15068
15069         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15070         to perform all checks for a method with a params parameter.
15071
15072         (Invocation::OverloadResolve): Update to use the above method and therefore
15073         cope correctly with params method invocations.
15074
15075         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15076         params too.
15077
15078         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15079         constructors in our parent too because we can't afford to miss out on 
15080         protected ones ;-)
15081
15082         * attribute.cs (AttributeSection): New name for the class Attribute
15083
15084         Other trivial changes to improve readability.
15085
15086         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15087         use the new class names.
15088
15089 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15090
15091         * class.cs (Method::Define): Complete definition for params types too
15092
15093         (Indexer::Define): Ditto.
15094
15095         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15096         Cope everywhere with a request for info about the array parameter.
15097
15098 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15099
15100         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15101
15102         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15103         local_variable_type to extract the string corresponding to the type.
15104
15105         (local_variable_type): Fixup the action to use the new helper method.
15106
15107         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15108         go.
15109
15110         * expression.cs : Clean out code which uses the above.
15111
15112 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15113
15114         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15115         and bale out if necessary by returning a false.
15116
15117         (RegisterProperty): Ditto.
15118
15119         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15120         and print out appropriate error messages.
15121
15122         * interface.cs (everywhere): Ditto.
15123
15124         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15125         location to constructor.
15126
15127         * class.cs (Property, Event, Indexer): Update accordingly.
15128
15129         * ../errors/cs111.cs : Added.
15130
15131         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15132         of a method, as laid down by the spec.
15133
15134         (Invocation::OverloadResolve): Use the above method.
15135
15136 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15137
15138         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15139         now take a TypeContainer and a Parameters object.
15140
15141         (ParameterData): Modify return type of ParameterModifier method to be 
15142         Parameter.Modifier and not a string.
15143
15144         (ReflectionParameters, InternalParameters): Update accordingly.
15145
15146         * expression.cs (Argument::GetParameterModifier): Same here.
15147
15148         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15149         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15150         symbol in it at all so maybe this is only for now.
15151
15152 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15153
15154         * support.cs (InternalParameters): Constructor now takes an extra argument 
15155         which is the actual Parameters class.
15156
15157         (ParameterDesc): Update to provide info on ref/out modifiers.
15158
15159         * class.cs (everywhere): Update call to InternalParameters to pass in
15160         the second argument too.
15161
15162         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15163         to return the modifier info [ref/out etc]
15164
15165         (InternalParameters, ReflectionParameters): Implement the above.
15166
15167         * expression.cs (Argument::ParameterModifier): Similar function to return
15168         info about the argument's modifiers.
15169
15170         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15171         too.
15172
15173         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15174         a new SetFormalParameters object which we pass to InternalParameters.
15175
15176 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15177
15178         * expression.cs (NewArray): Merge into the ArrayCreation class.
15179
15180 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15181
15182         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15183         NewUserdefinedArray into one as there wasn't much of a use in having
15184         two separate ones.
15185
15186         * expression.cs (Argument): Change field's name to ArgType from Type.
15187
15188         (Type): New readonly property which returns the proper type, taking into 
15189         account ref/out modifiers.
15190
15191         (everywhere): Adjust code accordingly for the above.
15192
15193         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15194         whether we are emitting for a ref or out parameter.
15195
15196         * expression.cs (Argument::Emit): Use the above field to set the state.
15197
15198         (LocalVariableReference::Emit): Update to honour the flag and emit the
15199         right stuff.
15200
15201         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15202
15203         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15204
15205         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15206
15207         (ReflectionParameters, InternalParameters): Implement the above method.
15208
15209         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15210         reporting errors.
15211
15212         (Invocation::FullMethodDesc): Ditto. 
15213
15214 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15215
15216         * cs-parser.jay: Add extra production for the second form of array
15217         creation. 
15218
15219         * expression.cs (ArrayCreation): Update to reflect the above
15220         change. 
15221
15222         * Small changes to prepare for Array initialization.
15223
15224 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15225
15226         * typemanager.cs (ImplementsInterface): interface might be null;
15227         Deal with this problem;
15228
15229         Also, we do store negative hits on the cache (null values), so use
15230         this instead of calling t.GetInterfaces on the type everytime.
15231
15232 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15233
15234         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15235
15236         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15237         split functionality out into different classes.
15238
15239         (New::FormArrayType): Move into NewBuiltinArray.
15240
15241         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15242         quite useless.
15243
15244         (NewBuiltinArray): New class to handle creation of built-in arrays.
15245
15246         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15247         account creation of one-dimensional arrays.
15248
15249         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15250
15251         (NewUserdefinedArray::DoResolve): Implement.
15252
15253         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15254
15255         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15256         we maintain inside the TypeManager. This is necessary to perform lookups on the
15257         module builder.
15258
15259         (LookupType): Update to perform GetType on the module builders too.     
15260
15261         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15262
15263         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15264
15265 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15266
15267         * expression.cs (New::DoResolve): Implement guts of array creation.
15268
15269         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15270
15271 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15272
15273         * expression.cs: Fix bug I introduced lsat night that broke
15274         Delegates. 
15275
15276         (Expression.Resolve): Report a 246 error (can not resolve name)
15277         if we find a SimpleName in the stream.
15278
15279         (Expression.ResolveLValue): Ditto.
15280
15281         (Expression.ResolveWithSimpleName): This function is a variant of
15282         ResolveName, this one allows SimpleNames to be returned without a
15283         warning.  The only consumer of SimpleNames is MemberAccess
15284
15285 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15286
15287         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15288         might arrive here.  I have my doubts that this is correct.
15289
15290         * statement.cs (Lock): Implement lock statement.
15291
15292         * cs-parser.jay: Small fixes to support `lock' and `using'
15293
15294         * cs-tokenizer.cs: Remove extra space
15295
15296         * driver.cs: New flag --checked, allows to turn on integer math
15297         checking. 
15298
15299         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15300         Threading.Monitor.Exit 
15301
15302 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15303
15304         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15305         Expression Class to be IndexerAccess.
15306
15307         Notice that Indexer::DoResolve sets the eclass to Value.
15308
15309 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15310
15311         * class.cs (TypeContainer::Emit): Emit code for indexers.
15312
15313         * assign.cs (IAssignMethod): New interface implemented by Indexers
15314         and Properties for handling assignment.
15315
15316         (Assign::Emit): Simplify and reuse code. 
15317
15318         * expression.cs (IndexerAccess, PropertyExpr): Implement
15319         IAssignMethod, clean up old code. 
15320
15321 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15322
15323         * typemanager.cs (ImplementsInterface): New method to determine if a type
15324         implements a given interface. Provides a nice cache too.
15325
15326         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15327         method.
15328
15329         (ConvertReferenceExplicit): Ditto.
15330
15331         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15332         various methods, with correct names etc.
15333
15334         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15335         Operator.UnaryNegation.
15336
15337         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15338         we have a unary plus or minus operator.
15339
15340         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15341         UnaryMinus.
15342
15343         * everywhere : update accordingly.
15344
15345         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15346         respectively.
15347
15348         * class.cs (Method::Define): For the case where we are implementing a method
15349         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15350         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15351
15352 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15353
15354         * interface.cs (FindMembers): Implement to work around S.R.E
15355         lameness.
15356
15357         * typemanager.cs (IsInterfaceType): Implement.
15358
15359         (FindMembers): Update to handle interface types too.
15360
15361         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15362         use IsAssignableFrom as that is not correct - it doesn't work.
15363
15364         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15365         and accordingly override EmitStatement.
15366
15367         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15368         using the correct logic :-)
15369
15370 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15371
15372         * ../errors/cs-11.cs : Add to demonstrate error -11 
15373
15374 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15375
15376         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15377         then pass this as a hint to ResolveLValue.
15378
15379         * expression.cs (FieldExpr): Add Location information
15380
15381         (FieldExpr::LValueResolve): Report assignment to readonly
15382         variable. 
15383
15384         (Expression::ExprClassFromMemberInfo): Pass location information.
15385
15386         (Expression::ResolveLValue): Add new method that resolves an
15387         LValue. 
15388
15389         (Expression::DoResolveLValue): Default invocation calls
15390         DoResolve. 
15391
15392         (Indexers): New class used to keep track of indexers in a given
15393         Type. 
15394
15395         (IStackStore): Renamed from LValue, as it did not really describe
15396         what this did.  Also ResolveLValue is gone from this interface and
15397         now is part of Expression.
15398
15399         (ElementAccess): Depending on the element access type
15400
15401         * typemanager.cs: Add `indexer_name_type' as a Core type
15402         (System.Runtime.CompilerServices.IndexerNameAttribute)
15403
15404         * statement.cs (Goto): Take a location.
15405
15406 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15407
15408         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15409         if two delegates are compatible.
15410
15411         (NewDelegate::DoResolve): Update to take care of the case when
15412         we instantiate a delegate from another delegate.
15413
15414         * typemanager.cs (FindMembers): Don't even try to look up members
15415         of Delegate types for now.
15416
15417 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15418
15419         * delegate.cs (NewDelegate): New class to take care of delegate
15420         instantiation.
15421
15422         * expression.cs (New): Split the delegate related code out into 
15423         the NewDelegate class.
15424
15425         * delegate.cs (DelegateInvocation): New class to handle delegate 
15426         invocation.
15427
15428         * expression.cs (Invocation): Split out delegate related code into
15429         the DelegateInvocation class.
15430
15431 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15432
15433         * expression.cs (New::DoResolve): Implement delegate creation fully
15434         and according to the spec.
15435
15436         (New::DoEmit): Update to handle delegates differently.
15437
15438         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15439         because of which we were printing out arguments in reverse order !
15440
15441         * delegate.cs (VerifyMethod): Implement to check if the given method
15442         matches the delegate.
15443
15444         (FullDelegateDesc): Implement.
15445
15446         (VerifyApplicability): Implement.
15447
15448         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15449         delegate invocations too.
15450
15451         (Invocation::Emit): Ditto.
15452
15453         * ../errors/cs1593.cs : Added.
15454
15455         * ../errors/cs1594.cs : Added.
15456
15457         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15458
15459 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15460
15461         * typemanager.cs (intptr_type): Core type for System.IntPtr
15462
15463         (InitCoreTypes): Update for the same.
15464
15465         (iasyncresult_type, asynccallback_type): Ditto.
15466
15467         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15468         correct.
15469
15470         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15471         too.
15472
15473         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15474         the builders for the 4 members of a delegate type :-)
15475
15476         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15477         type.
15478
15479         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15480
15481         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15482
15483 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15484
15485         * statement.cs (Break::Emit): Implement.   
15486         (Continue::Emit): Implement.
15487
15488         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15489         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15490         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15491         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15492         end loop
15493
15494         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15495         properties that track the label for the current loop (begin of the
15496         loop and end of the loop).
15497
15498 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15499
15500         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15501         use of emitting anything at all.
15502
15503         * class.cs, rootcontext.cs : Get rid of calls to the same.
15504
15505         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15506
15507         (Populate): Define the constructor correctly and set the implementation
15508         attributes.
15509
15510         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15511         have been defined.
15512
15513         (AddDelegateType): Implement.
15514
15515         (IsDelegateType): Implement helper method.
15516
15517         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15518
15519         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15520         and accordingly handle it.
15521
15522         * delegate.cs (Populate): Take TypeContainer argument.
15523         Implement bits to define the Invoke method. However, I still haven't figured out
15524         how to take care of the native int bit :-(
15525
15526         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15527         Qualify the name of the delegate, not its return type !
15528
15529         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15530         conversion.
15531
15532         (StandardConversionExists): Checking for array types turns out to be recursive.
15533
15534         (ConvertReferenceExplicit): Implement array conversion.
15535
15536         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15537
15538 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15539
15540         * cs-parser.jay (delegate_declaration): Store the fully qualified
15541         name as it is a type declaration.
15542
15543         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15544         readonly.
15545
15546         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15547         as TypeContainer::DefineType.
15548
15549         (Populate): Method in which all the definition of the various methods (Invoke)
15550         etc is done.
15551
15552         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15553         see.
15554
15555         (CloseDelegate): Finally creates the delegate.
15556
15557         * class.cs (TypeContainer::DefineType): Update to define delegates.
15558         (Populate, Emit and CloseType): Do the same thing here too.
15559
15560         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15561         delegates in all these operations.
15562
15563 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15564
15565         * expression.cs: LocalTemporary: a new expression used to
15566         reference a temporary that has been created.
15567
15568         * assign.cs: Handle PropertyAccess back here, so that we can
15569         provide the proper semantic access to properties.
15570
15571         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15572         a few more explicit conversions. 
15573
15574         * modifiers.cs: `NEW' modifier maps to HideBySig.
15575
15576         * expression.cs (PropertyExpr): Make this into an
15577         ExpressionStatement, and support the EmitStatement code path. 
15578
15579         Perform get/set error checking, clean up the interface.
15580
15581         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15582         them into toplevel access objects.
15583
15584 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15585
15586         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15587         SRE.
15588
15589         * typemanager.cs: Keep track here of our PropertyBuilders again to
15590         work around lameness in SRE.
15591
15592 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15593
15594         * expression.cs (LValue::LValueResolve): New method in the
15595         interface, used to perform a second resolution pass for LValues. 
15596
15597         (This::DoResolve): Catch the use of this in static methods.
15598
15599         (This::LValueResolve): Implement.
15600
15601         (This::Store): Remove warning, assigning to `this' in structures
15602         is 
15603
15604         (Invocation::Emit): Deal with invocation of
15605         methods on value types.  We need to pass the address to structure
15606         methods rather than the object itself.  (The equivalent code to
15607         emit "this" for structures leaves the entire structure on the
15608         stack instead of a pointer to it). 
15609
15610         (ParameterReference::DoResolve): Compute the real index for the
15611         argument based on whether the method takes or not a `this' pointer
15612         (ie, the method is static).
15613
15614         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15615         value types returned from functions when we need to invoke a
15616         method on the sturcture.
15617
15618
15619 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15620
15621         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15622         defining the type in the Modulebuilder or Typebuilder. This is to take
15623         care of nested types which need to be defined on the TypeBuilder using
15624         DefineNestedMethod.
15625
15626         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15627         methods in RootContext, only ported to be part of TypeContainer.
15628
15629         (TypeContainer::GetInterfaceOrClass): Ditto.
15630
15631         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15632
15633         * interface.cs (Interface::DefineInterface): New method. Does exactly
15634         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15635         too.
15636
15637         (Interface::GetInterfaces): Move from RootContext here and port.
15638
15639         (Interface::GetInterfaceByName): Same here.
15640
15641         * rootcontext.cs (ResolveTree): Re-write.
15642
15643         (PopulateTypes): Re-write.
15644
15645         * class.cs (TypeContainer::Populate): Populate nested types too.
15646         (TypeContainer::Emit): Emit nested members too.
15647
15648         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15649         instead just use the name argument passed in as it is already fully
15650         qualified.
15651
15652         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15653         to TypeContainer mapping to see if a type is user-defined.
15654
15655         * class.cs (TypeContainer::CloseType): Implement. 
15656
15657         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15658         the default constructor.
15659
15660         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15661         twice.
15662
15663         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15664
15665         * interface.cs (CloseType): Create the type here.
15666
15667         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15668         the hierarchy.
15669
15670         Remove all the methods which are now in TypeContainer.
15671
15672 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15673
15674         * delegate.cs (Define): Re-write bits to define the delegate
15675         correctly.
15676
15677 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15678
15679         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15680
15681         * expression.cs (ImplicitReferenceConversion): handle null as well
15682         as a source to convert to any reference type.
15683
15684         * statement.cs (Return): Perform any implicit conversions to
15685         expected return type.  
15686
15687         Validate use of return statement.  
15688
15689         * codegen.cs (EmitContext): Pass the expected return type here.
15690
15691         * class.cs (Method, Constructor, Property): Pass expected return
15692         type to EmitContext.
15693
15694 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15695
15696         * expression.cs: Make DoResolve take an EmitContext instead of a
15697         TypeContainer.
15698
15699         Replaced `l' and `location' for `loc', for consistency.
15700
15701         (Error, Warning): Remove unneeded Tc argument.
15702
15703         * assign.cs, literal.cs, constant.cs: Update to new calling
15704         convention. 
15705
15706         * codegen.cs: EmitContext now contains a flag indicating whether
15707         code is being generated in a static method or not.
15708
15709         * cs-parser.jay: DecomposeQI, new function that replaces the old
15710         QualifiedIdentifier.  Now we always decompose the assembled
15711         strings from qualified_identifier productions into a group of
15712         memberaccesses.
15713
15714 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15715
15716         * rootcontext.cs: Deal with field-less struct types correctly now
15717         by passing the size option to Define Type.
15718
15719         * class.cs: Removed hack that created one static field. 
15720
15721 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15722
15723         * statement.cs: Moved most of the code generation here. 
15724
15725 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15726
15727         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15728         seem very right.
15729
15730         (ElementAccess): Remove useless bits for now - keep checks as the spec
15731         says.
15732
15733 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15734
15735         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15736         and start performing checks according to the spec.
15737
15738 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15739
15740         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15741         rank_specifiers instead.
15742
15743         (rank_specifiers): Change the order in which the rank specifiers are stored
15744
15745         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15746
15747         * expression.cs (ElementAccess): Implement the LValue interface too.
15748
15749 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15750
15751         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15752         except that user defined conversions are not included.
15753
15754         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15755         perform the conversion of the return type, if necessary.
15756
15757         (New::DoResolve): Check whether we are creating an array or an object
15758         and accordingly do the needful.
15759
15760         (New::Emit): Same here.
15761
15762         (New::DoResolve): Implement guts of array creation.
15763
15764         (New::FormLookupType): Helper function.
15765
15766 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15767
15768         * codegen.cs: Removed most of the code generation here, and move the
15769         corresponding code generation bits to the statement classes. 
15770
15771         Added support for try/catch/finalize and throw.
15772
15773         * cs-parser.jay: Added support for try/catch/finalize.
15774
15775         * class.cs: Catch static methods having the flags override,
15776         virtual or abstract.
15777
15778         * expression.cs (UserCast): This user cast was not really doing
15779         what it was supposed to do.  Which is to be born in fully resolved
15780         state.  Parts of the resolution were being performed at Emit time! 
15781
15782         Fixed this code.
15783
15784 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15785
15786         * expression.cs: Implicity convert the result from UserCast.
15787
15788 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15789
15790         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15791         prevented it from working correctly. 
15792
15793         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15794         merely ConvertImplicit.
15795
15796 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15797
15798         * typemanager.cs: Make the LookupTypeContainer function static,
15799         and not per-instance.  
15800
15801         * class.cs: Make static FindMembers (the one that takes a Type
15802         argument). 
15803
15804         * codegen.cs: Add EmitForeach here.
15805
15806         * cs-parser.jay: Make foreach a toplevel object instead of the
15807         inline expansion, as we need to perform semantic analysis on it. 
15808
15809 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15810
15811         * expression.cs (Expression::ImplicitUserConversion): Rename to
15812         UserDefinedConversion.
15813
15814         (Expression::UserDefinedConversion): Take an extra argument specifying 
15815         whether we look for explicit user conversions too.
15816
15817         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15818
15819         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15820
15821         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15822         with the appropriate arguments.
15823
15824         * cs-parser.jay (cast_expression): Record location too.
15825
15826         * expression.cs (Cast): Record location info.
15827
15828         (Expression::ConvertExplicit): Take location argument.
15829
15830         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15831         to determine if we are doing explicit conversions.
15832
15833         (UserCast::Emit): Update accordingly.
15834
15835         (Expression::ConvertExplicit): Report an error if everything fails.
15836
15837         * ../errors/cs0030.cs : Add.
15838
15839 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15840
15841         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15842         virtual and newslot bits. 
15843
15844         * class.cs (TypeContainer::RegisterRequiredImplementations):
15845         Record methods we need.
15846
15847         (TypeContainer::MakeKey): Helper function to make keys for
15848         MethodBases, since the Methodbase key is useless.
15849
15850         (TypeContainer::Populate): Call RegisterRequiredImplementations
15851         before defining the methods.   
15852
15853         Create a mapping for method_builders_to_methods ahead of time
15854         instead of inside a tight loop.
15855
15856         (::RequireMethods):  Accept an object as the data to set into the
15857         hashtable so we can report interface vs abstract method mismatch.
15858
15859 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15860
15861         * report.cs: Make all of it static.
15862
15863         * rootcontext.cs: Drop object_type and value_type computations, as
15864         we have those in the TypeManager anyways.
15865
15866         Drop report instance variable too, now it is a global.
15867
15868         * driver.cs: Use try/catch on command line handling.
15869
15870         Add --probe option to debug the error reporting system with a test
15871         suite. 
15872
15873         * report.cs: Add support for exiting program when a probe
15874         condition is reached.
15875
15876 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15877
15878         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15879         we do a forcible conversion regardless of type, to check if 
15880         ForceConversion returns a null.
15881
15882         (Binary::error19): Use location to report error.
15883
15884         (Unary::error23): Use location here too.
15885
15886         * ../errors/cs0019.cs : Check in.
15887
15888         * ../errors/cs0023.cs : Check in.
15889
15890         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15891         case of a non-null MethodInfo object with a length of 0 !
15892
15893         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15894         an applicable member - according to the spec :-)
15895         Also fix logic to find members in base types.
15896
15897         (Unary::ResolveOperator): Same here.
15898
15899         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15900         as I was getting thoroughly confused between this and error19 :-)
15901
15902         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15903         (::FindMostEncompassedType): Implement.
15904         (::FindMostEncompassingType): Implement.
15905         (::StandardConversionExists): Implement.
15906
15907         (UserImplicitCast): Re-vamp. We now need info about most specific
15908         source and target types so that we can do the necessary conversions.
15909
15910         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15911         mathematical union with no duplicates.
15912
15913 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15914
15915         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15916         in order from base classes to child classes, so that we can in
15917         child classes look up in our parent for method names and
15918         attributes (required for handling abstract, virtual, new, override
15919         constructs: we need to instrospect our base class, and if we dont
15920         populate the classes in order, the introspection might be
15921         incorrect.  For example, a method could query its parent before
15922         the parent has any methods and would determine that the parent has
15923         no abstract methods (while it could have had them)).
15924
15925         (RootContext::CreateType): Record the order in which we define the
15926         classes.
15927
15928 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15929
15930         * class.cs (TypeContainer::Populate): Also method definitions can
15931         fail now, keep track of this.
15932
15933         (TypeContainer::FindMembers): Implement support for
15934         DeclaredOnly/noDeclaredOnly flag.
15935
15936         (Constructor::Emit) Return the ConstructorBuilder.
15937
15938         (Method::Emit) Return the MethodBuilder. 
15939         Check for abstract or virtual methods to be public.
15940
15941         * rootcontext.cs (RootContext::CreateType): Register all the
15942         abstract methods required for the class to be complete and the
15943         interface methods that must be implemented. 
15944
15945         * cs-parser.jay: Report error 501 (method requires body if it is
15946         not marked abstract or extern).
15947
15948         * expression.cs (TypeOf::Emit): Implement.
15949
15950         * typemanager.cs: runtime_handle_type, new global type.
15951
15952         * class.cs (Property::Emit): Generate code for properties.
15953
15954 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15955
15956         * expression.cs (Unary::ResolveOperator): Find operators on base type
15957         too - we now conform exactly to the spec.
15958
15959         (Binary::ResolveOperator): Same here.
15960
15961         * class.cs (Operator::Define): Fix minor quirk in the tests.
15962
15963         * ../errors/cs0215.cs : Added.
15964
15965         * ../errors/cs0556.cs : Added.
15966
15967         * ../errors/cs0555.cs : Added.
15968
15969 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15970
15971         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15972         single integer which is really efficient
15973
15974 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15975
15976         *  expression.cs (Expression::ImplicitUserConversion): Use location
15977         even in the case when we are examining True operators.
15978  
15979         * class.cs (Operator::Define): Perform extensive checks to conform
15980         with the rules for operator overloading in the spec.
15981
15982         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15983         some of the other conversions mentioned in the spec.
15984
15985         * typemanager.cs (array_type): New static member for the System.Array built-in
15986         type.
15987
15988         (cloneable_interface): For System.ICloneable interface.
15989
15990         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15991         we start resolving the tree and populating types.
15992
15993         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15994  
15995 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15996
15997         * expression.cs (Expression::ExprClassFromMemberInfo,
15998         Expression::Literalize): Create literal expressions from
15999         FieldInfos which are literals.
16000
16001         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16002         type casts, because they were wrong.  The test suite in tests
16003         caught these ones.
16004
16005         (ImplicitNumericConversion): ushort to ulong requires a widening
16006         cast. 
16007
16008         Int32 constant to long requires widening cast as well.
16009
16010         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16011         for integers because the type on the stack is not i4.
16012
16013 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16014
16015         * expression.cs (report118): require location argument. 
16016
16017         * parameter.cs: Do not dereference potential null value.
16018
16019         * class.cs: Catch methods that lack the `new' keyword when
16020         overriding a name.  Report warnings when `new' is used without
16021         anything being there to override.
16022
16023         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16024
16025         * class.cs: Only add constructor to hashtable if it is non-null
16026         (as now constructors can fail on define).
16027
16028         (TypeManager, Class, Struct): Take location arguments.
16029
16030         Catch field instance initialization in structs as errors.
16031
16032         accepting_filter: a new filter for FindMembers that is static so
16033         that we dont create an instance per invocation.
16034
16035         (Constructor::Define): Catch errors where a struct constructor is
16036         parameterless 
16037
16038         * cs-parser.jay: Pass location information for various new
16039         constructs. 
16040
16041         * delegate.cs (Delegate): take a location argument.
16042
16043         * driver.cs: Do not call EmitCode if there were problesm in the
16044         Definition of the types, as many Builders wont be there. 
16045
16046         * decl.cs (Decl::Decl): Require a location argument.
16047
16048         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16049         into integers, and find the most appropiate integer for it.
16050
16051         * literal.cs: Implement ULongLiteral.
16052
16053         * rootcontext.cs: Provide better information about the location of
16054         failure when CreateType fails.
16055
16056 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16057
16058         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16059         as well.
16060
16061         * expression.cs (Binary::CheckShiftArguments): Add missing type
16062         computation.
16063         (Binary::ResolveOperator): Add type to the logical and and logical
16064         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16065         before.
16066
16067         (Binary::DoNumericPromotions): In the case where either argument
16068         is ulong (and most signed types combined with ulong cause an
16069         error) perform implicit integer constant conversions as well.
16070
16071 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16072
16073         * expression.cs (UserImplicitCast): Method should always be
16074         non-null. 
16075         (Invocation::BetterConversion): Simplified test for IntLiteral.
16076
16077         (Expression::ImplicitNumericConversion): Split this routine out.
16078         Put the code that performs implicit constant integer conversions
16079         here. 
16080
16081         (Expression::Resolve): Become a wrapper around DoResolve so we can
16082         check eclass and type being set after resolve.
16083
16084         (Invocation::Badness): Remove this dead function
16085
16086         (Binary::ResolveOperator): Do not compute the expensive argumnets
16087         unless we have a union for it.
16088
16089         (Probe::Emit): Is needs to do an isinst and then
16090         compare against null.
16091
16092         (::CanConvert): Added Location argument.  If the Location argument
16093         is null (Location.Null), then we do not report errors.  This is
16094         used by the `probe' mechanism of the Explicit conversion.  We do
16095         not want to generate an error for something that the user
16096         explicitly requested to be casted.  But the pipeline for an
16097         explicit cast first tests for potential implicit casts.
16098
16099         So for now, if the Location is null, it means `Probe only' to
16100         avoid adding another argument.   Might have to revise this
16101         strategy later.
16102
16103         (ClassCast): New class used to type cast objects into arbitrary
16104         classes (used in Explicit Reference Conversions).
16105
16106         Implement `as' as well.
16107
16108         Reverted all the patches from Ravi below: they were broken:
16109
16110                 * The use of `level' as a mechanism to stop recursive
16111                   invocations is wrong.  That was there just to catch the
16112                   bug with a strack trace but not as a way of addressing
16113                   the problem.
16114
16115                   To fix the problem we have to *understand* what is going
16116                   on and the interactions and come up with a plan, not
16117                   just get things going.
16118
16119                 * The use of the type conversion cache that I proposed
16120                   last night had an open topic: How does this work across
16121                   protection domains.  A user defined conversion might not
16122                   be public in the location where we are applying the
16123                   conversion, a different conversion might be selected
16124                   (ie, private A->B (better) but public B->A (worse),
16125                   inside A, A->B applies, but outside it, B->A will
16126                   apply).
16127
16128                 * On top of that (ie, even if the above is solved),
16129                   conversions in a cache need to be abstract.  Ie, `To
16130                   convert from an Int to a Short use an OpcodeCast', not
16131                   `To convert from an Int to a Short use the OpcodeCast on
16132                   the variable 5' (which is what this patch was doing).
16133
16134 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16135
16136         * expression.cs (Invocation::ConversionExists): Re-write to use
16137         the conversion cache
16138
16139         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16140         cache all conversions done, not just user-defined ones.
16141
16142         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16143         to determine if a conversion exists instead of acutually trying to 
16144         perform the conversion. It's faster too.
16145
16146         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16147         and only then attempt the implicit conversion.
16148
16149 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16150
16151         * expression.cs (ConvertImplicit): Use a cache for conversions
16152         already found. Check level of recursion and bail out if necessary.
16153
16154 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16155
16156         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16157         Export standard methods that we expect for string operations.
16158
16159         * statement.cs (Block::UsageWarning): Track usage of variables and
16160         report the errors for not used variables.
16161
16162         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16163         operator. 
16164
16165 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16166
16167         * codegen.cs: remove unnneded code 
16168
16169         * expression.cs: Removed BuiltinTypeAccess class
16170
16171         Fix the order in which implicit conversions are
16172         done.  
16173
16174         The previous fixed dropped support for boxed conversions (adding a
16175         test to the test suite now)
16176
16177         (UserImplicitCast::CanConvert): Remove test for source being null,
16178         that code is broken.  We should not feed a null to begin with, if
16179         we do, then we should track the bug where the problem originates
16180         and not try to cover it up here.
16181
16182         Return a resolved expression of type UserImplicitCast on success
16183         rather than true/false.  Ravi: this is what I was talking about,
16184         the pattern is to use a static method as a "constructor" for
16185         objects. 
16186
16187         Also, do not create arguments until the very last minute,
16188         otherwise we always create the arguments even for lookups that
16189         will never be performed. 
16190
16191         (UserImplicitCast::Resolve): Eliminate, objects of type
16192         UserImplicitCast are born in a fully resolved state. 
16193
16194         * typemanager.cs (InitCoreTypes): Init also value_type
16195         (System.ValueType). 
16196
16197         * expression.cs (Cast::Resolve): First resolve the child expression.
16198
16199         (LValue): Add new method AddressOf to be used by
16200         the `&' operator.  
16201
16202         Change the argument of Store to take an EmitContext instead of an
16203         ILGenerator, because things like FieldExpr need to be able to call
16204         their children expression to generate the instance code. 
16205
16206         (Expression::Error, Expression::Warning): Sugar functions for
16207         reporting errors.
16208
16209         (Expression::MemberLookup): Accept a TypeContainer instead of a
16210         Report as the first argument.
16211
16212         (Expression::ResolvePrimary): Killed.  I still want to improve
16213         this as currently the code is just not right.
16214
16215         (Expression::ResolveMemberAccess): Simplify, but it is still
16216         wrong. 
16217
16218         (Unary::Resolve): Catch errors in AddressOf operators.
16219
16220         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16221         index to a byte for the short-version, or the compiler will choose
16222         the wrong Emit call, which generates the wrong data.
16223
16224         (ParameterReference::Emit, ::Store): same.
16225
16226         (FieldExpr::AddressOf): Implement.
16227
16228         * typemanager.cs: TypeManager: made public variable instead of
16229         property.
16230
16231         * driver.cs: document --fatal.
16232
16233         * report.cs (ErrorMessage, WarningMessage): new names for the old
16234         Error and Warning classes.
16235
16236         * cs-parser.jay (member_access): Turn built-in access to types
16237         into a normal simplename
16238
16239 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16240
16241         * expression.cs (Invocation::BetterConversion): Fix to cope
16242         with q being null, since this was introducing a bug.
16243
16244         * expression.cs (ConvertImplicit): Do built-in conversions first.
16245
16246 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16247
16248         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16249
16250 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16251
16252         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16253         I had introduced long ago (what's new ?).
16254
16255         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16256         the work of all the checking. 
16257         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16258         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16259
16260         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16261         that is the right way. 
16262
16263         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16264         overloading resolution. Use everywhere instead of cutting and pasting code.
16265
16266         (Binary::ResolveOperator): Use MakeUnionSet.
16267
16268         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16269         we have to convert to bool types. Not complete yet.
16270
16271 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16272
16273         * typemanager.cs (TypeManager::CSharpName): support ushort.
16274
16275         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16276         to provide an expression that performsn an implicit constant int
16277         conversion (section 6.1.6).
16278         (Expression::ConvertImplicitRequired): Reworked to include
16279         implicit constant expression conversions.
16280
16281         (Expression::ConvertNumericExplicit): Finished.
16282
16283         (Invocation::Emit): If InstanceExpression is null, then it means
16284         that we perform a call on this.
16285
16286 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16287
16288         * expression.cs (Unary::Emit): Remove some dead code.
16289         (Probe): Implement Resolve and Emit for `is'.
16290         (Expression::ConvertImplicitRequired): Attempt to do constant
16291         expression conversions here.  Maybe should be moved to
16292         ConvertImplicit, but I am not sure.
16293         (Expression::ImplicitLongConstantConversionPossible,
16294         Expression::ImplicitIntConstantConversionPossible): New functions
16295         that tell whether is it possible to apply an implicit constant
16296         expression conversion.
16297
16298         (ConvertNumericExplicit): Started work on explicit numeric
16299         conversions.
16300
16301         * cs-parser.jay: Update operator constants.
16302
16303         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16304         (Parameters::GetSignature): Hook up VerifyArgs here.
16305         (Parameters::VerifyArgs): Verifies that no two arguments have the
16306         same name. 
16307
16308         * class.cs (Operator): Update the operator names to reflect the
16309         ones that the spec expects (as we are just stringizing the
16310         operator names).
16311
16312         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16313         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16314         previous usage did only work for our methods.
16315         (Expression::ConvertImplicit): Handle decimal implicit numeric
16316         conversions as well.
16317         (Expression::InternalTypeConstructor): Used to invoke constructors
16318         on internal types for default promotions.
16319
16320         (Unary::Emit): Implement special handling for the pre/post
16321         increment/decrement for overloaded operators, as they need to have
16322         the same semantics as the other operators.
16323
16324         (Binary::ResolveOperator): ditto.
16325         (Invocation::ConversionExists): ditto.
16326         (UserImplicitCast::Resolve): ditto.
16327
16328 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16329
16330         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16331         operator, return after emitting body. Regression tests pass again !
16332
16333         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16334         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16335         (Invocation::OverloadResolve): Ditto.
16336         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16337
16338         * everywhere : update calls to the above methods accordingly.
16339
16340 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16341
16342         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16343
16344         * expression.cs (ExpressionStatement): New base class used for
16345         expressions that can appear in statements, so that we can provide
16346         an alternate path to generate expression that do not leave a value
16347         on the stack.
16348
16349         (Expression::Emit, and all the derivatives): We no longer return
16350         whether a value is left on the stack or not.  Every expression
16351         after being emitted leaves a single value on the stack.
16352
16353         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16354         facilties of ExpressionStatement if possible.
16355
16356         * cs-parser.jay: Update statement_expression.
16357
16358 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16359
16360         * driver.cs: Change the wording of message
16361
16362 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16363
16364         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16365         the type of the expression to the return type of the method if
16366         we have an overloaded operator match ! The regression tests pass again !
16367         (Unary::ResolveOperator): Ditto.
16368
16369         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16370         to find "op_Implicit", not "implicit" ;-)
16371         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16372         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16373
16374         * everywhere : Correct calls to the above accordingly.
16375
16376         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16377         (ConvertImplicit): Do user-defined conversion if it exists.
16378
16379 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16380
16381         * assign.cs: track location.
16382         (Resolve): Use implicit conversions on assignment.
16383
16384         * literal.cs: Oops.  Not good, Emit of short access values should
16385         pass (Bytes) or the wrong argument will be selected.
16386
16387         * expression.cs (Unary::Emit): Emit code for -expr.
16388
16389         (Unary::ResolveOperator): Handle `Substract' for non-constants
16390         (substract from zero from the non-constants).
16391         Deal with Doubles as well. 
16392
16393         (Expression::ConvertImplicitRequired): New routine that reports an
16394         error if no implicit conversion exists. 
16395
16396         (Invocation::OverloadResolve): Store the converted implicit
16397         expressions if we make them
16398
16399 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16400
16401         * class.cs (ConstructorInitializer): Take a Location argument.
16402         (ConstructorBaseInitializer): Same here.
16403         (ConstructorThisInitializer): Same here.
16404
16405         * cs-parser.jay : Update all calls accordingly.
16406
16407         * expression.cs (Unary, Binary, New): Take location argument.
16408         Update accordingly everywhere.
16409
16410         * cs-parser.jay : Update all calls to the above to take a location
16411         argument.
16412
16413         * class.cs : Ditto.
16414
16415 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16416
16417         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16418         (Invocation::BetterConversion): Same here
16419         (Invocation::ConversionExists): Ditto.
16420
16421         (Invocation::ConversionExists): Implement.
16422
16423 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16424
16425         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16426         Also take an additional TypeContainer argument.
16427
16428         * All over : Pass in TypeContainer as argument to OverloadResolve.
16429
16430         * typemanager.cs (CSharpName): Update to check for the string type and return
16431         that too.
16432
16433         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16434         a given method.
16435
16436 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16437
16438         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16439         (Invocation::BetterFunction): Implement.
16440         (Invocation::BetterConversion): Implement.
16441         (Invocation::ConversionExists): Skeleton, no implementation yet.
16442
16443         Okay, things work fine !
16444
16445 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16446
16447         * typemanager.cs: declare and load enum_type, delegate_type and
16448         void_type. 
16449
16450         * expression.cs (Expression::Emit): Now emit returns a value that
16451         tells whether a value is left on the stack or not.  This strategy
16452         might be reveted tomorrow with a mechanism that would address
16453         multiple assignments.
16454         (Expression::report118): Utility routine to report mismatches on
16455         the ExprClass.
16456
16457         (Unary::Report23): Report impossible type/operator combination
16458         utility function.
16459
16460         (Unary::IsIncrementableNumber): Whether the type can be
16461         incremented or decremented with add.
16462         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16463         complemented. 
16464         (Unary::ResolveOperator): Implement ++, !, ~,
16465
16466         (Invocation::Emit): Deal with new Emit convetion.
16467
16468         * All Expression derivatives: Updated their Emit method to return
16469         whether they leave values on the stack or not.
16470
16471         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16472         stack for expressions that are statements. 
16473
16474 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16475
16476         * expression.cs (LValue): New interface.  Must be implemented by
16477         LValue objects.
16478         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16479         LValue interface.
16480
16481         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16482         interface for generating code, simplifies the code.
16483
16484 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16485
16486         * expression.cs (everywhere): Comment out return statements in ::Resolve
16487         methods to avoid the warnings.
16488
16489 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16490
16491         * driver.cs (parse): Report error 2001 if we can not open the
16492         source file.
16493
16494         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16495         not resolve it.
16496
16497         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16498         object. 
16499
16500         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16501         otherwise nested blocks end up with the same index.
16502
16503         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16504
16505         * expression.cs:  Instead of having FIXMEs in the Resolve
16506         functions, throw exceptions so it is obvious that we are facing a
16507         bug. 
16508
16509         * cs-parser.jay (invocation_expression): Pass Location information.
16510
16511         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16512         Use a basename for those routines because .NET does not like paths
16513         on them. 
16514
16515         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16516         already defined.
16517
16518 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16519
16520         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16521         are loading the correct data types (throws an exception if not).
16522         (TypeManager::InitCoreTypes): Use CoreLookupType
16523
16524         * expression.cs (Unary::ResolveOperator): return the child
16525         expression for expressions which are just +expr.
16526         (Unary::ResolveOperator): Return negative literals for -LITERAL
16527         expressions (otherwise they are Unary {Literal}).
16528         (Invocation::Badness): Take into account `Implicit constant
16529         expression conversions'.
16530
16531         * literal.cs (LongLiteral): Implement long literal class.
16532         (IntLiteral): export the `Value' of the intliteral. 
16533
16534 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16535
16536         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16537
16538         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16539         instead of 'Operator'
16540
16541         * expression.cs (Binary::ResolveOperator): Update accordingly.
16542         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16543         and 'Minus'
16544
16545         * cs-parser.jay (unary_expression): Update to use the new names.
16546
16547         * gen-treedump.cs (GetUnary): Same here.
16548
16549         * expression.cs (Unary::Resolve): Implement.
16550         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16551         operators are found instead of making noise ;-)
16552         (Unary::ResolveOperator): New method to do precisely the same thing which
16553         Binary::ResolveOperator does for Binary expressions.
16554         (Unary.method, .Arguments): Add.
16555         (Unary::OperName): Implement.   
16556         (Unary::ForceConversion): Copy and Paste !
16557
16558         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16559         a unary operator.
16560
16561         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16562         for the inbuilt operators. Only overloading works for now ;-)
16563
16564 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16565
16566         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16567         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16568
16569         * expression.cs (This::Emit): Implement. 
16570         (This::Resolve): Implement.
16571         (TypeOf:Resolve): Implement.
16572         (Expression::ResolveSimpleName): Add an implicit this to instance
16573         field references. 
16574         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16575         Bind instance variable to Field expressions.
16576         (FieldExpr::Instance): New field used to track the expression that
16577         represents the object instance.
16578         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16579         binding 
16580         (FieldExpr::Emit): Implement.
16581
16582         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16583         the last instruction contains a return opcode to avoid generating
16584         the last `ret' instruction (this generates correct code, and it is
16585         nice to pass the peverify output).
16586
16587         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16588         initializer for static and instance variables.
16589         (Constructor::Emit): Allow initializer to be null in the case of
16590         static constructors.  Only emit initializer for instance
16591         constructors. 
16592
16593         (TypeContainer::FindMembers): Return a null array if there are no
16594         matches.
16595
16596         Also fix the code for the MemberTypes.Method branch, as it was not
16597         scanning that for operators (or tried to access null variables before).
16598
16599         * assign.cs (Assign::Emit): Handle instance and static fields. 
16600
16601         * TODO: Updated.
16602
16603         * driver.cs: Stop compilation if there are parse errors.
16604
16605         * cs-parser.jay (constructor_declaration): Provide default base
16606         initializer for non-static constructors.
16607         (constructor_declarator): Do not provide a default base
16608         initializers if none was specified.
16609         Catch the fact that constructors should not have parameters.
16610
16611         * class.cs: Do not emit parent class initializers for static
16612         constructors, that should be flagged as an error.
16613
16614 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16615
16616         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16617         Move back code into TypeContainer::Populate.
16618
16619 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16620
16621         * class.cs (TypeContainer::AddConstructor): Fix the check to
16622         compare against Name, not Basename. 
16623         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16624
16625         * cs-parser.jay : Update accordingly.
16626
16627         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16628         for methods, don't forget to look into the operators too.
16629         (RegisterMethodBuilder): Helper method to take care of this for
16630         methods, constructors and operators.
16631         (Operator::Define): Completely revamp.
16632         (Operator.OperatorMethod, MethodName): New fields.
16633         (TypeContainer::Populate): Move the registering of builders into
16634         RegisterMethodBuilder.
16635         (Operator::Emit): Re-write.
16636
16637         * expression.cs (Binary::Emit): Comment out code path to emit method
16638         invocation stuff for the case when we have a user defined operator. I am
16639         just not able to get it right !
16640
16641 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16642
16643         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16644         argument. 
16645
16646         (Expression::MemberLookup): Provide a version that allows to
16647         specify the MemberTypes and BindingFlags. 
16648
16649         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16650         so it was not fetching variable information from outer blocks.
16651
16652         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16653         Beforefieldinit as it was buggy.
16654
16655         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16656         that Ravi put here.  
16657
16658         * class.cs (Constructor::Emit): Only emit if block is not null.
16659         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16660         deal with this by semantically definining it as if the user had
16661         done it.
16662
16663         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16664         constructors as we now "emit" them at a higher level.
16665
16666         (TypeContainer::DefineDefaultConstructor): Used to define the
16667         default constructors if none was provided.
16668
16669         (ConstructorInitializer): Add methods Resolve and Emit. 
16670
16671         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16672
16673 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16674
16675         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16676         the default constructor builder with our hashtable for methodbuilders
16677         to methodcores.
16678
16679         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16680         and argument_count is 0 in which case we have a match.
16681         (Binary::ResolveOperator): More null checking and miscellaneous coding
16682         style cleanup.
16683
16684 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16685
16686         * rootcontext.cs (IsNameSpace): Compare against null.
16687
16688         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16689
16690         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16691         and Unary::Operator.
16692
16693         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16694         accordingly.
16695
16696         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16697         we have overloaded operators.
16698         (Binary::ResolveOperator): Implement the part which does the operator overload
16699         resolution.
16700
16701         * class.cs (Operator::Emit): Implement.
16702         (TypeContainer::Emit): Emit the operators we have too.
16703
16704         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16705         the case when we have a user-defined operator.
16706
16707 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16708
16709         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16710
16711 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16712
16713         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16714         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16715         (Constructor::Emit): Implement.
16716         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16717         if we have no work to do. 
16718         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16719         Emit method.
16720
16721         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16722         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16723
16724         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16725         of parent.parent.
16726
16727 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16728
16729         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16730         in the source.
16731         (Tree::RecordNamespace): Method to do what the name says ;-)
16732         (Tree::Namespaces): Property to get at the namespaces hashtable.
16733
16734         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16735         keep track.
16736
16737         * rootcontext.cs (IsNamespace): Fixed it :-)
16738
16739 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16740
16741         * class.cs (TypeContainer::FindMembers): Add support for
16742         constructors. 
16743         (MethodCore): New class that encapsulates both the shared aspects
16744         of a Constructor and a Method.  
16745         (Method, Constructor): Factored pieces into MethodCore.
16746
16747         * driver.cs: Added --fatal which makes errors throw exceptions.
16748         Load System assembly as well as part of the standard library.
16749
16750         * report.cs: Allow throwing exceptions on errors for debugging.
16751
16752         * modifiers.cs: Do not use `parent', instead use the real type
16753         container to evaluate permission settings.
16754
16755         * class.cs: Put Ravi's patch back in.  He is right, and we will
16756         have to cope with the
16757
16758 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16759
16760         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16761         FamORAssem, not FamANDAssem.
16762
16763 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16764
16765         * driver.cs: Added --parse option that only parses its input files
16766         and terminates.
16767
16768         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16769         incorrect.  IsTopLevel is not used to tell whether an object is
16770         root_types or not (that can be achieved by testing this ==
16771         root_types).  But to see if this is a top-level *class* (not
16772         necessarly our "toplevel" container). 
16773
16774 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16775
16776         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16777         parent instead of a direct call to GetType.
16778
16779 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16780
16781         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16782         Modifiers.TypeAttr. This should just be a call to that method.
16783
16784         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16785         object so that we can determine if we are top-level or not.
16786
16787         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16788         TypeContainer too.
16789
16790         * enum.cs (Enum::Define): Ditto.
16791
16792         * modifiers.cs (FieldAttr): Re-write.
16793
16794         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16795         (TypeContainer::HaveStaticConstructor): New property to provide access
16796         to precisely that info.
16797
16798         * modifiers.cs (MethodAttr): Re-write.
16799         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16800
16801         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16802         of top-level types as claimed.
16803
16804 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16805
16806         * expression.cs (MemberLookup): Fruitless attempt to lookup
16807         constructors.  Maybe I need to emit default constructors?  That
16808         might be it (currently .NET emits this for me automatically).
16809         (Invocation::OverloadResolve): Cope with Arguments == null.
16810         (Invocation::EmitArguments): new function, shared by the new
16811         constructor and us.
16812         (Invocation::Emit): Handle static and instance methods.  Emit
16813         proper call instruction for virtual or non-virtual invocations.
16814         (New::Emit): Implement.
16815         (New::Resolve): Implement.
16816         (MemberAccess:Resolve): Implement.
16817         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16818         to track instances.
16819         (FieldExpr::Resolve): Set type.
16820
16821         * support.cs: Handle empty arguments.
16822                 
16823         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16824         SimpleLookup): Auxiliary routines to help parse a qualifier
16825         identifier.  
16826
16827         Update qualifier_identifier rule.
16828
16829         * codegen.cs: Removed debugging messages.
16830
16831         * class.cs: Make this a global thing, this acts just as a "key" to
16832         objects that we might have around.
16833
16834         (Populate): Only initialize method_builders_to_methods once.
16835
16836         * expression.cs (PropertyExpr): Initialize type from the
16837         PropertyType. 
16838
16839         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16840         Resolve pattern.  Attempt to implicitly convert value to boolean.
16841         Emit code.
16842
16843         * expression.cs: Set the type for the int32/int32 argument case.
16844         (Binary::ResolveOperator): Set the return type to boolean for
16845         comparission operators
16846
16847         * typemanager.cs: Remove debugging print code.
16848
16849         (Invocation::Resolve): resolve type.
16850
16851         * class.cs: Allocate a MemberInfo of the correct size, as the code
16852         elsewhere depends on the test to reflect the correct contents.
16853
16854         (Method::) Keep track of parameters, due to System.Reflection holes
16855
16856         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16857         mapping here.
16858
16859         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16860         of the exact size and return that.
16861
16862         (Class::LookupMethodByBuilder): New function that maps
16863         MethodBuilders to its methods.  Required to locate the information
16864         on methods because System.Reflection bit us again.
16865
16866         * support.cs: New file, contains an interface ParameterData and
16867         two implementations: ReflectionParameters and InternalParameters
16868         used to access Parameter information.  We will need to grow this
16869         as required.
16870
16871         * expression.cs (Invocation::GetParameterData): implement a cache
16872         and a wrapper around the ParameterData creation for methods. 
16873         (Invocation::OverloadResolve): Use new code.
16874
16875 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16876
16877         * class.cs (TypeContainer::EmitField): Remove and move into 
16878         (Field::Define): here and modify accordingly.
16879         (Field.FieldBuilder): New member.
16880         (TypeContainer::Populate): Update accordingly.
16881         (TypeContainer::FindMembers): Implement.
16882
16883 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16884
16885         * statement.cs: (VariableInfo::VariableType): New field to be
16886         initialized with the full type once it is resolved. 
16887
16888 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16889
16890         * parameter.cs (GetParameterInfo): Use a type cache to compute
16891         things only once, and to reuse this information
16892
16893         * expression.cs (LocalVariableReference::Emit): Implement.
16894         (OpcodeCast::Emit): fix.
16895
16896         (ParameterReference::Resolve): Implement.
16897         (ParameterReference::Emit): Implement.
16898
16899         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16900         that are expressions need to stay as Expressions.
16901
16902         * typemanager.cs (CSharpName): Returns the C# name of a type if
16903         possible. 
16904
16905         * expression.cs (Expression::ConvertImplicit): New function that
16906         implements implicit type conversions.
16907
16908         (Expression::ImplicitReferenceConversion): Implements implicit
16909         reference conversions.
16910
16911         (EmptyCast): New type for transparent casts.
16912
16913         (OpcodeCast): New type for casts of types that are performed with
16914         a sequence of bytecodes.
16915
16916         (BoxedCast): New type used for casting value types into reference
16917         types.  Emits a box opcode.
16918
16919         (Binary::DoNumericPromotions): Implements numeric promotions of
16920         and computation of the Binary::Type.
16921
16922         (Binary::EmitBranchable): Optimization.
16923
16924         (Binary::Emit): Implement code emission for expressions.
16925
16926         * typemanager.cs (TypeManager): Added two new core types: sbyte
16927         and byte.
16928
16929 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16930
16931         * class.cs (TypeContainer::FindMembers): Method which does exactly
16932         what Type.FindMembers does, only we don't have to use reflection. No
16933         implementation yet.
16934
16935         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16936         typecontainer objects as we need to get at them.
16937         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16938
16939         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16940         typecontainer object.
16941
16942         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16943         of just a Report object.
16944
16945 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16946
16947         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16948         "remove_"
16949         (TypeContainer::Populate): Now define the delegates of the type too.
16950         (TypeContainer.Delegates): Property to access the list of delegates defined
16951         in the type.
16952
16953         * delegates.cs (Delegate::Define): Implement partially.
16954
16955         * modifiers.cs (TypeAttr): Handle more flags.
16956
16957 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16958
16959         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16960         and not <=
16961         (Operator::Define): Re-write logic to get types by using the LookupType method
16962         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16963         (Indexer::Define): Ditto.
16964         (Event::Define): Ditto.
16965         (Property::Define): Ditto.
16966
16967 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16968
16969         * class.cs (TypeContainer::Populate): Now define operators too. 
16970         (TypeContainer.Operators): New property to access the list of operators
16971         in a type.
16972         (Operator.OperatorMethodBuilder): New member to hold the method builder
16973         for the operator we are defining.
16974         (Operator::Define): Implement.
16975
16976 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16977
16978         * class.cs (Event::Define): Make the prefixes of the accessor methods
16979         addOn_ and removeOn_ 
16980
16981         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16982         of the location being passed in too. Ideally, this should go later since all
16983         error reporting should be done through the Report object.
16984
16985         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16986         (Populate): Iterate thru the indexers we have and define them too.
16987         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16988         for the get and set accessors.
16989         (Indexer::Define): Implement.
16990
16991 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16992
16993         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16994         my previous implementation, did not work.
16995
16996         * typemanager.cs: Add a couple of missing types (the longs).
16997
16998         * literal.cs: Use TypeManager.bool_type instead of getting it.
16999
17000         * expression.cs (EventExpr): New kind of expressions.
17001         (Expressio::ExprClassFromMemberInfo): finish
17002
17003 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17004
17005         * assign.cs: Emit stores to static fields differently.
17006
17007 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17008
17009         * Merge in changes and adjust code to tackle conflicts. Backed out my
17010         code in Assign::Resolve ;-) 
17011
17012 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17013
17014         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17015         instead Report.Error and also pass in the location.
17016         (CSharpParser::Lexer): New readonly property to return the reference
17017         to the Tokenizer object.
17018         (declare_local_variables): Use Report.Error with location instead of plain 
17019         old error.
17020         (CheckDef): Ditto.
17021
17022         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17023         (Operator.CheckBinaryOperator): Ditto.
17024
17025         * cs-parser.jay (operator_declarator): Update accordingly.
17026
17027         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17028         (CheckBinaryOperator): Same here.
17029
17030         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17031         on the name without any prefixes of namespace names etc. This is because we
17032         already might have something already fully qualified like 
17033         'System.Console.WriteLine'
17034
17035         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17036
17037 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17038
17039         * cs-tokenizer.cs (location): Return a string which also contains
17040         the file name.
17041
17042         * expression.cs (ElementAccess): New class for expressions of the
17043         type 'element access.'
17044         (BaseAccess): New class for expressions of the type 'base access.'
17045         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17046         respectively.
17047
17048         * cs-parser.jay (element_access): Implement action.
17049         (base_access): Implement actions.
17050         (checked_expression, unchecked_expression): Implement.
17051
17052         * cs-parser.jay (local_variable_type): Correct and implement.
17053         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17054
17055         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17056
17057         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17058         name and the specifiers.
17059
17060         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17061
17062         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17063         making them all public ;-)
17064
17065         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17066         class anyways.
17067
17068 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17069
17070         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17071         PropertyExprs.
17072         (FieldExpr, PropertyExprs): New resolved expressions.
17073         (SimpleName::MemberStaticCheck): Perform static checks for access
17074         to non-static fields on static methods. Maybe this should be
17075         generalized for MemberAccesses. 
17076         (SimpleName::ResolveSimpleName): More work on simple name
17077         resolution. 
17078
17079         * cs-parser.jay (primary_expression/qualified_identifier): track
17080         the parameter index.
17081
17082         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17083         (EmitContext::EmitBoolExpression): Chain to expression generation
17084         instead of temporary hack.
17085         (::EmitStatementExpression): Put generic expression code generation.
17086
17087         * assign.cs (Assign::Emit): Implement variable assignments to
17088         local variables, parameters and fields.
17089
17090 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17091
17092         * statement.cs (Block::GetVariableInfo): New method, returns the
17093         VariableInfo for a variable name in a block.
17094         (Block::GetVariableType): Implement in terms of GetVariableInfo
17095
17096         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17097         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17098
17099 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17100
17101         * cs-parser.jay (operator_declaration): Continue on my quest : update
17102         to take attributes argument.
17103         (event_declaration): Ditto.
17104         (enum_declaration): Ditto.
17105         (indexer_declaration): Ditto.
17106
17107         * class.cs (Operator::Operator): Update constructor accordingly.
17108         (Event::Event): Ditto.
17109
17110         * delegate.cs (Delegate::Delegate): Same here.
17111
17112         * enum.cs (Enum::Enum): Same here.
17113
17114 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17115
17116         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17117
17118         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17119
17120         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17121         being passed around as an arraylist.
17122         (Attributes::AddAttribute): Method to add attribute sections.
17123
17124         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17125         (struct_declaration): Update accordingly.
17126         (constant_declaration): Update.
17127         (field_declaration): Update.
17128         (method_header): Update.
17129         (fixed_parameter): Update.
17130         (parameter_array): Ditto.
17131         (property_declaration): Ditto.
17132         (destructor_declaration): Ditto.
17133
17134         * class.cs (Struct::Struct): Update constructors accordingly.
17135         (Class::Class): Ditto.
17136         (Field::Field): Ditto.
17137         (Method::Method): Ditto.
17138         (Property::Property): Ditto.
17139         (TypeContainer::OptAttribute): update property's return type.
17140
17141         * interface.cs (Interface.opt_attributes): New member.
17142         (Interface::Interface): Update to take the extra Attributes argument.
17143
17144         * parameter.cs (Parameter::Parameter): Ditto.
17145
17146         * constant.cs (Constant::Constant): Ditto.
17147
17148         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17149         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17150         the attributes as a parameter.
17151         (InterfaceProperty): Update constructor call.
17152         (InterfaceEvent): Ditto.
17153         (InterfaceMethod): Ditto.
17154         (InterfaceIndexer): Ditto.
17155
17156         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17157         pass the attributes too.
17158         (interface_event_declaration): Ditto.
17159         (interface_property_declaration): Ditto.
17160         (interface_method_declaration): Ditto.
17161         (interface_declaration): Ditto.
17162
17163 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17164
17165         * class.cs (Method::Define): Track the "static Main" definition to
17166         create an entry point. 
17167
17168         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17169         EntryPoint if we find it. 
17170
17171         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17172         (EmitContext::ig): Make this variable public.
17173
17174         * driver.cs: Make the default output file be the first file name
17175         with the .exe extension.  
17176
17177         Detect empty compilations
17178
17179         Handle various kinds of output targets.  Handle --target and
17180         rename -t to --dumper.
17181
17182         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17183         methods inherited from Expression return now an Expression.  This
17184         will is used during the tree rewriting as we resolve them during
17185         semantic analysis.
17186
17187         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17188         the spec.  Missing entirely is the information about
17189         accessability of elements of it.
17190
17191         (Expression::ExprClassFromMemberInfo): New constructor for
17192         Expressions that creates a fully initialized Expression based on
17193         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17194         a Type.
17195
17196         (Invocation::Resolve): Begin implementing resolution of invocations.
17197
17198         * literal.cs (StringLiteral):  Implement Emit.
17199
17200 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17201
17202         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17203         member.
17204
17205 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17206
17207         * cs-parser.jay (attribute_arguments): Implement actions.
17208         (attribute): Fix bug in production. Implement action.
17209         (attribute_list): Implement.
17210         (attribute_target): Implement.
17211         (attribute_target_specifier, opt_target_specifier): Implement
17212         (CheckAttributeTarget): New method to check if the attribute target
17213         is valid.
17214         (attribute_section): Implement.
17215         (opt_attributes): Implement.
17216
17217         * attribute.cs : New file to handle attributes.
17218         (Attribute): Class to hold attribute info.
17219
17220         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17221         (attribute_section): Modify production to use 2 different rules to 
17222         achieve the same thing. 1 s/r conflict down !
17223         Clean out commented, useless, non-reducing dimension_separator rules.
17224
17225         * class.cs (TypeContainer.attributes): New member to hold list
17226         of attributes for a type.
17227         (Struct::Struct): Modify to take one more argument, the attribute list.
17228         (Class::Class): Ditto.
17229         (Field::Field): Ditto.
17230         (Method::Method): Ditto.
17231         (Property::Property): Ditto.
17232
17233         * cs-parser.jay (struct_declaration): Update constructor call to
17234         pass in the attributes too.
17235         (class_declaration): Ditto.
17236         (constant_declaration): Ditto.
17237         (field_declaration): Ditto.
17238         (method_header): Ditto.
17239         (fixed_parameter): Ditto.
17240         (parameter_array): Ditto.
17241         (property_declaration): Ditto.
17242
17243         * constant.cs (Constant::Constant): Update constructor similarly.
17244         Use System.Collections.
17245
17246         * parameter.cs (Parameter::Parameter): Update as above.
17247
17248 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17249
17250         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17251         (TypeContainer.delegates): New member to hold list of delegates.
17252
17253         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17254         this time as I seem to be on crack ;-)
17255
17256 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17257
17258         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17259         tell whether an identifier represents a namespace.
17260
17261         * expression.cs (NamespaceExpr): A namespace expression, used only
17262         temporarly during expression resolution.
17263         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17264         utility functions to resolve names on expressions.
17265
17266 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17267
17268         * codegen.cs: Add hook for StatementExpressions. 
17269
17270         * class.cs: Fix inverted test for static flag in methods.
17271
17272 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17273
17274         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17275         to make it coincide with MS' number.
17276         (Operator::CheckBinaryOperator): Ditto.
17277
17278         * ../errors/errors.txt : Remove error numbers added earlier.
17279
17280         * ../errors/cs1019.cs : Test case for error # 1019
17281
17282         * ../errros/cs1020.cs : Test case for error # 1020
17283
17284         * cs-parser.jay : Clean out commented cruft.
17285         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17286         used anywhere - non-reducing rule.
17287         (namespace_declarations): Non-reducing rule - comment out.
17288
17289         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17290         with TypeContainer::AddEnum.
17291
17292         * delegate.cs : New file for delegate handling classes.
17293         (Delegate): Class for declaring delegates.
17294
17295         * makefile : Update.
17296
17297         * cs-parser.jay (delegate_declaration): Implement.
17298
17299 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17300
17301         * class.cs (Event::Define): Implement.
17302         (Event.EventBuilder): New member.
17303
17304         * class.cs (TypeContainer::Populate): Update to define all enums and events
17305         we have.
17306         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17307         readonly fields for all these cases ?
17308
17309 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17310
17311         * class.cs (Property): Revamp to use the convention of making fields readonly.
17312         Accordingly modify code elsewhere.
17313
17314         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17315         the Define method of the Property class.
17316
17317         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17318         trivial bug.
17319         (TypeContainer::Populate): Update to define all the properties we have. Also
17320         define all enumerations.
17321
17322         * enum.cs (Define): Implement.
17323
17324 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17325
17326         * cs-parser.jay (overloadable_operator): The semantic value is an
17327         enum of the Operator class.
17328         (operator_declarator): Implement actions.
17329         (operator_declaration): Implement.
17330
17331         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17332         validity of definitions.
17333         (Operator::CheckBinaryOperator): Static method to check for binary operators
17334         (TypeContainer::AddOperator): New method to add an operator to a type.
17335
17336         * cs-parser.jay (indexer_declaration): Added line to actually call the
17337         AddIndexer method so it gets added ;-)
17338
17339         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17340         already taken care of by the MS compiler ?  
17341
17342 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17343
17344         * class.cs (Operator): New class for operator declarations.
17345         (Operator::OpType): Enum for the various operators.
17346
17347 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17348
17349         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17350         ostensibly handle this in semantic analysis.
17351
17352         * cs-parser.jay (general_catch_clause): Comment out
17353         (specific_catch_clauses, specific_catch_clause): Ditto.
17354         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17355         (catch_args, opt_catch_args): New productions.
17356         (catch_clause): Rewrite to use the new productions above
17357         (catch_clauses): Modify accordingly.
17358         (opt_catch_clauses): New production to use in try_statement
17359         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17360         and re-write the code in the actions to extract the specific and
17361         general catch clauses by being a little smart ;-)
17362
17363         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17364         Hooray, try and catch statements parse fine !
17365
17366 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17367
17368         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17369         string from the hashtable of variables.
17370
17371         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17372         I end up making that mistake ;-)
17373         (catch_clauses): Fixed gross error which made Key and Value of the 
17374         DictionaryEntry the same : $1 !!
17375
17376 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17377
17378         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17379
17380         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17381         when the add and remove accessors are specified. 
17382
17383 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17384
17385         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17386         information about indexer_declarator.
17387         (indexer_declarator): Implement actions.
17388         (parsing_indexer): New local boolean used to keep track of whether
17389         we are parsing indexers or properties. This is necessary because 
17390         implicit_parameters come into picture even for the get accessor in the 
17391         case of an indexer.
17392         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17393
17394         * class.cs (Indexer): New class for indexer declarations.
17395         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17396         (TypeContainer::indexers): New member to hold list of indexers for the
17397         type.
17398
17399 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17400
17401         * cs-parser.jay (add_accessor_declaration): Implement action.
17402         (remove_accessor_declaration): Implement action.
17403         (event_accessors_declaration): Implement
17404         (variable_declarators): swap statements for first rule - trivial.
17405
17406         * class.cs (Event): New class to hold information about event
17407         declarations.
17408         (TypeContainer::AddEvent): New method to add an event to a type
17409         (TypeContainer::events): New member to hold list of events.
17410
17411         * cs-parser.jay (event_declaration): Implement actions.
17412
17413 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17414
17415         * cs-parser.jay (dim_separators): Implement. Make it a string
17416         concatenating all the commas together, just as they appear.
17417         (opt_dim_separators): Modify accordingly
17418         (rank_specifiers): Update accordingly. Basically do the same
17419         thing - instead, collect the brackets here.
17420         (opt_rank_sepcifiers): Modify accordingly.
17421         (array_type): Modify to actually return the complete type string
17422         instead of ignoring the rank_specifiers.
17423         (expression_list): Implement to collect the expressions
17424         (variable_initializer): Implement. We make it a list of expressions
17425         essentially so that we can handle the array_initializer case neatly too.
17426         (variable_initializer_list): Implement.
17427         (array_initializer): Make it a list of variable_initializers
17428         (opt_array_initializer): Modify accordingly.
17429
17430         * expression.cs (New::NType): Add enumeration to help us
17431         keep track of whether we have an object/delegate creation
17432         or an array creation.
17433         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17434         members to hold data about array creation.
17435         (New:New): Modify to update NewType
17436         (New:New): New Overloaded contructor for the array creation
17437         case.
17438
17439         * cs-parser.jay (array_creation_expression): Implement to call
17440         the overloaded New constructor.
17441
17442 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17443
17444         * class.cs (TypeContainer::Constructors): Return member
17445         constructors instead of returning null.
17446
17447 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17448
17449         * typemanager.cs (InitCoreTypes): Initialize the various core
17450         types after we have populated the type manager with the user
17451         defined types (this distinction will be important later while
17452         compiling corlib.dll)
17453
17454         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17455         on Expression Classification.  Now all expressions have a method
17456         `Resolve' and a method `Emit'.
17457
17458         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17459         generation from working.     Also add some temporary debugging
17460         code. 
17461
17462 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17463
17464         * codegen.cs: Lots of code generation pieces.  This is only the
17465         beginning, will continue tomorrow with more touches of polish.  We
17466         handle the fundamentals of if, while, do, for, return.  Others are
17467         trickier and I need to start working on invocations soon.
17468
17469         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17470         s.InitStatement. 
17471
17472         * codegen.cs (EmitContext): New struct, used during code
17473         emission to keep a context.   Most of the code generation will be
17474         here. 
17475
17476         * cs-parser.jay: Add embedded blocks to the list of statements of
17477         this block.  So code generation proceeds in a top down fashion.
17478
17479 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17480
17481         * statement.cs: Add support for multiple child blocks.
17482
17483 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17484
17485         * codegen.cs (EmitCode): New function, will emit the code for a
17486         Block of code given a TypeContainer and its ILGenerator. 
17487
17488         * statement.cs (Block): Standard public readonly optimization.
17489         (Block::Block constructors): Link children. 
17490         (Block::Child): Child Linker.
17491         (Block::EmitVariables): Emits IL variable declarations.
17492
17493         * class.cs: Drop support for MethodGroups here, delay until
17494         Semantic Analysis.
17495         (Method::): Applied the same simplification that I did before, and
17496         move from Properties to public readonly fields.
17497         (Method::ParameterTypes): Returns the parameter types for the
17498         function, and implements a cache that will be useful later when I
17499         do error checking and the semantic analysis on the methods is
17500         performed.
17501         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17502         and made a method, optional argument tells whether this is a class
17503         or a structure to apply the `has-this' bit.
17504         (Method::GetCallingConvention): Implement, returns the calling
17505         convention. 
17506         (Method::Define): Defines the type, a second pass is performed
17507         later to populate the methods.
17508
17509         (Constructor::ParameterTypes): implement a cache similar to the
17510         one on Method::ParameterTypes, useful later when we do semantic
17511         analysis. 
17512
17513         (TypeContainer::EmitMethod):  New method.  Emits methods.
17514
17515         * expression.cs: Removed MethodGroup class from here.
17516
17517         * parameter.cs (Parameters::GetCallingConvention): new method.
17518
17519 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17520
17521         * class.cs (TypeContainer::Populate): Drop RootContext from the
17522         argument. 
17523
17524         (Constructor::CallingConvention): Returns the calling convention.
17525         (Constructor::ParameterTypes): Returns the constructor parameter
17526         types. 
17527
17528         (TypeContainer::AddConstructor): Keep track of default constructor
17529         and the default static constructor.
17530
17531         (Constructor::) Another class that starts using `public readonly'
17532         instead of properties. 
17533
17534         (Constructor::IsDefault): Whether this is a default constructor. 
17535
17536         (Field::) use readonly public fields instead of properties also.
17537
17538         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17539         track of static constructors;  If none is used, turn on
17540         BeforeFieldInit in the TypeAttributes. 
17541
17542         * cs-parser.jay (opt_argument_list): now the return can be null
17543         for the cases where there are no arguments. 
17544
17545         (constructor_declarator): If there is no implicit `base' or
17546         `this', then invoke the default parent constructor. 
17547
17548         * modifiers.cs (MethodAttr): New static function maps a set of
17549         modifiers flags into a MethodAttributes enum
17550         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17551         MethodAttr, TypeAttr to represent the various mappings where the
17552         modifiers are used.
17553         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17554
17555 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17556
17557         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17558         method arguments.
17559
17560         * interface.cs (PopulateIndexer): Implemented the code generator
17561         for interface indexers.
17562
17563 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17564
17565         * interface.cs (InterfaceMemberBase): Now we track the new status
17566         here.  
17567
17568         (PopulateProperty): Implement property population.  Woohoo!  Got
17569         Methods and Properties going today. 
17570
17571         Removed all the properties for interfaces, and replaced them with
17572         `public readonly' fields. 
17573
17574 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17575
17576         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17577         initialize their hashtables/arraylists only when they are needed
17578         instead of doing this always.
17579
17580         * parameter.cs: Handle refs and out parameters.
17581
17582         * cs-parser.jay: Use an ArrayList to construct the arguments
17583         instead of the ParameterCollection, and then cast that to a
17584         Parameter[] array.
17585
17586         * parameter.cs: Drop the use of ParameterCollection and use
17587         instead arrays of Parameters.
17588
17589         (GetParameterInfo): Use the Type, not the Name when resolving
17590         types. 
17591
17592 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17593
17594         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17595         and instead use public readonly fields.
17596
17597         * class.cs: Put back walking code for type containers.
17598
17599 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17600
17601         * class.cs (MakeConstant): Code to define constants.
17602
17603         * rootcontext.cs (LookupType): New function.  Used to locate types 
17604
17605
17606 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17607
17608         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17609         this System.Reflection code is.  Kudos to Microsoft
17610
17611         * typemanager.cs: Implement a type cache and avoid loading all
17612         types at boot time.  Wrap in LookupType the internals.  This made
17613         the compiler so much faster.  Wow.  I rule!
17614
17615         * driver.cs: Make sure we always load mscorlib first (for
17616         debugging purposes, nothing really important).
17617
17618         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17619         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17620
17621         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17622         on namespaces that have been imported using the `using' keyword.
17623
17624         * class.cs (TypeContainer::TypeAttr): Virtualize.
17625         (Class::TypeAttr): Return attributes suitable for this bad boy.
17626         (Struct::TypeAttr): ditto.
17627         Handle nested classes.
17628         (TypeContainer::) Remove all the type visiting code, it is now
17629         replaced with the rootcontext.cs code
17630
17631         * rootcontext.cs (GetClassBases): Added support for structs. 
17632
17633 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17634
17635         * interface.cs, statement.cs, class.cs, parameter.cs,
17636         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17637         Drop use of TypeRefs, and use strings instead.
17638
17639 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17640
17641         * rootcontext.cs: 
17642
17643         * class.cs (Struct::Struct): set the SEALED flags after
17644         checking the modifiers.
17645         (TypeContainer::TypeAttr): new property, returns the
17646         TypeAttributes for a class.  
17647
17648         * cs-parser.jay (type_list): Oops, list production was creating a
17649         new list of base types.
17650
17651         * rootcontext.cs (StdLib): New property.
17652         (GetInterfaceTypeByName): returns an interface by type name, and
17653         encapsulates error handling here.
17654         (GetInterfaces): simplified.
17655         (ResolveTree): Encapsulated all the tree resolution here.
17656         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17657         types. 
17658
17659         * driver.cs: Add support for --nostdlib, to avoid loading the
17660         default assemblies.
17661         (Main): Do not put tree resolution here. 
17662
17663         * rootcontext.cs: Beginning of the class resolution.
17664
17665 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17666
17667         * rootcontext.cs: Provide better error reporting. 
17668
17669         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17670
17671         * rootcontext.cs (CreateInterface): Handle the case where there
17672         are no parent interfaces.
17673
17674         (CloseTypes): Routine to flush types at the end.
17675         (CreateInterface): Track types.
17676         (GetInterfaces): Returns an array of Types from the list of
17677         defined interfaces.
17678
17679         * typemanager.c (AddUserType): Mechanism to track user types (puts
17680         the type on the global type hash, and allows us to close it at the
17681         end). 
17682
17683 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17684
17685         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17686         RecordInterface instead.
17687
17688         * cs-parser.jay: Updated to reflect changes above.
17689
17690         * decl.cs (Definition): Keep track of the TypeBuilder type that
17691         represents this type here.  Not sure we will use it in the long
17692         run, but wont hurt for now.
17693
17694         * driver.cs: Smaller changes to accomodate the new code.
17695
17696         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17697         when done. 
17698
17699         * rootcontext.cs (CreateInterface):  New method, used to create
17700         the System.TypeBuilder type for interfaces.
17701         (ResolveInterfaces): new entry point to resolve the interface
17702         hierarchy. 
17703         (CodeGen): Property, used to keep track of the code generator.
17704
17705 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17706
17707         * cs-parser.jay: Add a second production for delegate_declaration
17708         with `VOID'.
17709
17710         (enum_body): Put an opt_comma here instead of putting it on
17711         enum_body or enum_member_declarations so we can handle trailing
17712         commas on enumeration members.  Gets rid of a shift/reduce.
17713
17714         (type_list): Need a COMMA in the middle.
17715
17716         (indexer_declaration): Tell tokenizer to recognize get/set
17717
17718         * Remove old targets.
17719
17720         * Re-add the parser target.
17721
17722 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17723
17724         * cs-parser.jay: Add precendence rules for a number of operators
17725         ot reduce the number of shift/reduce conflicts in the grammar.
17726
17727 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17728
17729         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17730         and put it here.
17731
17732         Get rid of old crufty code.
17733
17734         * rootcontext.cs: Use this to keep track of the parsed
17735         representation and the defined types available to the program. 
17736
17737         * gen-treedump.cs: adjust for new convention.
17738
17739         * type.cs: Split out the type manager, and the assembly builder
17740         from here. 
17741
17742         * typemanager.cs: the type manager will live here now.
17743
17744         * cil-codegen.cs: And the code generator here. 
17745
17746 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17747
17748         * makefile: Fixed up for easy making.
17749
17750 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17751
17752         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17753         the 
17754
17755         (unary_expression): Expand pre_increment_expression and
17756         post_decrement_expression to reduce a shift/reduce.
17757
17758 2001-07-11  Simon Cozens
17759
17760         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17761
17762         Improve allow_keyword_as_indent name.
17763
17764 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17765
17766         * Adjustments for Beta2. 
17767
17768 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17769
17770         * decl.cs: Added `Define' abstract method.
17771         (InTransit): new property, used to catch recursive definitions. 
17772
17773         * interface.cs: Implement `Define'. 
17774
17775         * modifiers.cs: Map Modifiers.constants to
17776         System.Reflection.TypeAttribute flags.
17777
17778         * class.cs: Keep track of types and user-defined types.
17779         (BuilderInit): New method for creating an assembly
17780         (ResolveType): New function to launch the resolution process, only
17781         used by interfaces for now.
17782
17783         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17784         that are inserted into the name space. 
17785
17786 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17787
17788         * ARGH.  I have screwed up my tree so many times due to the use of
17789         rsync rather than using CVS.  Going to fix this at once. 
17790
17791         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17792         load types.
17793
17794 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17795
17796         * Experiment successful: Use System.Type rather that our own
17797         version of Type.  
17798
17799 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17800
17801         * cs-parser.jay: Removed nsAliases from here.
17802
17803         Use new namespaces, handle `using XXX;' 
17804
17805         * namespace.cs: Reimplemented namespace handling, use a recursive
17806         definition of the class.  Now we can keep track of using clauses
17807         and catch invalid using clauses.
17808
17809 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17810
17811         * gen-treedump.cs: Adapted for all the renaming.
17812
17813         * expression.cs (Expression): this class now has a Type property
17814         which returns an expression Type.
17815
17816         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17817         `Type', as this has a different meaning now in the base
17818
17819 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17820
17821         * interface.cs, class.cs: Removed from all the sources the
17822         references to signature computation, as we can not do method
17823         signature computation during the parsing time, as we are not
17824         trying to solve at that point distinguishing:
17825
17826         class X {
17827                 void a (Blah x) {}
17828                 void a (NS.Blah x) {}
17829         }
17830
17831         Which depending on the context might be valid or not, as we do not
17832         know if Blah is the same thing as NS.Blah at that point.
17833
17834         * Redid everything so the code uses TypeRefs now instead of
17835         Types.  TypeRefs are just temporary type placeholders, that need
17836         to be resolved.  They initially have a pointer to a string and the
17837         current scope in which they are used.  This is used later by the
17838         compiler to resolve the reference to an actual Type. 
17839
17840         * DeclSpace is no longer a CIR.Type, and neither are
17841         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17842         are all DeclSpaces, but no Types. 
17843
17844         * type.cs (TypeRefManager): This implements the TypeRef manager,
17845         which keeps track of all the types that need to be resolved after
17846         the parsing has finished. 
17847
17848 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17849
17850         * ARGH.  We are going to have to store `foreach' as a class rather
17851         than resolving it, as we need to verify error 1579 after name
17852         resolution.   *OR* we could keep a flag that says `This request to
17853         IEnumerator comes from a foreach statement' which we can then use
17854         to generate the error.
17855
17856 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17857
17858         * class.cs (TypeContainer.AddMethod): we now add methods to the
17859         MethodGroup instead of the method hashtable.  
17860
17861         * expression.cs: Add MethodGroup abstraction, which gets us one
17862         step closer to the specification in the way we handle method
17863         declarations.  
17864
17865         * cs-parser.jay (primary_expression): qualified_identifier now
17866         tried to match up an identifier to a local variable reference or
17867         to a parameter reference.
17868
17869         current_local_parameters is now a parser global variable that
17870         points to the current parameters for the block, used during name
17871         lookup.
17872
17873         (property_declaration): Now creates an implicit `value' argument to
17874         the set accessor.
17875
17876 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17877
17878         * parameter.cs: Do not use `param' arguments as part of the
17879         signature, per the spec.
17880
17881 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17882
17883         * decl.cs: Base class for classes, structs and interfaces.  This
17884         is the "Declaration Space" 
17885
17886         * cs-parser.jay: Use CheckDef for checking declaration errors
17887         instead of having one on each function.
17888
17889         * class.cs: Factor out some code for handling error handling in
17890         accordance to the "Declarations" section in the "Basic Concepts"
17891         chapter in the ECMA C# spec.
17892
17893         * interface.cs: Make all interface member classes derive from
17894         InterfaceMemberBase.
17895
17896 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17897
17898         * Many things: all interfaces are parsed and generated in
17899         gen-treedump.  Support for member variables, constructors,
17900         destructors, properties, constants is there.
17901
17902         Beginning of the IL backend, but very little done, just there for
17903         testing purposes. 
17904
17905 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17906
17907         * cs-parser.jay: Fix labeled statement.
17908
17909         * cs-tokenizer.cs (escape): Escape " and ' always.
17910         ref_line, ref_name: keep track of the line/filename as instructed
17911         by #line by the compiler.
17912         Parse #line.
17913
17914 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17915
17916         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17917         to match the values in System.CodeDOM.
17918
17919         Divid renamed to Divide.
17920
17921         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17922         statements. 
17923         (Statements.set): remove.
17924
17925         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17926         statements. 
17927
17928         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17929         falseStatements always have valid values. 
17930
17931         * cs-parser.jay: Use System.CodeDOM now.
17932