2004-12-09 Miguel de Icaza <miguel@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
1 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
2
3         * delegate.cs: Fixed my fix from yesterday, sorry about that.
4
5 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
6
7         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
8         Reduced number of warnings.
9         
10         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
11
12 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
13
14         * driver.cs: Removed message.
15
16         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
17
18 2004-12-08    <vargaz@freemail.hu>
19
20         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
21
22 2004-12-08  Martin Baulig  <martin@ximian.com>
23
24         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
25         instead of a CS3002 for properties and indexer.
26
27 2004-12-08  Martin Baulig  <martin@ximian.com>
28
29         * decl.cs (MemberName.ToString): Make this work again.
30
31 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
32
33         * attribute.cs (Resolve): Add error 591 detection.
34
35         * class.cs (FieldMember.Define): Add error 1547 detection.
36         (Indexer.Define): Add error 620 detection.
37         (Operator.Define): Add error 590 detection.
38
39         * ecore.cs: Missing argument for error 79.
40
41         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
42         detection.
43
44 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
45
46         Fix #70106
47         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
48         only.
49
50 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
51
52         * cs-parser.jay : handle doc comments on implicit/explicit operators.
53           Some operator comments were suppressed.
54         * doc.cs : Implicit/explicit operator name in doc comments are like
55           "op_Explicit(type)~returnType", so added suffix handling.
56
57 2004-12-07  Martin Baulig  <martin@ximian.com>
58
59         * decl.cs
60         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
61         (MemberCore.GetClsCompliantAttributeValue): Likewise.
62         (DeclSpace.ec): New protected field; store the EmitContext here.
63         (DeclSpace.EmitContext): New public property; moved here from
64         `TypeContainer'.
65         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
66         EmitContext.
67
68         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
69         (Enum.Emit): Don't create a new EmitContext.
70
71         * delegate.cs (Delegate.DefineType): Always create the
72         EmitContext.
73
74         * iterators.cs (Iterators.DefineIterator): Create a new
75         EmitContext and store it in `ec'.
76
77 2004-08-24  Martin Baulig  <martin@ximian.com>
78
79         * typemanager.cs
80         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
81         this for accessibility checks.
82         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
83         IsNestedFamilyAccessible.
84         (TypeManager.IsSubclassOf): New method, do what the name actually
85         says.   
86
87 2004-12-06  Raja R Harinath  <rharinath@novell.com>
88
89         Fix crash on cs0657-17.cs.
90         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
91         Use RootContext.Tree.Types, not 'new RootTypes ()'.
92         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
93         the case where the NamespaceEntry gets overwritten.
94
95 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
96
97         Fixed #69195, #56821
98         * ecore.cs (ResolveBoolean): Tiny refactoring.
99
100         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
101         of right expression resolving when left is false constant and
102         operator is LogicalAnd OR true constant and operator is LogicalOr.
103
104         * statement.cs (ResolveUnreachable): Always reports warning.
105
106 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
107
108         * class.cs: Distinguish between 1721 and 1722 (just a little help
109         for the programmer).
110
111 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
112
113         * delegate.cs: Only allow this on new versions of the language. 
114
115 2004-12-02  Duncan Mak  <duncan@ximian.com>
116
117         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
118         Expression class.
119         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
120         here as a static method. Take an additional bool out parameter
121         `must_do_cs1540_check' for signaling to InstanceResolve.
122         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
123         member field from PropertyExpr class and made it an argument of
124         the method instead.
125         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
126         check for MarshalByRefObject, and report CS0122 instead of CS1540.
127         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
128         and `remove_accessor' as well as InstanceResolve: report CS0122
129         where applicable.
130
131         Fixes #70129.
132
133 2004-12-03  Raja R Harinath  <rharinath@novell.com>
134
135         Fix test-327.cs, test-328.cs, and put in early infrastructure
136         for eventually fixing #52697.
137         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
138         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
139         from other methods.
140         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
141         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
142         (VerifyUsing, error246): Update.
143         * rootcontext.cs (RootContext.NamespaceLookup): Just use
144         'NamespaceEntry.LookupNamespaceOrType'.
145
146 2004-12-03  Martin Baulig  <martin@ximian.com>
147
148         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
149         method as our child, call AnonymousMethod.Compatible() on it.
150
151 2004-12-03  Raja R Harinath  <rharinath@novell.com>
152
153         Disable XML documentation support in 'basic' profile.
154         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
155         Redirect XmlElement to System.Object.
156         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
157         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
158         * mcs.exe.sources: Add doc-bootstrap.cs.
159         * doc-bootstrap.cs: New file.  Contains empty stub implementation
160         of doc.cs.
161
162 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
163
164         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
165           comments are allowed.
166
167 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
168
169         * delegate.cs: Add checks for subtypes in paramaters and return values
170         in VerifyMethod () to add support for Covariance/Contravariance
171         in delegates.
172         
173 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
174
175         * report.cs: Remove extra closing parenthesis.
176
177         * convert.cs (Error_CannotImplicitConversion): If the name of the
178         types are the same, provide some extra information.
179
180         * class.cs (FieldBase): Use an unused bit field from the field to
181         encode the `has_offset' property from the FieldMember.  This saves
182         a couple of Ks on bootstrap compilation.
183
184         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
185         method as our child, return the AnonymousMethod resolved
186         expression.
187
188         * expression.cs (New.DoResolve): Allow return values from
189         NewDelegate to also include AnonymousMethods.
190
191         Fixes #70150.
192
193 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
194
195         Fix bug #70102
196         * attribute.cs (Resolve): Improved implementation of params
197         attribute arguments.
198
199         * support.cs (ParameterData): Add HasParams to be faster.
200
201 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
202
203         all things are for /doc support:
204
205         * doc.cs: new file that supports XML documentation generation.
206         * mcs.exe.sources: added doc.cs.
207         * driver.cs:
208           Handle /doc command line option.
209           Report error 2006 instead of 5 for missing file name for /doc.
210           Generate XML documentation when required, after type resolution.
211         * cs-tokenizer.cs:
212           Added support for picking up documentation (/// and /** ... */),
213           including a new XmlCommentState enumeration.
214         * cs-parser.jay:
215           Added lines to fill Documentation element for field, constant,
216           property, indexer, method, constructor, destructor, operator, event
217           and class, struct, interface, delegate, enum.
218           Added lines to warn incorrect comment.
219         * rootcontext.cs :
220           Added Documentation field (passed only when /doc was specified).
221         * decl.cs:
222           Added DocComment, DocCommentHeader, GenerateDocComment() and
223           OnGenerateDocComment() and some supporting private members for
224           /doc feature to MemberCore.
225         * class.cs:
226           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
227         * delegate.cs:
228           Added overriden DocCommentHeader.
229         * enum.cs:
230           Added overriden DocCommentHeader and GenerateDocComment().
231
232 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
233
234         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
235         unwrapping the enumeration values, chain to
236         DoConstantNumericPromotions again, so we can promote things to the
237         fundamental types (takes care of enums that are bytes, sbytes).
238
239         Fixes bug #62054.
240
241 2004-12-01  Raja R Harinath  <rharinath@novell.com>
242
243         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
244         Fix long-standing bug in type-lookup.  Use FindType instead of
245         LookupType when ec.ResolvingTypeTree.
246         (Attribute.ResolveType, Attribute.Resolve)
247         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
248         Update to changes.
249         (Attributes.Search): Remove internal version.  Update.
250         (Attributes.SearchMulti): Update.
251         (Attributes.GetClsCompliantAttribute): Remove.
252         (Attributes.GetIndexerNameAttribute): Remove.
253         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
254         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
255         * class.cs (Indexer.Define): Likewise.
256
257 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
258
259         Fix bug #68790
260         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
261         MarshallByReference members access.
262
263         * expression.cs: Use CheckMarshallByRefAccess;
264         Better error CS0197 message.
265
266         * report.cs: Print whole related error message.
267
268 2004-11-30  Raja R Harinath  <rharinath@novell.com>
269
270         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
271         the current directory to help debugging.
272
273 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
274
275         * class (GetClassBases): Better error 60 report.
276         (EventProperty): Disabled warning 67 detection.
277
278 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
279
280         Fix bug #60324
281         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
282
283         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
284         precise values.
285
286 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
287
288         Fix bug #49488
289         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
290
291         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
292
293 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
294
295         * attribute.cs (Attribute.Resolve): Refine error reporting and
296         report a cs0117 if the identifier does not exist, to distinguish
297         from 0617 which is a miss-use of the actual identifier.
298
299         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
300         between cs0070 and cs0079.
301
302         * class.cs (MemberBase.DoDefine): When reporting a wrong
303         accessibility level, we use MethodCore to compare instead of
304         Method (this was a regression in some refactoring effort).
305
306         So now we correctly report cs0056 again.
307
308         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
309         testing the target_type (which was known to be object_type) and
310         not the source type (which is anonymous_method).
311
312         Fixed reporting of error cs1660.
313
314         * expression.cs (UserCast.Source): Expose the underlying cast.
315
316         * statement.cs (Switch.SwitchGoverningType): Sort the list of
317         allowed types to find a match to int32 first (most common).
318
319         In addition, it ignores any ImplicitUserConversions that did an
320         internal implicit conversion (as the switch statement allows only
321         one integral conversion to exist).
322
323         * class.cs (PartialContainer.Create): rename `name' to
324         `member_name' for clarity.  Then replace the string calls with a
325         call to MemberName.GetPartialName, as now using
326         MemberName.ToString is an error (this is due to the side effects
327         it had, that were fixed in the past).
328
329         This will restore the error reporting on a number of partial class
330         errors that were missusing this (and getting an exception as a
331         results, which is now just a plain textual warning, because
332         yyparse debug output would crash otherwise).
333
334 2004-11-26  Raja R Harinath  <rharinath@novell.com>
335
336         * Makefile (PROGRAM_INSTALL_DIR): Remove.
337
338 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
339
340         * rootcontext.cs (LookupType): Make sure to cache lookups that
341         don't give us a negative result. This saves about 5% of corlib
342         compilation time.
343
344 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
345
346         * report.cs (AbstractMessage.Print): messages are sent to stderr
347
348         * class.cs (TypeContainer.GetClassBases): It is an error to have a
349         non-interface in the list of interfaces (at this point, either
350         parent was properly set, or a base class is being listed in the
351         interfaces section).
352
353         This flags error 1722, and resolves the crash from bug 69259.
354
355 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
356
357         * statement.cs (Using.EmitExpressionFinally): make this work right
358         for valuetypes. Fixes 69926.
359
360 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
361
362         * const.cs (Const.ChangeType): Cope with the "0 literal can be
363         converted to an enum" here, before we try to change the underlying
364         type.  This code exists, but it is a different code path than the
365         one used while encoding constants.
366
367         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
368         old bug: when converting from the null literal to a pointer,
369         return an EmptyCast, not the NullLiteral.
370
371         This fixes #69921, the recent null_type changes probably made this
372         bug more prominent.
373
374         (ImplicitReferenceConversionExists): In addition, resynchronized
375         the code here, so it matches the same code in
376         ImplicitReferenceConversionExists for the `from any class-type S
377         to any interface-type T'.
378         
379
380 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
381
382         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
383
384 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
385
386         * cs-parser.jay: Use verbosity accordingly. 
387
388 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
389
390         * expression.cs (Unary.ResolveOperator): Do not report warning;
391         AddressOf reads from variable.
392         
393         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
394
395 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
396
397         Fix bug #69462
398
399         * attribute.cs (Attributable): Removed CheckTargets.
400         (Attributes.Emit): Explicit attribute targets are tested here.
401
402         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
403         not enabled for interfaces.
404
405         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
406         (GetAssemblyName): Ouch next bug there.
407
408 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
409
410         * expression.cs: Error 275 added.
411         
412 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
413
414         Fix bug #69177 (Implemented decimal constant support)
415
416         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
417         (BinaryFold): Add DecimalConstant.
418
419         * const.cs (Define): Decimal constant 
420         (is not constant.
421         (ChangeType): Add decimal type handling.
422         (LookupConstantValue): Don't set value for decimal type but
423         emit DecimalConstantAttribute. Needed for constant optimization.
424
425         * constant.cs (ToDecimal): New method.
426         (ConvertToDecimal): New method.
427         (IntConstant): Implemented ConvertToDecimal.
428         (DecimalConstant.Emit): Emit optimized version for decimals in
429         int range.
430
431         * expression.cs (ResolveOperator): Changed order of constant
432         reduction to work correctly with native types which have
433         overloaded operators.
434         (ResolveMemberAccess): Extract constant value from attribute
435         for decimal type.
436
437         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
438
439         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
440         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
441         (ChangeType): Decimal is special.
442         (TypeToCoreType): Add decimal type.
443
444 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
445
446         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
447         decimal types.
448
449 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
450
451         * class.cs (EventField.ApplyAttributeBuilder): Fix error
452         test cs1667-5.cs.
453
454 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
455
456         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
457
458         * pending.cs (PendingImplementation): Grab only interfaces.
459
460 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
461
462         * statement.cs (ForeachHelperMethods): Add location member and
463         error 202 detection.
464
465 2004-11-19  Raja R Harinath  <rharinath@novell.com>
466
467         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
468         automatically handled by executable.make.
469         (PROGRAM): Make profile-specific.
470
471 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
472
473         * expression.cs (DoResolveBase): Fixed wrong warning for out
474         variables.
475
476 2004-11-18  Martin Baulig  <martin@ximian.com>
477
478         Merged latest changes into gmcs.  Please keep this comment in
479         here, it makes it easier for me to see what changed in MCS since
480         the last time I merged.
481
482 2004-11-17  Raja R Harinath  <rharinath@novell.com>
483
484         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
485         (TypeHandle.GetMemberCache): New.
486         (TypeHandle.TypeHandle): Update.
487         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
488         (TypeManager.LookupParentInterfacesCache):
489         Rename from LookupInterfaceCache.  Optimize slightly.
490         (TypeManager.MemberLookup_FindMembers): Update.
491         * decl.cs (MemberCache.MemberCache): Set Container to null in the
492         multi-type variant.
493         (AddCacheContents): Rename from AddHashtable.
494         * class.cs (TypeContainer.parent_container): Remove.
495         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
496         (TypeContainer.DoDefineMembers): Don't initialize it.
497         Update to name changes.
498         
499 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
500
501         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
502         that factors the code to check access modifiers on override.  
503
504         (PropertyBase): Use the code here.
505
506         Patch from Lluis S'anchez, fixes bug #69361.
507
508 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
509
510         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
511         routine that is used to report the use of a captured variable
512         whose address has been taken.
513
514         There are two checks: one when variables are being captured and
515         the other check is when the address of a variable is taken. 
516         
517         (because an anonymous methods might be resolved before *or* after
518         the address has been taken) and 
519
520         * expression.cs (Conditional.DoResolve): Remove the special
521         casing that Martin added to trueExpr and falseExpr being both
522         NullLiteral.  We get the right behavior now just by introducing
523         the null_type into the compiler. 
524
525         * convert.cs (ExplicitConversion): Change the code to use
526         null_type instead of testing `expr is NullLiteral'.
527         (ImplicitConversionStandard): use null_type too.
528         (ImplicitReferenceConversionExists): use null_type too.
529         (ImplicitReferenceConversion): use null_type too.
530
531         * literal.cs: The type of `NullLiteral' is now null_type instead
532         of object_type. 
533         (Resolve): Set the type here.
534
535         * typemanager.cs: Introduce null_type.
536
537 2004-11-17  Martin Baulig  <martin@ximian.com>
538
539         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
540         direction, like FindMembers() does.  Fixes #69546, testcase is in
541         test-315.cs.    
542
543 2004-11-16  Martin Baulig  <martin@ximian.com>
544
545         This is based on a patch from Marek Safar, see bug #69082.
546         Fixes bugs #63705 and #67130.
547
548         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
549         method; create a MemberCache for an interface type and cache the
550         result.
551
552         * decl.cs (IMemberContainer.ParentContainer): Removed.
553         (IMemberContainer.ParentCache): New property.
554         (MemberCache.SetupCacheForInterface): Removed.
555         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
556         to create a cache for an interface's "parent".
557
558         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
559         interfaces too.
560
561 2004-11-16  Martin Baulig  <martin@ximian.com>
562
563         Merged back from gmcs; these changes already went into gmcs a
564         couple of weeks ago.
565
566         * typemanager.cs
567         (TypeManager.AddUserType): Removed the `ifaces' argument.
568         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
569         `TypeExpr []'.
570         (TypeManager.AddUserInterface): Removed.
571         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
572         `TypeExpr []'.
573         (TypeManager.GetInterfaces): Likewise.
574         (TypeManager.GetExplicitInterfaces): Likewise.
575
576         * ecore.cs (TypeExpr.GetInterfaces): Removed.
577
578         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
579         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
580
581 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
582
583         * statement.cs: Avoid adding bools to a hashtable.
584
585 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
586
587         * expression.cs (Invocation.OverloadResolve): Flag error if we are
588         calling an unsafe method from a safe location.
589
590 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
591
592         Fix #69167
593         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
594
595 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
596
597         * namespace.cs (VerifyUsing): use GetPartialName instead of
598         ToString. 
599
600 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
601
602         * statement.cs (Return.Resolve): Fix regression in typo: if
603         `in_exc', we have to request a NeedReturnLabel, this was a typo
604         introduced in the anonymous method check-in.  Fixes #69131.
605
606         * Indexers were using the ShortName when defining themselves,
607         causing a regression in the compiler bootstrap when applying the
608         patch from 2004-11-02 (first part), now they use their full name
609         and the bug is gone.
610
611 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
612
613         * driver.cs: Strip the path from the names of embedded resources. Fixes
614         #68519.
615
616 2004-11-04  Raja R Harinath  <rharinath@novell.com>
617
618         Fix error message regression: cs0104-2.cs.
619         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
620         (AliasEntry.Resolve): Update.
621         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
622         'silent' flag.
623         (RootContext.LookupType): Update.
624
625 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
626
627         * cs-parser.jay: Add support for handling accessor modifiers
628         * class: Add support port accessor modifiers and error checking,
629         define PropertyMethod.Define as virtual (not abstract anymore)
630         * ecore.cs: Add checking for proeprties access with access modifiers
631         * iterators.cs: Modify Accessor constructor call based in the modified
632         constructor
633 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
634
635         * expression.cs (StringConcat): Handle being called twice,
636         as when we have a concat in a field init with more than two
637         ctors in the class
638
639 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
640
641         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
642         special case explicit implementations, we should always produce
643         the .property or .event declaration.
644         
645         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
646         since it will not return correct data if people use this
647         unresolved in the presence of using statements (see test-313).
648
649         * class.cs (MethodData.Define): If we are an explicit interface
650         implementation, set the method name to the full name of the
651         interface plus the name of the method.  
652
653         Notice that using the method.MethodName.GetFullName() does not
654         work, as it will only contain the name as declared on the source
655         file (it can be a shorthand in the presence of using statements)
656         and not the fully qualifed type name, for example:
657
658         using System;
659
660         class D : ICloneable {
661                 object ICloneable.Clone ()  {
662                 }
663         }
664
665         Would produce a method called `ICloneable.Clone' instead of
666         `System.ICloneable.Clone'.
667
668         * namespace.cs (Alias.Resolve): Use GetPartialName.
669         
670 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
671
672         * cs-parser.jay: Add error 1055 report.
673
674 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
675
676         * assign.cs (Assign.DoResolve): Only do the transform of
677         assignment into a New if the types are compatible, if not, fall
678         through and let the implicit code deal with the errors and with
679         the necessary conversions. 
680
681 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
682
683         * cs-parser.jay: Add error 1031 report.
684
685         * cs-tokenizer.cs: Add location for error 1038.
686
687 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
688
689         * cs-parser.jay: Add error 1016 report.
690
691 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
692
693         * cs-parser.jay: Add errors 1575,1611 report.
694
695 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
696
697         * cs-parser.jay: Add error 1001 report.
698
699 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
700
701         Fix #68850
702         * attribute.cs (GetMarshal): Add method argument for
703         caller identification.
704
705         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
706         agument for GetMarshal and RuntimeMissingSupport.
707
708 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
709
710         * attribute.cs (ExtractSecurityPermissionSet): Removed
711         TypeManager.code_access_permission_type.
712
713         * typemanager.cs: Removed TypeManager.code_access_permission_type.
714
715 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
716
717         * expression.cs (LocalVariableReference.DoResolveLValue): Check
718         for obsolete use of a variable here.   Fixes regression on errors
719         cs0619-25 and cs0619-26.
720
721 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
722
723         Fix #62358, implemented security attribute encoding.
724
725         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
726         Tests permitted SecurityAction for assembly or other types.
727         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
728         data from SecurityPermissionAttribute to PermisionSet class.
729
730         * class.cs (ApplyAttributeBuilder): Added special handling
731         for System.Security.Permissions.SecurityAttribute based types.
732
733         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
734         special handling for System.Security.Permissions.SecurityAttribute
735         based types.
736
737         * enum.cs (ApplyAttributeBuilder): Added special handling
738         for System.Security.Permissions.SecurityAttribute based types.
739
740         * parameter.cs (ApplyAttributeBuilder): Added special handling
741         for System.Security.Permissions.SecurityAttribute based types.
742
743         * rootcontext.cs: Next 2 core types.
744
745         * typemanager.cs (TypeManager.security_permission_attr_type):
746         Built in type for the SecurityPermission Attribute.
747         (code_access_permission_type): Build in type.
748
749 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
750
751         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
752         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
753         all of this information into
754         EmitContext.EmitCapturedVariableInstance.
755         
756         * codegen.cs (EmitCapturedVariableInstance): move here the
757         funcionality of emitting an ldarg.0 in the presence of a
758         remapping.   This centralizes the instance emit code.
759
760         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
761         then emit a load of this: it means that we have reached the
762         topmost ScopeInfo: the one that contains the pointer to the
763         instance of the class hosting the anonymous method.
764
765         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
766         captures to the topmost CaptureContext.
767
768 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
769
770         * expression.cs (LocalVariableReference): Move the knowledge about
771         the iterators into codegen's EmitCapturedVariableInstance.
772
773 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
774
775         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
776         all code paths return a value from an anonymous method (it is the
777         same as the 161 error, but for anonymous methods).
778
779 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
780
781         The introduction of anonymous methods in the compiler changed
782         various ways of doing things in the compiler.  The most
783         significant one is the hard split between the resolution phase
784         and the emission phases of the compiler.
785
786         For instance, routines that referenced local variables no
787         longer can safely create temporary variables during the
788         resolution phase: they must do so from the emission phase,
789         since the variable might have been "captured", hence access to
790         it can not be done with the local-variable operations from the runtime.
791         
792         * statement.cs 
793
794         (Block.Flags): New flag `IsTopLevel' to indicate that this block
795         is a toplevel block.
796
797         (ToplevelBlock): A new kind of Block, these are the blocks that
798         are created by the parser for all toplevel method bodies.  These
799         include methods, accessors and anonymous methods.
800
801         These contain some extra information not found in regular blocks:
802         A pointer to an optional CaptureContext (for tracking captured
803         local variables and parameters).  A pointer to the parent
804         ToplevelBlock.
805         
806         (Return.Resolve): Catch missmatches when returning a value from an
807         anonymous method (error 1662).
808         Invoke NeedReturnLabel from the Resolve phase instead of the emit
809         phase.
810
811         (Break.Resolve): ditto.
812
813         (SwitchLabel): instead of defining the labels during the
814         resolution phase, we now turned the public ILLabel and ILLabelCode
815         labels into methods called GetILLabelCode() and GetILLabel() that
816         only define the label during the Emit phase.
817
818         (GotoCase): Track the SwitchLabel instead of the computed label
819         (its contained therein).  Emit the code by using
820         SwitchLabel.GetILLabelCode ().
821
822         (LocalInfo.Flags.Captured): A new flag has been introduce to track
823         whether the Local has been captured or not.
824
825         (LocalInfo.IsCaptured): New property, used to tell whether the
826         local has been captured.
827         
828         * anonymous.cs: Vastly updated to contain the anonymous method
829         support.
830
831         The main classes here are: CaptureContext which tracks any
832         captured information for a toplevel block and ScopeInfo used to
833         track the activation frames for various local variables.   
834
835         Each toplevel block has an optional capture context associated
836         with it.  When a method contains an anonymous method both the
837         toplevel method and the anonymous method will create a capture
838         context.   When variables or parameters are captured, they are
839         recorded on the CaptureContext that owns them, for example:
840
841         void Demo () {
842              int a;
843              MyDelegate d = delegate {
844                  a = 1;
845              }
846         }
847
848         Here `a' will be recorded as captured on the toplevel
849         CapturedContext, the inner captured context will not have anything
850         (it will only have data if local variables or parameters from it
851         are captured in a nested anonymous method.
852
853         The ScopeInfo is used to track the activation frames for local
854         variables, for example:
855
856         for (int i = 0; i < 10; i++)
857                 for (int j = 0; j < 10; j++){
858                    MyDelegate d = delegate {
859                         call (i, j);
860                    }
861                 }
862
863         At runtime this captures a single captured variable `i', but it
864         captures 10 different versions of the variable `j'.  The variable
865         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
866         recorded on a child.  
867
868         The toplevel ScopeInfo will also track information like the `this'
869         pointer if instance variables were referenced (this is necessary
870         as the anonymous method lives inside a nested class in the host
871         type of the method). 
872
873         (AnonymousMethod): Expanded to track the Toplevel, implement
874         `AnonymousMethod.Compatible' to tell whether an anonymous method
875         can be converted to a target delegate type. 
876
877         The routine now also produces the anonymous method content
878
879         (AnonymousDelegate): A helper class that derives from
880         DelegateCreation, this is used to generate the code necessary to
881         produce the delegate for the anonymous method that was created. 
882
883         * assign.cs: API adjustments for new changes in
884         Convert.ImplicitStandardConversionExists.
885
886         * class.cs: Adjustments to cope with the fact that now toplevel
887         blocks are of type `ToplevelBlock'. 
888
889         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
890         insteda of standard blocks.
891
892         Flag errors if params arguments are passed to anonymous methods.
893
894         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
895         `CurrentAnonymousMethod' which points to the current Anonymous
896         Method.  The variable points to the AnonymousMethod class that
897         holds the code being compiled.  It is set in the new EmitContext
898         created for the anonymous method.
899
900         (EmitContext.Phase): Introduce a variable and an enumeration to
901         assist in enforcing some rules about when and where we are allowed
902         to invoke certain methods (EmitContext.NeedsReturnLabel is the
903         only one that enfonces this right now).
904
905         (EmitContext.HaveCaptureInfo): new helper method that returns
906         whether we have a CapturedContext initialized.
907
908         (EmitContext.CaptureVariable): New method used to register that a
909         LocalInfo must be flagged for capturing. 
910
911         (EmitContext.CapturedParameter): New method used to register that a
912         parameters must be flagged for capturing. 
913         
914         (EmitContext.CapturedField): New method used to register that a
915         field must be flagged for capturing. 
916
917         (EmitContext.HaveCapturedVariables,
918         EmitContext.HaveCapturedFields): Return whether there are captured
919         variables or fields. 
920
921         (EmitContext.EmitMethodHostInstance): This is used to emit the
922         instance for the anonymous method.  The instance might be null
923         (static methods), this (for anonymous methods that capture nothing
924         and happen to live side-by-side with the current method body) or a
925         more complicated expression if the method has a CaptureContext.
926
927         (EmitContext.EmitTopBlock): Routine that drives the emission of
928         code: it will first resolve the top block, then emit any metadata
929         and then emit the code.  The split is done so that we can extract
930         any anonymous methods and flag any captured variables/parameters.
931         
932         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
933         during this phase, the ILGenerator should not be used as labels
934         and local variables declared here might not be accessible to any
935         code that is part of an anonymous method.  
936
937         Exceptions to this include the temporary variables that are
938         created by some statements internally for holding temporary
939         variables. 
940         
941         (EmitContext.EmitMeta): New routine, in charge of emitting all the
942         metadata for a cb
943
944         (EmitContext.TemporaryReturn): This method is typically called
945         from the Emit phase, and its the only place where we allow the
946         ReturnLabel to be defined other than the EmitMeta.  The reason is
947         that otherwise we would have to duplicate a lot of logic in the
948         Resolve phases of various methods that today is on the Emit
949         phase. 
950
951         (EmitContext.NeedReturnLabel): This no longer creates the label,
952         as the ILGenerator is not valid during the resolve phase.
953
954         (EmitContext.EmitThis): Extended the knowledge in this class to
955         work in anonymous methods in addition to iterators. 
956
957         (EmitContext.EmitCapturedVariableInstance): This emits whatever
958         code is necessary on the stack to access the instance to a local
959         variable (the variable will be accessed as a field).
960
961         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
962         EmitContext.EmitAddressOfParameter): Routines to support
963         parameters (not completed at this point). 
964         
965         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
966         will also remove the parameters.
967
968         * convert.cs (Convert): Define a `ConstantEC' which points to a
969         null.  This is just to prefity some code that uses
970         ImplicitStandardConversion code and do not have an EmitContext
971         handy.
972
973         The idea is to flag explicitly that at that point in time, it is
974         known that the conversion will not trigger the delegate checking
975         code in implicit conversions (which requires a valid
976         EmitContext). 
977
978         Everywhere: pass new EmitContext parameter since
979         ImplicitStandardConversionExists now requires it to check for
980         anonymous method conversions. 
981
982         (Convert.ImplicitStandardConversionExists): If the type of an
983         expression is the anonymous_method_type, and the type is a
984         delegate, we invoke the AnonymousMethod.Compatible method to check
985         whether an implicit conversion is possible. 
986
987         (Convert.ImplicitConversionStandard): Only do implicit method
988         group conversions if the language level is not ISO_1.
989
990         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
991         MethodInfo for the Invoke method.  used by Delegate and
992         AnonymousDelegate.
993
994         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
995         method conversions if the target type is a delegate.
996
997         Removed extra debugging nops.
998
999         (LocalVariableReference): Turn the `local_info' into a public
1000         field. 
1001
1002         Add `prepared' field, the same hack used for FieldExprs to cope
1003         with composed assignments, as Local variables do not necessarily
1004         operate purely on the stack as they used to: they can be captured
1005         fields. 
1006
1007         Add `temp' for a temporary result, like fields.
1008
1009         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1010
1011         It now copes with Local variables that are captured and emits the
1012         proper instance variable to load it from a field in the captured
1013         case. 
1014
1015         (ParameterReference.DoResolveBase): During the resolve phase,
1016         capture parameters if we are in an anonymous method.
1017
1018         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1019         anonymous method, use the EmitContext helper routines to emit the
1020         parameter reference.
1021
1022         * iterators.cs: Set RemapToProxy to true/false during the
1023         EmitDispose class.
1024
1025         * parameters.cs (GetParameterByName): New helper method. 
1026
1027         * typemanager.cs (anonymous_method_type) a new type that
1028         represents an anonyous method.  This is always an internal type,
1029         used as a fencepost to test against the anonymous-methodness of an
1030         expression. 
1031         
1032 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1033
1034         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1035         561 report.
1036         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1037
1038 2004-10-18  Martin Baulig  <martin@ximian.com>
1039
1040         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1041         `Type' directly, but call ResolveType() on it.
1042         (Catch.Resolve): Likewise.
1043         (Foreach.Resolve): Likewise.
1044
1045 2004-10-18  Martin Baulig  <martin@ximian.com>
1046
1047         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1048         `Type' directly, but call ResolveType() on it.
1049         (Probe.DoResolve): Likewise.
1050         (ArrayCreation.LookupType): Likewise.
1051         (TypeOf.DoResolve): Likewise.
1052         (SizeOf.DoResolve): Likewise.
1053
1054 2004-10-18  Martin Baulig  <martin@ximian.com>
1055
1056         * expression.cs (Invocation.BetterFunction): Put back
1057         TypeManager.TypeToCoreType().
1058
1059 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1060
1061         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1062         the ResolveType.
1063
1064 2004-10-18  Martin Baulig  <martin@ximian.com>
1065
1066         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1067         `Type' directly, but call ResolveType() on it.
1068
1069 2004-10-18  Martin Baulig  <martin@ximian.com>
1070
1071         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1072         `Type' directly, but call ResolveType() on it.
1073         (MemberBase.DoDefine): Likewise.
1074
1075         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1076         `Type' directly, but call ResolveType() on it.
1077         (ComposedCast.DoResolveAsTypeStep): Likewise.
1078
1079         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1080         `Type' directly, but call ResolveType() on it.
1081
1082 2004-10-17  John Luke  <john.luke@gmail.com>
1083
1084         * class.cs (Operator.GetSignatureForError): use CSharpName
1085
1086         * parameter.cs (Parameter.GetSignatureForError): Returns
1087         correct name even if was not defined.
1088
1089 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1090
1091         Fix #65816.
1092         * class.cs (TypeContainer.EmitContext): New property.
1093         (DefineNestedTypes): Create an emitcontext for each part.
1094         (MethodCore.DoDefineParameters): Use container's emitcontext.
1095         Pass type array to InternalParameters.
1096         (MemberBase.DoDefine): Use container's emitcontext.
1097         (FieldMember.Define): Likewise.
1098         (Event.Define): Likewise.
1099         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1100         Pass type array to InternalParameters.
1101         (SetIndexerMethod.GetParameterInfo): Likewise.
1102         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1103         * delegate.cs (Define): Pass emitcontext to
1104         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1105         array to InternalParameters.
1106         * expression.cs (ParameterReference.DoResolveBase): Pass
1107         emitcontext to GetParameterInfo.
1108         (ComposedCast.DoResolveAsTypeStep): Remove check on
1109         ec.ResolvingTypeTree.
1110         * parameter.cs (Parameter.Resolve): Change argument to
1111         EmitContext.  Use ResolveAsTypeTerminal.
1112         (Parameter.GetSignature): Change argument to EmitContext.
1113         (Parameters.ComputeSignature): Likewise.
1114         (Parameters.ComputeParameterTypes): Likewise.
1115         (Parameters.GetParameterInfo): Likewise.
1116         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1117         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1118         * support.cs (InternalParameters..ctor): Remove variant that takes
1119         a DeclSpace.
1120         * typemanager.cs (system_intptr_expr): New.
1121         (InitExpressionTypes): Initialize it.
1122
1123 2004-10-12  Chris Toshok  <toshok@ximian.com>
1124
1125         * cs-parser.jay: fix location for try_statement and catch_clause.
1126
1127 2004-10-11  Martin Baulig  <martin@ximian.com>
1128
1129         * report.cs: Don't make --fatal abort on warnings, we have
1130         -warnaserror for that.
1131
1132 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1133
1134         More DeclSpace.ResolveType avoidance.
1135         * decl.cs (MemberCore.InUnsafe): New property.
1136         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1137         with newly created EmitContext.
1138         (FieldMember.Define): Likewise.
1139         * delegate.cs (Delegate.Define): Likewise.
1140         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1141         only if normal name-lookup fails.
1142         (TypeExpr.DoResolve): Enable error-checking.
1143         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1144         (SizeOf.DoResolve): Likewise.
1145         (ComposedCast.DoResolveAsTypeStep): Likewise.
1146         (StackAlloc.DoResolve): Likewise.
1147         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1148         (Block.Unsafe): New property.
1149         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1150         (Unsafe): Set 'unsafe' flag of contained block.
1151         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1152         (Fixed.Resolve): Likewise.
1153         (Catch.Resolve): Likewise.
1154         (Using.ResolveLocalVariableDecls): Likewise.
1155         (Foreach.Resolve): Likewise.
1156
1157 2004-10-05  John Luke <john.luke@gmail.com>
1158
1159         * cs-parser.jay: add location to error CS0175
1160
1161 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1162
1163         * ecore.cs (Expression.Constantity): Add support for turning null
1164         into a constant.
1165
1166         * const.cs (Const.Define): Allow constants to be reference types
1167         as long as the value is Null.
1168
1169 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1170
1171         * namespace.cs (NamespaceEntry.Using): No matter which warning
1172         level is set, check if this namespace name has already been added.
1173
1174 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1175
1176         * expression.cs: reftype [!=]= null should always use br[true,false].
1177         # 67410
1178
1179 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1180
1181         Fix #67108
1182         * attribute.cs: Enum conversion moved to 
1183         GetAttributeArgumentExpression to be applied to the all
1184         expressions.
1185
1186 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1187
1188         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1189         * class.c (TypeContainer.DefineType): Flag error if
1190         base types aren't accessible due to access permissions.
1191         * decl.cs (DeclSpace.ResolveType): Move logic to
1192         Expression.ResolveAsTypeTerminal.
1193         (DeclSpace.ResolveTypeExpr): Thin layer over
1194         Expression.ResolveAsTypeTerminal.
1195         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1196         Refactor code into NestedAccess.  Use it.
1197         (DeclSpace.NestedAccess): New.
1198         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1199         argument to silence errors.  Check access permissions.
1200         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1201         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1202         (Cast.DoResolve): Likewise.
1203         (New.DoResolve): Likewise.
1204         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1205         (TypeOf.DoResolve): Likewise.
1206
1207         * expression.cs (Invocation.BetterConversion): Return the Type of
1208         the better conversion.  Implement section 14.4.2.3 more faithfully.
1209         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1210         section 14.4.2.2 explicit.
1211         (Invocation.OverloadResolve): Update.
1212         (Invocation): Remove is_base field.
1213         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1214         (Invocation.Emit): Likewise.
1215
1216 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1217
1218         * README: Update to changes.
1219
1220 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1221
1222         * cs-parser.jay: Reverted 642 warning fix.
1223
1224 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1225
1226         Fix bug #66615
1227         * decl.cs (FindMemberWithSameName): Indexer can have more than
1228         1 argument.
1229
1230 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1231
1232         * expression.cs (LocalVariableReference.DoResolveLValue):
1233         Do not report warning 219 for out values.
1234         (EmptyExpression.Null): New member to avoid extra allocations.
1235
1236 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1237
1238         * cs-parser.jay: Fix wrong warning 642 report.
1239
1240         * cs-tokenizer.cs (CheckNextToken): New helper;
1241         Inspect next character if is same as expected.
1242
1243 2004-09-23  Martin Baulig  <martin@ximian.com>
1244
1245         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1246         (Convert.ImplicitReferenceConversionExists): Likewise.
1247
1248 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1249
1250         * class.cs (Operator.Define): Add error 448 and 559 report.
1251
1252 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1253
1254         * class.cs (MemberBase.IsTypePermitted): New protected
1255         method for checking error CS0610.
1256
1257 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1258
1259         * class.cs (TypeContainer.HasExplicitLayout): New property
1260         Returns whether container has StructLayout attribute set Explicit.
1261         (FieldMember): New abstract class for consts and fields.
1262         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1263         (Field): Reuse FieldMember.
1264
1265         * const.cs (Const): Reuse FieldMember.
1266
1267         * rootcontext.cs: EmitConstants call moved to class.
1268
1269 2004-09-22  Martin Baulig  <martin@ximian.com>
1270
1271         Thanks to Peter Sestoft for this bug report.
1272
1273         * expression.cs (Conditional): If both the `trueExpr' and the
1274         `falseExpr' is a NullLiteral, return a NullLiteral.
1275
1276 2004-09-22  Martin Baulig  <martin@ximian.com>
1277
1278         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1279         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1280         for the "get_Current" call.
1281
1282 2004-09-22  Martin Baulig  <martin@ximian.com>
1283
1284         Marek and me just fixed one of our oldest bugs: #28562 :-)
1285
1286         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1287
1288         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1289         we're an EnumConstant, just return that.
1290         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1291         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1292         to get the value which'll actually be written into the attribute.
1293         However, we have to use GetValue() to access the attribute's value
1294         in the compiler.        
1295
1296 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1297
1298         * constant.cs (Constant.IsNegative): New abstract property
1299         IsNegative.
1300
1301         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1302         (StackAlloc.DoResolve): Reused IsNegative.
1303
1304 2004-09-21  Martin Baulig  <martin@ximian.com>
1305
1306         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1307         if we're used in an iterator, we may be called from different
1308         methods.
1309
1310         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1311         we actually have an exception block.
1312
1313 2004-09-20  John Luke <jluke@cfl.rr.com>
1314
1315         * class.cs, cs-parser.jay: Improve the error report for 1520:
1316         report the actual line where the error happens, not where the
1317         class was declared.
1318
1319         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1320         Pass location information that was available elsewhere.
1321
1322 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1323
1324         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1325         runtime to delay sign assemblies.
1326
1327 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1328
1329         * cs-parser.jay: Do not report the stack trace, this is barely
1330         used nowadays.
1331
1332 2004-08-22  John Luke  <john.luke@gmail.com>
1333  
1334         * driver.cs : check that a resource id is not already used
1335         before adding it, report CS1508 if it is, bug #63637
1336
1337 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1338
1339         * ecore.cs: Removed dead code.
1340
1341 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1342
1343         * class.cs: Do not report warning CS0067 on the interfaces.
1344
1345 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1346
1347         * cs-parser.jay: Add error 504 report.
1348
1349 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1350
1351         * rootcontext.cs: WarningLevel is 4 by default now.
1352
1353         * statement.cs (Fixed.Resolve): Do not null
1354         VariableInfo.
1355
1356 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1357
1358         Fixed bug #55780
1359         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1360         deep search when property is not virtual.
1361         (PropertyExpr.ResolveAccessors): Make one call for both
1362         accessors.
1363
1364 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1365
1366         Fixed bug #65766
1367         * statement.cs: Error 152 report constains also location.
1368
1369 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1370
1371         Fixed bug #65766
1372         * const.cs: Explicitly set constant as static.
1373
1374 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1375
1376         Fixed bug #64226
1377         * cs-parser.jay: Add error 1017 report.
1378
1379 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1380
1381         Fixed bug #59980, #64224
1382         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1383
1384         * typemanager.cs (IsSpecialMethod): Simplified
1385
1386 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1387
1388         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1389         condition with better params.
1390
1391 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1392
1393         Fixed bug #65238
1394         * attribute.cs (Resolve): Property has to have both
1395         accessors.
1396
1397 2004-09-14  Martin Baulig  <martin@ximian.com>
1398
1399         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1400
1401 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1402
1403         Fixed bug #61902
1404         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1405         called and is obsolete then this member suppress message
1406         when call is inside next [Obsolete] method or type.
1407
1408         * expression.cs: Use TestObsoleteMethodUsage member.
1409
1410 2004-09-14  Martin Baulig  <martin@ximian.com>
1411
1412         * cs-parser.jay: Sync a bit with the GMCS version.
1413
1414 2004-09-14  Martin Baulig  <martin@ximian.com>
1415
1416         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1417         (CSharpParser.yacc_verbose_flag): New public field.
1418
1419         * genericparser.cs: Removed.
1420
1421 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1422
1423         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1424
1425 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1426
1427         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1428
1429 2004-09-10  Martin Baulig  <martin@ximian.com>
1430
1431         Backported my MemberName changes from GMCS into MCS.
1432
1433         - we are now using a special `MemberName' class instead of using
1434         strings; in GMCS, the `MemberName' also contains the type
1435         arguments.
1436
1437         - changed the grammar rules a bit:
1438           * the old `member_name' is now a `namespace_or_type_name':
1439             The rule is that we use `namespace_or_type_name' everywhere
1440             where we expect either a "member name" (GetEnumerator) or a
1441             "member name" with an explicit interface name
1442             (IEnumerable.GetEnumerator).
1443             In GMCS, the explicit interface name may include type arguments
1444             (IEnumerable<T>.GetEnumerator).
1445           * we use `member_name' instead of just `IDENTIFIER' for
1446             "member names":
1447             The rule is that we use `member_name' wherever a member may
1448             have type parameters in GMCS.       
1449
1450         * decl.cs (MemberName): New public class.
1451         (MemberCore.MemberName): New public readonly field.
1452         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1453         (DeclSpace): Likewise.
1454
1455         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1456         * enum.cs (Enum.ctor): Likewise.
1457
1458         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1459         MemberName.     
1460         (AliasEntry.ctor): Take a MemberName, not an Expression.
1461         (AliasEntry.UsingAlias): Likewise.
1462
1463         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1464         (IMethodData.MemberName): Changed type from string to MemberName.
1465         (MemberBase.ExplicitInterfaceName): Likewise.
1466         (AbstractPropertyEventMethod.SetupName): Make this private.
1467         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1468         argument; compute the member name here.
1469         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1470         on the `member.MemberName' and the `prefix'.
1471
1472         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1473         not `type_name'.
1474         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1475         thus, we get a `MemberName' instead of a `string'.  These
1476         declarations may have type parameters in GMCS.
1477         (interface_method_declaration, delegate_declaration): Likewise.
1478         (class_declaration, interface_declaration): Likewise.
1479         (method_header): Use `namespace_or_type_name' instead of
1480         `member_name'.  We may be an explicit interface implementation.
1481         (property_declaration, event_declaration): Likewise.
1482         (member_name): This is now just an `IDENTIFIER', not a
1483         `namespace_or_type_name'.
1484         (type_name, interface_type): Removed.
1485         (namespace_or_type_name): Return a MemberName, not an Expression.
1486         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1487         call GetTypeExpression() on the MemberName to get an expression.
1488         (IndexerDeclaration.interface_type): Changed type from string to
1489         MemberName.
1490         (MakeName): Operate on MemberName's instead of string's.
1491
1492 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1493
1494         Fix bug #55770.
1495         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1496         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1497         lookup to avoid symbols introduced by 'using'.
1498         * rootcontext.cs (NamespaceLookup): Update.
1499
1500 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1501
1502         * class.cs (TypeContainer.DoDefineMembers): Do not call
1503         DefineDefaultConstructor for static classes.
1504
1505 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1506
1507         * attribute.cs (Attribute.Resolve): Add error 653 report.
1508
1509         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1510         report.
1511         (Method.ApplyAttributeBuilder): Add error 685 report.
1512         (Operator.Define): Add error 564 report.
1513
1514         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1515
1516         * expression.cs (Invocation.DoResolve): Add error
1517         245 and 250 report.
1518
1519         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1520         error 674 report.
1521
1522 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1523
1524         * class.cs (ConstructorInitializer.Resolve):
1525         Wrong error number (515->516).
1526
1527 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1528
1529         * class.cs (Indexer.Define): Add error 631 report.
1530
1531 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1532
1533         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1534
1535 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1536
1537         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1538
1539 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1540
1541         * cs-parser.jay: Added error CS0241 report.
1542
1543 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1544
1545         * cs-parser.jay (fixed_statement): Introduce a scope for the
1546         declaration in the 'fixed' statement.
1547
1548 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1549
1550         * cs-parser.jay: Added CS0230 error report.
1551
1552 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1553
1554         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1555
1556 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1557
1558         * expression.cs (Argument.Resolve): Added error CS0192 and
1559         CS0199 report.
1560
1561 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1562
1563         C# 2.0 #pragma warning feature
1564
1565         * cs-tokenizer.cs (PreProcessPragma): New method; 
1566         Handles #pragma directive.
1567
1568         * report.cs (WarningRegions): New class; Support
1569         class for #pragma warning directive. It tests whether
1570         warning is enabled for a given line.
1571
1572 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1573
1574         * const.cs: Add more descriptive error report, tahnks to
1575         Sebastien. 
1576
1577 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1578
1579         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1580
1581 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1582
1583         * expression.cs: Apply patch from Ben: Remove dead code from
1584         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1585         as that code just threw an exception anwyays.
1586
1587         * const.cs: Remove the call to the turnintoconstant, for details
1588         see bug: #63144
1589         
1590         * literal.cs: The type of the null-literal is the null type;  So
1591         we use a placeholder type (literal.cs:System.Null, defined here)
1592         for it.
1593
1594         * expression.cs (Conditional.DoResolve): Remove some old code that
1595         is no longer needed, conversions have been fixed.
1596
1597         (ArrayCreationExpression.DoResolve): Return false if we fail to
1598         resolve the inner expression.
1599
1600 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1601
1602         Fix test-290.cs.
1603         * cs-parser.jay (delegate_declaration): Record a delegate
1604         declaration as a type declaration.
1605         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1606
1607 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1608
1609         * parameter.cs: Do not crash if the type can not be resolved. 
1610
1611         * expression.cs: Report errors with unsafe pointers, fixes #64896
1612
1613 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1614
1615         * expression.cs: Pointer arith always needs to do a conv.i
1616         if the operand is a long. fix 65320
1617
1618 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1619
1620         Fixed cs0619-37.cs, cs0619-38.cs
1621
1622         * enum.cs (GetObsoleteAttribute): Removed.
1623
1624         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1625         on Enum member is double staged. The first is tested member
1626         and then enum.
1627
1628 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1629
1630         Fixed #56986, #63631, #65231
1631
1632         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1633         adds member to name container.
1634         (TypeContainer.AddToTypeContainer): New method, adds type to
1635         name container.
1636         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1637         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1638         AddOperator): Simplified by reusing AddToMemberContainer.
1639         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1640         instead of field.
1641         (Method.CheckForDuplications): Fixed implementation to test all
1642         possibilities.
1643         (MemberBase): Detection whether member is explicit interface
1644         implementation is now in constructor.
1645         (MemberBase.UpdateMemberName): Handles IndexerName.
1646         (Accessor): Changed to keep also location information.
1647         (AbstractPropertyEventMethod): Is derived from MemberCore.
1648         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1649         will be emited or not.
1650         (PropertyBase.AreAccessorsDuplicateImplementation):
1651         Tests whether accessors are not in collision with some method.
1652         (Operator): Is derived from MethodCore to simplify common
1653         operations.
1654
1655         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1656         must be performed.
1657         (DeclSpace.AddToContainer): Adds the member to defined_names
1658         table. It tests for duplications and enclosing name conflicts.
1659
1660         * enum.cs (EnumMember): Clean up to reuse the base structures
1661
1662 2004-09-03  Martin Baulig  <martin@ximian.com>
1663
1664         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1665         into TypeContainer, to make partial classes work again.
1666
1667 2004-09-03  Martin Baulig  <martin@ximian.com>
1668
1669         * rootcontext.cs (RootContext.V2): Removed.
1670
1671 2004-03-23  Martin Baulig  <martin@ximian.com>
1672
1673         * expression.cs (Invocation.OverloadResolve): Added `bool
1674         may_fail' argument and use it instead of the Location.IsNull() hack.
1675
1676 2004-09-03  Martin Baulig  <martin@ximian.com>
1677
1678         Merged latest changes into gmcs.  Please keep this comment in
1679         here, it makes it easier for me to see what changed in MCS since
1680         the last time I merged.
1681
1682 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1683
1684         Fix #61128.
1685         * expression.cs (BetterConversion): Don't allow either conversion 
1686         to be null.  Remove redundant implicit conversion test when 'q ==
1687         null' -- when this function is invoked, we already know that the
1688         implicit conversion exists.
1689         (BetterFunction): Assume that 'best' is non-null.  Remove
1690         redundant reimplementation of IsApplicable when 'best' is null.
1691         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1692         number of arguments.
1693         (IsAncestralType): Extract from OverloadResolve.
1694         (OverloadResolve): Make robust to the MethodGroupExpr being
1695         unsorted.  Implement all the logic of Section 14.5.5.1, and
1696         support overloading of methods from multiple applicable types.
1697         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1698
1699         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1700         (RealError, Warning): Append type of report to related symbol.
1701
1702 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1703
1704         * enum.cs: Fixed CLS-Compliance checks for enum members.
1705         Error tests cs3008-8.cs, cs3014-8.cs
1706
1707 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1708
1709         Fixed bug #62342, #63102
1710         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1711         like ImplementMethod.
1712
1713 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1714
1715         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1716         Fixed bug #65170.
1717
1718 2004-09-02  Martin Baulig  <martin@ximian.com>
1719
1720         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1721         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1722         on the MethodBase.
1723
1724 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1725
1726         C# 2.0 Static classes implemented
1727
1728         * class.cs (TypeContainer): instance_constructors,
1729         initialized_fields, initialized_static_fields,
1730         default_constructor, base_inteface_types are protected to be
1731         accessible from StaticClass.
1732         (TypeContainer.DefineDefaultConstructor): New virtual method
1733         for custom default constructor generating
1734         (StaticClass): New class to handle "Static classes" feature.
1735
1736         * cs-parser.jay: Handle static keyword on class like instance
1737         of StaticClass.
1738
1739         * driver.cs: Added "/langversion" command line switch with two
1740         options (iso-1, default).
1741
1742 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1743
1744         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1745
1746 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1747
1748         * delegate.cs: Style.
1749
1750 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1751
1752         * delegate.cs: Add seperate instance expr field for miguel.
1753
1754 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1755
1756         * PointerArithmetic (Resolve): make sure we are not doing
1757         pointer arith on void*. Also, make sure we are resolved
1758         by not setting eclass until resolve.
1759
1760         All callers: Make sure that PointerArithmetic gets resolved.
1761
1762 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1763
1764         * ArrayCreation (LookupType): If the type does not resolve 
1765         to an array, give an error.
1766
1767 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1768
1769         * statement.cs (Try.Resolve): Fixed bug #64222
1770
1771 2004-08-27  Martin Baulig  <martin@ximian.com>
1772
1773         * class.cs
1774         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1775         crash here.     
1776
1777 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1778
1779         * ecore.cs (Constantify): Get underlying type via
1780         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1781         Windows in special cases.
1782
1783 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1784
1785         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1786         for obtaining also private methods.
1787         (GetRemoveMethod): Used GetRemoveMethod (true)
1788         for obtaining also private methods.
1789
1790 2004-08-24  Martin Baulig  <martin@ximian.com>
1791
1792         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1793         MethodAttributes.HideBySig for operators.
1794
1795 2004-08-23  Martin Baulig  <martin@ximian.com>
1796
1797         Back to the old error reporting system :-)
1798
1799         * report.cs (Message): Removed.
1800         (Report.MessageData, ErrorData, WarningData): Removed.
1801         (Report.Error, Warning): Back to the old system.
1802
1803 2004-08-23  Martin Baulig  <martin@ximian.com>
1804
1805         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1806
1807         * class.cs (TypeContainer.ParentContainer): New public virtual
1808         method; replaces the explicit interface implementation.
1809         (ClassPart.ParentContainer): Override.
1810
1811 2004-08-23  Martin Baulig  <martin@ximian.com>
1812
1813         * statement.cs (Switch): Added support for constant switches; see
1814         #59428 or test-285.cs.
1815
1816 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1817
1818         Fixed bug #62740.
1819         * statement.cs (GetEnumeratorFilter): Removed useless
1820         logic because C# specs is strict. GetEnumerator must be
1821         public.
1822
1823 2004-08-22  Martin Baulig  <martin@ximian.com>
1824
1825         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1826         a switch and may break, reset the barrier.  Fixes #59867.
1827
1828 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1829
1830         CLS-Compliance speed up (~5% for corlib)
1831
1832         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1833         New method. Tests container for CLS-Compliant names
1834
1835         * class.cs (TypeContainer.VerifyClsName): New method.
1836         Checks whether container name is CLS Compliant.
1837         (Constructor): Implements IMethodData.
1838
1839         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
1840         low-case table for CLS Compliance test.
1841         (MemberCache.VerifyClsParameterConflict): New method.
1842         Checks method parameters for CS3006 error.
1843
1844         * enum.cs (EnumMember): Is derived from MemberCore.
1845         (Enum.VerifyClsName): Optimized for better performance.
1846
1847 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1848
1849         * report.cs: Renamed Error_T to Error and changed all
1850         references.
1851
1852 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
1853
1854         * class.cs (TypeContainer.IndexerArrayList): New inner class
1855         container for indexers.
1856         (TypeContainer.DefaultIndexerName): New constant for default
1857         indexer name. Replaced all "Item" with this constant.
1858         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
1859
1860         * typemanager.cs (TypeManager.default_member_ctor): Cache here
1861         DefaultMemberAttribute constructor.
1862
1863 2004-08-05  Martin Baulig  <martin@ximian.com>
1864
1865         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
1866         Fix bug #59429.
1867
1868 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
1869
1870         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
1871         multi platforms problem.
1872
1873         * compiler.csproj: Included shared files.
1874
1875 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1876
1877         Fix bug 60333, 55971 in the more general way
1878         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1879         Added arg_type argument for constant conversion.
1880         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
1881
1882 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1883
1884         Fix bug #59760
1885         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
1886         OperatorArrayList, MethodCoreArrayList for typecontainer
1887         containers. Changed class member types to these new types.
1888         (MethodArrayList.DefineMembers): Added test for CS0659.
1889
1890 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
1891
1892         * cfold.cs: Synchronize the folding with the code in expression.cs
1893         Binary.DoNumericPromotions for uint operands.
1894
1895         * attribute.cs: Revert patch from Raja, it introduced a regression
1896         while building Blam-1.2.1 (hard to isolate a test case).
1897
1898 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
1899
1900         Fix for #55382
1901         * class.cs:
1902         (TypeContainer.Define): Renamed to DefineContainerMembers because of
1903         name collision.
1904         (MethodCore.parent_method): New member. The method we're overriding
1905         if this is an override method.
1906         (MethodCore.CheckBase): Moved from Method class and made common.
1907         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
1908         private.
1909         (MethodCore.CheckForDuplications): New abstract method. For custom
1910         member duplication search in a container
1911         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
1912         method and its return type.
1913         (Event.conflict_symbol): New member. Symbol with same name in the
1914         parent class.
1915
1916         * decl.cs:
1917         (MemberCache.FindMemberWithSameName): New method. The method
1918         is looking for conflict with inherited symbols.
1919
1920 2004-08-04  Martin Baulig  <martin@ximian.com>
1921
1922         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
1923
1924         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
1925
1926 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1927
1928         * report.cs (Message): New enum for better error, warning reference in
1929         the code.
1930         (MessageData): New inner abstract class. It generally handles printing of
1931         error and warning messages.
1932         Removed unused Error, Warning, Message methods.
1933
1934 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1935
1936         Fix for cs0592-8.cs test
1937         * attribute.cs
1938         (Attributable.ValidAttributeTargets): Made public.
1939         (Attribute.ExplicitTarget): New member for explicit target value.
1940         (Attribute.CheckTargets): Now we translate explicit attribute
1941         target to Target here.
1942
1943 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
1944
1945         * ecore.cs (MethodGroupExpr): new IsBase property.
1946
1947         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
1948
1949         * delegate.cs (DelegateCreation): store a MethodGroupExpr
1950         rather than an instance expr.
1951
1952         (DelegateCreation.Emit): Use the method group rather than
1953         the instance expression. Also, if you have base.Foo as the
1954         method for a delegate, make sure to emit ldftn, not ldftnvirt.
1955
1956         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
1957
1958         (NewDelegate.DoResolve): Only check for the existance of Invoke
1959         if the method is going to be needed. Use MethodGroupExpr.
1960
1961         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
1962
1963         * expression.cs: For pointer arith., make sure to use
1964         the size of the type, not the size of the pointer to
1965         the type.
1966
1967 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
1968
1969         Fix for #60722
1970         * class.cs (Class): Added error CS0502 test.
1971
1972 2004-08-03  John Luke  <jluke@cfl.rr.com>
1973             Raja R Harinath  <rharinath@novell.com>
1974
1975         Fix for #60997.
1976         * attribute.cs (Attribute.complained_before): New flag.
1977         (Attribute.ResolveType, Attribute.Resolve),
1978         (Attribute.DefinePInvokeMethod): Set it.
1979         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
1980         
1981 2004-08-03  Martin Baulig  <martin@ximian.com>
1982
1983         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
1984         use a user-defined operator; we still need to do numeric
1985         promotions in case one argument is a builtin type and the other
1986         one has an implicit conversion to that type.  Fixes #62322.
1987
1988 2004-08-02  Martin Baulig  <martin@ximian.com>
1989
1990         * statement.cs (LocalInfo.Flags): Added `IsThis'.
1991         (LocalInfo.IsThis): New public property.
1992         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
1993
1994 2004-08-01  Martin Baulig  <martin@ximian.com>
1995
1996         * class.cs (TypeContainer.GetClassBases): Don't set the default
1997         here since we may get called from GetPartialBases().
1998         (TypeContainer.DefineType): If GetClassBases() didn't return a
1999         parent, use the default one.
2000
2001 2004-07-30  Duncan Mak  <duncan@ximian.com>
2002
2003         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2004
2005 2004-07-30  Martin Baulig  <martin@ximian.com>
2006
2007         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2008
2009         * class.cs (SourceMethod): New public class, derive from the
2010         symbol writer's ISourceMethod.
2011         (Method): Use the new symbol writer API.
2012
2013         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2014         as argument and use the new symbol writer.
2015
2016         * location.cs
2017         (SourceFile): Implement the symbol writer's ISourceFile.
2018         (Location.SymbolDocument): Removed.
2019         (Location.SourceFile): New public property.
2020
2021         * symbolwriter.cs: Use the new symbol writer API.
2022
2023 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2024
2025         * Makefile (install-local): Remove.  Functionality moved to
2026         executable.make.
2027
2028 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2029
2030         * Makefile: Install mcs.exe.config file together with mcs.exe.
2031         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2032         correct runtime version.
2033         
2034 2004-07-25  Martin Baulig  <martin@ximian.com>
2035
2036         * class.cs
2037         (TypeContainer.RegisterOrder): Removed, this was unused.
2038         (TypeContainer, interface_order): Removed.
2039         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2040         TypeContainer as argument since we can also be called with a
2041         `PartialContainer' for a partial class/struct/interface.
2042         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2043         of checking whether we're an `Interface' - we could be a
2044         `PartialContainer'.
2045         (PartialContainer.Register): Override; call
2046         AddClass()/AddStruct()/AddInterface() on our parent.
2047
2048         * cs-parser.jay (interface_member_declaration): Add things to the
2049         `current_container', not the `current_class'.
2050
2051         * rootcontext.cs (RegisterOrder): The overloaded version which
2052         takes an `Interface' was unused, removed.
2053
2054         * typemanager.cs (TypeManager.LookupInterface): Return a
2055         `TypeContainer', not an `Interface'.
2056         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2057         contain a `PartialContainer' for an interface, so check it's
2058         `Kind' to figure out what it is.
2059
2060 2004-07-25  Martin Baulig  <martin@ximian.com>
2061
2062         * class.cs (Class.DefaultTypeAttributes): New public constant.
2063         (Struct.DefaultTypeAttributes): Likewise.
2064         (Interface.DefaultTypeAttributes): Likewise.
2065         (PartialContainer.TypeAttr): Override this and add the
2066         DefaultTypeAttributes.
2067
2068 2004-07-25  Martin Baulig  <martin@ximian.com>
2069
2070         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2071         we can just use the `Parent' field instead.
2072
2073 2004-07-25  Martin Baulig  <martin@ximian.com>
2074
2075         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2076
2077 2004-07-25  Martin Baulig  <martin@ximian.com>
2078
2079         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2080         our parts before defining any methods.
2081         (TypeContainer.VerifyImplements): Make this virtual.
2082         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2083         on our PartialContainer.
2084
2085 2004-07-25  Martin Baulig  <martin@ximian.com>
2086
2087         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2088
2089         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2090         argument, we can just use the `Parent' field instead.
2091
2092         * class.cs
2093         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2094         (MemberBase.DoDefine): Likewise.
2095
2096 2004-07-24  Martin Baulig  <martin@ximian.com>
2097
2098         * decl.cs (MemberCore.Parent): New public field.
2099         (DeclSpace.Parent): Moved to MemberCore.
2100
2101         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2102         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2103         parent's .ctor.
2104         (FieldBase, Field, Operator): Likewise.
2105         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2106         (EventField, Event): Likewise.
2107
2108 2004-07-23  Martin Baulig  <martin@ximian.com>
2109
2110         * class.cs (PartialContainer): New public class.
2111         (ClassPart): New public class.
2112         (TypeContainer): Added support for partial classes.
2113         (TypeContainer.GetClassBases): Splitted some of the functionality
2114         out into GetNormalBases() and GetPartialBases().
2115
2116         * cs-tokenizer.cs (Token.PARTIAL): New token.
2117         (Tokenizer.consume_identifier): Added some hacks to recognize
2118         `partial', but only if it's immediately followed by `class',
2119         `struct' or `interface'.
2120
2121         * cs-parser.jay: Added support for partial clases.
2122
2123 2004-07-23  Martin Baulig  <martin@ximian.com>
2124
2125         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2126         a `DeclSpace' and also made it readonly.
2127         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2128         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2129         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2130
2131         * cs-parser.jay: Pass the `current_class', not the
2132         `current_container' (at the moment, this is still the same thing)
2133         to a new Method, Property, Event, Indexer or Constructor.
2134
2135 2004-07-23  Martin Baulig  <martin@ximian.com>
2136
2137         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2138         and removed the `current_interface' one.
2139         (struct_declaration, class_declaration, interface_declaration):
2140         Set `current_class' to the newly created class/struct/interface;
2141         set their `Bases' and call Register() before parsing their body.
2142
2143 2004-07-23  Martin Baulig  <martin@ximian.com>
2144
2145         * class.cs (Kind): New public enum.
2146         (TypeContainer): Made this class abstract.
2147         (TypeContainer.Kind): New public readonly field.
2148         (TypeContainer.CheckDef): New public method; moved here from
2149         cs-parser.jay.
2150         (TypeContainer.Register): New public abstract method.
2151         (TypeContainer.GetPendingImplementations): New public abstract
2152         method.
2153         (TypeContainer.GetClassBases): Removed the `is_class' and
2154         `is_iface' parameters.
2155         (TypeContainer.DefineNestedTypes): Formerly known as
2156         DoDefineType().
2157         (ClassOrStruct): Made this class abstract.
2158
2159         * tree.cs (RootTypes): New public type. 
2160
2161 2004-07-20  Martin Baulig  <martin@ximian.com>
2162
2163         * tree.cs (Tree.RecordNamespace): Removed.
2164         (Tree.Namespaces): Removed.
2165
2166         * rootcontext.cs (RootContext.IsNamespace): Removed.
2167
2168         * cs-parser.jay (namespace_declaration): Just create a new
2169         NamespaceEntry here.
2170
2171 2004-07-20  Martin Baulig  <martin@ximian.com>
2172
2173         * statement.cs (ExceptionStatement): New abstract class.  This is
2174         now used as a base class for everyone who's using `finally'.
2175         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2176         our local variables before using them.
2177
2178         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2179         virtual method.  This is used by Yield.Resolve() to "steal" an
2180         outer block's `finally' clauses.
2181         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2182         argument.
2183
2184         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2185         version which takes an ExceptionStatement.  This version must be
2186         used to create exception branchings.
2187
2188         * iterator.cs
2189         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2190         (Iterator.EmitMoveNext): Added exception support; protect the
2191         block with a `fault' clause, properly handle 'finally' clauses.
2192         (Iterator.EmitDispose): Run all the `finally' clauses here.
2193
2194 2004-07-20  Martin Baulig  <martin@ximian.com>
2195
2196         * iterator.cs: This is the first of a set of changes in the
2197         iterator code.  Match the spec more closely: if we're an
2198         IEnumerable, then GetEnumerator() must be called.  The first time
2199         GetEnumerator() is called, it returns the current instance; all
2200         subsequent invocations (if any) must create a copy.
2201
2202 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2203
2204         * expression.cs: Resolve the constant expression before returning
2205         it. 
2206
2207 2004-07-19  Martin Baulig  <martin@ximian.com>
2208
2209         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2210         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2211         the return type of the new EmitContext.
2212
2213 2004-07-18  Martin Baulig  <martin@ximian.com>
2214
2215         * class.cs (Property.Define): Fix iterators.
2216
2217         * iterators.cs (Iterator.Define): Moved the
2218         `container.AddInterator (this)' call here from the .ctor; only do
2219         it if we resolved successfully.
2220
2221 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2222
2223         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2224         `true' for preprocessing directives that we parse.  The return
2225         value indicates whether we should return to regular tokenizing or
2226         not, not whether it was parsed successfully.
2227
2228         In the past if we were in: #if false ... #line #endif, we would
2229         resume parsing after `#line'.  See bug 61604.
2230
2231         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2232         building: IsEnumType should return true only for enums, not for
2233         enums or System.Enum itself.  This fixes #61593.
2234
2235         Likely what happened is that corlib was wrong: mcs depended on
2236         this bug in some places.  The bug got fixed, we had to add the
2237         hack, which caused bug 61593.
2238
2239         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2240         that was a workaround for the older conditions.
2241
2242 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2243
2244         * assign.cs: IAssignMethod has a new interface, as documented
2245         inline. All assignment code now uses this new api.
2246
2247         * ecore.cs, expression.cs: All classes which implement
2248         IAssignMethod now use the new interface.
2249
2250         * expression.cs (Invocation): add a hack to EmitCall so that
2251         IndexerAccess can be the target of a compound assignment without
2252         evaluating its arguments twice.
2253
2254         * statement.cs: Handle changes in Invocation api.
2255
2256 2004-07-16  Martin Baulig  <martin@ximian.com>
2257
2258         * iterators.cs: Rewrote this.  We're now using one single Proxy
2259         class for both the IEnumerable and the IEnumerator interface and
2260         `Iterator' derives from Class so we can use the high-level API.
2261
2262         * class.cs (TypeContainer.AddIterator): New method.
2263         (TypeContainer.DoDefineType): New protected virtual method, which
2264         is called from DefineType().
2265         (TypeContainer.DoDefineMembers): Call DefineType() and
2266         DefineMembers() on all our iterators.
2267         (TypeContainer.Emit): Call Emit() on all our iterators.
2268         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2269
2270         * codegen.cs (EmitContext.CurrentIterator): New public field.
2271
2272 2004-07-15  Martin Baulig  <martin@ximian.com>
2273
2274         * typemanager.cs
2275         (TypeManager.not_supported_exception_type): New type.   
2276
2277 2004-07-14  Martin Baulig  <martin@ximian.com>
2278
2279         * iterators.cs: Use real error numbers.
2280
2281 2004-07-14  Martin Baulig  <martin@ximian.com>
2282
2283         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2284         requires this to be a System.Collection.IEnumerable and not a
2285         class implementing that interface.
2286         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2287
2288 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2289
2290         * class.cs: Fixed previous fix, it broke some error tests.
2291
2292 2004-07-12  Martin Baulig  <martin@ximian.com>
2293
2294         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2295         Fixes #61293.
2296
2297 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2298
2299         * assign.cs (LocalTemporary): Add new argument: is_address,If
2300         `is_address' is true, then the value that we store is the address
2301         to the real value, and not the value itself.
2302         
2303         * ecore.cs (PropertyExpr): use the new local temporary
2304         stuff to allow us to handle X.Y += z (where X is a struct)
2305
2306 2004-07-08  Martin Baulig  <martin@ximian.com>
2307
2308         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2309         not always return, just like we're doing in Using.Resolve().
2310
2311 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2312
2313         * cs-parser.jay (fixed_statement): flag this as Pinned.
2314
2315 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2316
2317         * typemanager.cs (TypeManager): Removed MakePinned method, this
2318         mechanism is replaced with the .NET 2.x compatible mechanism of
2319         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2320
2321         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2322         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2323         `IsFixed' property which has a different meaning.
2324
2325 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2326
2327         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2328         visible from inside a nested class, not just the names of the
2329         immediately enclosing class.
2330         Fix for bug #60730.
2331
2332 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2333
2334         * expression.cs (BetterConversion): Remove buggy special-case
2335         handling of "implicit constant expression conversions".  At this
2336         point, we already know that the conversion is possible -- we're
2337         only checking to see which is better.
2338
2339 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2340
2341         * cs-parser.jay: Added error CS0210 test.
2342
2343 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2344
2345         * cs-parser.jay: Added error CS0134 test.
2346
2347 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2348
2349         Fix bug #52507
2350         * cs-parser.jay: Added error CS0145 test.
2351
2352 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2353
2354         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2355
2356 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2357         
2358         * expression.cs (StackAlloc.Resolve): The argument may not
2359         be a constant; deal with this case.
2360         
2361 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2362
2363         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2364         GetIndexerAttributeValue.
2365         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2366
2367         * class.cs (Indexer.Define): Added error tests for CS0415,
2368         CS0609.
2369
2370 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2371
2372         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2373         property code.
2374
2375 2004-06-23  Martin Baulig  <martin@ximian.com>
2376
2377         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2378         neither return nor throw, reset the barrier as well.  Fixes #60457.
2379
2380 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2381
2382         * class.cs : EventAttributes is now set to None by default.
2383           This fixes bug #60459.
2384
2385 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2386
2387         Fix bug #60219
2388         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2389         Don't throw exception but return null (it's sufficient now).
2390
2391 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2392
2393         * typemanager.cs (GetArgumentTypes): Faster implementation.
2394
2395 2004-06-18  Martin Baulig  <martin@ximian.com>
2396
2397         * attribute.cs (Attribute.Resolve): Check whether we're an
2398         EmptyCast which a Constant child.  Fixes #60333.
2399
2400 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2401
2402         * statement.cs (EmitCollectionForeach): Account for the fact that
2403         not all valuetypes are in areas which we can take the address of.
2404         For these variables, we store to a temporary variable. Also, make
2405         sure that we dont emit a `callvirt' on a valuetype method.
2406
2407 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2408
2409         * expression.cs (StackAlloc.DoReSolve): Added test for
2410         negative parameter (CS0247).
2411
2412 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2413
2414         Fix bug #59792
2415         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2416
2417 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2418
2419         Fix bug #59781
2420         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2421         ulong.
2422
2423 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2424
2425         Fix bug #58254 & cs1555.cs, cs1556.cs
2426         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2427
2428 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2429
2430         * cs-parser.jay: Added error CS1669 test for indexers.
2431
2432 2004-06-11  Martin Baulig  <martin@ximian.com>
2433
2434         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2435         call this twice: for params and varargs methods.
2436
2437 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2438
2439         * class.cs:
2440         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2441
2442 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2443
2444         * attribute.cs (Attribute.GetValidTargets): Made public.
2445
2446         * class.cs: 
2447         (AbstractPropertyEventMethod): New class for better code sharing.
2448         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2449         CS1667 report.
2450         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2451
2452 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2453
2454         Fix bug #59477.
2455         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2456         that the call to Resolve is part of a MemberAccess.
2457         (Expression.Resolve): Use it for SimpleName resolution.
2458         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2459         Add 'intermediate' boolean argument.
2460         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2461         error message when the SimpleName can be resolved ambiguously
2462         between an expression and a type.
2463         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2464         public.
2465         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2466         call on the left-side.
2467
2468 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2469
2470         * class.cs:
2471         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2472
2473 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2474
2475         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2476
2477 2004-06-11  Martin Baulig  <martin@ximian.com>
2478
2479         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2480         varargs methods if applicable.
2481
2482 2004-06-11  Martin Baulig  <martin@ximian.com>
2483
2484         * expression.cs (Invocation.EmitCall): Don't use
2485         `method.CallingConvention == CallingConventions.VarArgs' since the
2486         method could also have `CallingConventions.HasThis'.
2487
2488 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2489
2490         * class.cs (Event.GetSignatureForError): Implemented.
2491         Fixed crash in error test cs3010.cs
2492
2493 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2494
2495         * cs-tokenizer.cs: Change the way we track __arglist to be
2496         consistent with the other keywords.
2497
2498 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2499
2500         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2501         tomorrow.
2502
2503 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2504
2505         * codegen.cs: Check that all referenced assemblies have a strongname
2506         before strongnaming the compiled assembly. If not report error CS1577.
2507         Fix bug #56563. Patch by Jackson Harper.
2508         * typemanager.cs: Added a method to return all referenced assemblies.
2509         Fix bug #56563. Patch by Jackson Harper.
2510
2511 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2512
2513         * class.cs:
2514         (Method.ApplyAttributeBuilder): Moved and added conditional
2515         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2516
2517         * delegate.cs:
2518         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2519
2520 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2521
2522         Fixed #59640
2523         * class.cs: (EventField.attribute_targets): Changed default target.
2524
2525 2004-06-08  Martin Baulig  <martin@ximian.com>
2526
2527         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2528
2529 2004-06-08  Martin Baulig  <martin@ximian.com>
2530
2531         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2532
2533 2004-06-07  Martin Baulig  <martin@ximian.com>
2534
2535         Added support for varargs methods.
2536
2537         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2538         keyword.
2539
2540         * cs-parser.jay: Added support for `__arglist'.
2541
2542         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2543
2544         * expression.cs (Argument.AType): Added `ArgList'.
2545         (Invocation): Added support for varargs methods.
2546         (ArglistAccess): New public class.
2547         (Arglist): New public class.
2548
2549         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
2550
2551         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
2552         a method's top-level block if the method has varargs.
2553
2554         * support.cs (ReflectionParameters, InternalParameters): Added
2555         support for varargs methods.    
2556
2557 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
2558
2559         * class.cs: Provide location in indexer error report.
2560
2561         * driver.cs: Use standard names.
2562
2563         * namespace.cs: Catch the use of using after a namespace has been
2564         declared also on using aliases.
2565
2566 2004-06-03  Raja R Harinath  <rharinath@novell.com>
2567
2568         Bug #50820.
2569         * typemanager.cs (closure_private_ok, closure_invocation_type)
2570         (closure_qualifier_type, closure_invocation_assembly)
2571         (FilterWithClosure): Move to ...
2572         (Closure): New internal nested class.
2573         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
2574         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
2575         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
2576         (MemberLookup, MemberLookupFailed): Use it.
2577         * expression.cs (New.DoResolve): Treat the lookup for the
2578         constructor as being qualified by the 'new'ed type.
2579         (Indexers.GetIndexersForTypeOrInterface): Update.
2580
2581 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
2582
2583         * attribute.cs
2584         (GetConditionalAttributeValue): New method. Returns
2585         condition of ConditionalAttribute.
2586         (SearchMulti): New method.  Returns all attributes of type 't'.
2587         Use it when attribute is AllowMultiple = true.
2588         (IsConditionalMethodExcluded): New method.
2589
2590         * class.cs
2591         (Method.IsExcluded): Implemented. Returns true if method has conditional
2592         attribute and the conditions is not defined (method is excluded).
2593         (IMethodData): Extended interface for ConditionalAttribute support.
2594         (PropertyMethod.IsExcluded): Implemented.
2595
2596         * decl.cs
2597         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
2598
2599         * expression.cs
2600         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
2601         on the method.
2602
2603 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
2604
2605         * expression.cs (ArrayCreationExpression): Make this just an
2606         `expression'. It can't be a statement, so the code here was
2607         dead.
2608
2609 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2610
2611         Fixed #59072
2612         * typemanager.cs (GetFullNameSignature): New method for
2613         MethodBase types.
2614
2615 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
2616
2617         Fixed #56452
2618         * class.cs (MemberBase.GetSignatureForError): New virtual method.
2619         Use this method when MethodBuilder is null.
2620         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
2621         Added test for error CS0626 (MONO reports error for this situation).
2622         (IMethodData.GetSignatureForError): Extended interface.
2623
2624 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2625
2626         * attribute.cs
2627         (AttributeTester.GetObsoleteAttribute): Returns instance of
2628         ObsoleteAttribute when type is obsolete.
2629
2630         * class.cs
2631         (TypeContainer.VerifyObsoleteAttribute): Override.
2632         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2633         (MethodCode.VerifyObsoleteAttribute): Override.
2634         (MemberBase.VerifyObsoleteAttribute): Override.
2635
2636         * decl.cs
2637         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2638         and report proper error.
2639
2640         *delegate.cs
2641         Delegate.VerifyObsoleteAttribute): Override.
2642
2643         * ecore.cs
2644         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2645         and report proper error.
2646         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2647
2648         * enum.cs
2649         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2650         and enum member.
2651
2652         * expression.cs
2653         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2654         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2655         Added test for ObsoleteAttribute.
2656
2657         * statement.cs
2658         (Catch): Derived from Statement.
2659
2660 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
2661  
2662         Fixed bug #59071 & cs0160.cs
2663  
2664         * statement.cs (Try.Resolve): Check here whether order of catch
2665         clauses matches their dependencies.
2666
2667 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
2668
2669         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
2670         caused a regression: #59343.  Referencing nested classes from an
2671         assembly stopped working.
2672
2673 2004-05-31  Martin Baulig  <martin@ximian.com>
2674
2675         MCS is now frozen for beta 2.
2676
2677 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2678
2679         * convert.cs: add a trivial cache for overload operator resolution.
2680
2681 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2682
2683         * decl.cs: If possible, use lookuptypedirect here. We can only do
2684         this if there is no `.' after the namespace. Avoids using
2685         LookupType, which does lots of slow processing.
2686         (FindNestedType) New method, does what it says :-).
2687         * namespace.cs: use LookupTypeDirect.
2688         * rootcontext.cs: use membercache, if possible.
2689         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2690
2691 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2692
2693         * expression.cs:
2694         According to the spec, 
2695
2696         In a member access of the form E.I, if E is a single identifier,
2697         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2698         field, property, localvariable, or parameter with the same type as
2699         the meaning of E as a type-name (§3.8), then both possible
2700         meanings of E are permitted.
2701
2702         We did not check that E as a simple-name had the same type as E as
2703         a type name.
2704
2705         This trivial check gives us 5-7% on bootstrap time.
2706
2707 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2708
2709         * expression.cs (Invocation.OverloadResolve): Avoid the
2710         use of hashtables and boxing here by allocating on demand.
2711
2712 2004-05-30  Martin Baulig  <martin@ximian.com>
2713
2714         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2715         we're doing a silent lookup.  Don't try to lookup nested types in
2716         TypeManager.object_type (thanks to Ben Maurer).
2717
2718 2004-05-30  Martin Baulig  <martin@ximian.com>
2719
2720         Committing a patch from Ben Maurer.
2721
2722         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2723
2724 2004-05-29  Martin Baulig  <martin@ximian.com>
2725
2726         * class.cs (IMethodData.ShouldIgnore): New method.
2727
2728         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2729         `Location' argument, we don't need it anywhere.  Use
2730         `IMethodData.ShouldIgnore ()' instead of
2731         `MethodData.GetMethodFlags ()'.
2732         (TypeManager.AddMethod): Removed.
2733         (TypeManager.AddMethod2): Renamed to AddMethod.
2734
2735 2004-05-29  Martin Baulig  <martin@ximian.com>
2736
2737         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2738
2739         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2740         converting from a class type S to an interface type and we already
2741         have an object on the stack, don't box it again.  Fixes #52578.
2742
2743 2004-05-29  Martin Baulig  <martin@ximian.com>
2744
2745         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2746         Added support for `params' parameters.  Fixes #59267.
2747
2748 2004-05-29  Martin Baulig  <martin@ximian.com>
2749
2750         * literal.cs (NullPointer): Provide a private .ctor which sets
2751         `type' to TypeManager.object_type.  Fixes #59048.
2752
2753 2004-05-29  Martin Baulig  <martin@ximian.com>
2754
2755         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2756         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2757
2758         * ecore.cs (EventExpr.instance_expr): Make the field private.
2759
2760 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2761
2762         Fixed bug #50080 & cs0214-2.cs
2763         * expression.cs (Cast.DoResolve): Check unsafe context here.
2764         
2765         * statement.cs (Resolve.DoResolve): Likewise.
2766
2767 2004-05-26  Martin Baulig  <martin@ximian.com>
2768
2769         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2770
2771         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2772         (RootContext.LookupType): Pass down the `silent' flag.
2773
2774 2004-05-25  Martin Baulig  <martin@ximian.com>
2775
2776         * expression.cs
2777         (MethodGroupExpr.IdenticalTypeName): New public property.
2778         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2779         expression actually refers to a type.
2780
2781 2004-05-25  Martin Baulig  <martin@ximian.com>
2782
2783         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2784         for #56176 and made it actually work.
2785
2786 2004-05-25  Martin Baulig  <martin@ximian.com>
2787
2788         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2789         (FieldExpr, PropertyExpr): Override and implement
2790         CacheTemporaries.  Fixes #52279.
2791
2792 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2793
2794         * location.cs: In the new compiler listing a file twice is a
2795         warning, not an error.
2796
2797 2004-05-24  Martin Baulig  <martin@ximian.com>
2798
2799         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2800         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2801
2802 2004-05-24  Martin Baulig  <martin@ximian.com>
2803
2804         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2805         walking the `using' list.  Fixes #53921.
2806
2807 2004-05-24  Martin Baulig  <martin@ximian.com>
2808
2809         * const.cs (Const.LookupConstantValue): Added support for
2810         EmptyCast's; fixes #55251.
2811
2812 2004-05-24  Martin Baulig  <martin@ximian.com>
2813
2814         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2815         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2816         which does the CS0135 check.  The reason is that we first need to
2817         check whether the variable actually exists.
2818
2819 2004-05-24  Martin Baulig  <martin@ximian.com>
2820
2821         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2822         than RootContext.LookupType() to find the explicit interface
2823         type.  Fixes #58584.
2824
2825 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2826
2827         * Makefile: Simplify.  Use executable.make.
2828         * mcs.exe.sources: New file.  List of sources of mcs.exe.
2829
2830 2004-05-24  Anders Carlsson  <andersca@gnome.org>
2831
2832         * decl.cs:
2833         * enum.cs:
2834         Use the invariant culture when doing String.Compare for CLS case
2835         sensitivity.
2836         
2837 2004-05-23  Martin Baulig  <martin@ximian.com>
2838
2839         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
2840         don't have any dots.  Fixes #52622, added cs0246-8.cs.
2841
2842         * namespace.cs (NamespaceEntry.Lookup): Likewise.
2843         
2844 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2845
2846         * class.cs (MemberBase.Define): Reuse MemberType member for 
2847         resolved type. Other methods can use it too.
2848
2849 2004-05-23  Martin Baulig  <martin@ximian.com>
2850
2851         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
2852         the variable also exists in the current block (otherwise, we need
2853         to report a CS0103).  Fixes #58670.
2854
2855 2004-05-23  Martin Baulig  <martin@ximian.com>
2856
2857         * flowanalysis.cs (Reachability.Reachable): Compute this
2858         on-the-fly rather than storing it as a field.
2859
2860 2004-05-23  Martin Baulig  <martin@ximian.com>
2861
2862         * flowanalysis.cs (Reachability.And): Manually compute the
2863         resulting `barrier' from the reachability.      
2864        
2865 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
2866
2867         Fix bug #57835
2868         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
2869         instance of ObsoleteAttribute when symbol is obsolete.
2870
2871         * class.cs
2872         (IMethodData): Extended interface for ObsoleteAttribute support.
2873
2874 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2875
2876         * attribute.cs: Fix bug #55970
2877
2878 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
2879
2880         Fix bug #52705
2881         * attribute.cs
2882         (GetObsoleteAttribute): New method. Creates the instance of
2883         ObsoleteAttribute.
2884         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
2885         ObsoleteAttribute when member is obsolete.
2886         (AttributeTester.Report_ObsoleteMessage): Common method for
2887         Obsolete error/warning reporting.
2888
2889         * class.cs
2890         (TypeContainer.base_classs_type): New member for storing parent type.
2891
2892         * decl.cs
2893         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
2894         for this MemberCore.
2895
2896 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2897
2898         * attribute.cs, const.cs: Fix bug #58590
2899
2900 2004-05-21  Martin Baulig  <martin@ximian.com>
2901
2902         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
2903         out parameters if the end of the method is unreachable.  Fixes
2904         #58098. 
2905
2906 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2907
2908         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
2909         Hari was right, why extra method.
2910
2911 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
2912
2913         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
2914
2915 2004-05-20  Martin Baulig  <martin@ximian.com>
2916
2917         Merged this back from gmcs to keep the differences to a minumum.
2918
2919         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
2920         instead of a Declspace.
2921         (Attribute.ResolveType): Likewise.
2922         (Attributes.Search): Likewise.
2923         (Attributes.Contains): Likewise.
2924         (Attributes.GetClsCompliantAttribute): Likewise.
2925
2926         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
2927         argument.
2928         (MethodData.ApplyAttributes): Take an EmitContext instead of a
2929         DeclSpace.
2930
2931 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
2932
2933         Fix bug #58688 (MCS does not report error when the same attribute
2934         is assigned twice)
2935
2936         * attribute.cs (Attribute.Emit): Distinction between null and default.
2937
2938 2004-05-19  Raja R Harinath  <rharinath@novell.com>
2939
2940         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
2941         of a top-level attribute without an attribute target.
2942         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
2943         Make non-static.
2944         (Attribute.Conditional_GetConditionName), 
2945         (Attribute.Obsolete_GetObsoleteMessage): Update.
2946         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
2947         part of ScanForIndexerName.
2948         (Attribute.CanIgnoreInvalidAttribute): New function.
2949         (Attribute.ScanForIndexerName): Move to ...
2950         (Attributes.ScanForIndexerName): ... here.
2951         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
2952         (Attributes.Search): New internal variant that can choose not to
2953         complain if types aren't resolved.  The original signature now
2954         complains.
2955         (Attributes.GetClsCompliantAttribute): Use internal variant, with
2956         complaints suppressed.
2957         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
2958         only if it not useful.
2959         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
2960         top-level for attributes that are shared between the assembly
2961         and a top-level class.
2962         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
2963         * class.cs: Update to reflect changes.
2964         (DefineIndexers): Fuse loops.
2965         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
2966         a couple more variants of attribute names.
2967
2968 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
2969
2970         Fix bug #52585 (Implemented explicit attribute declaration)
2971
2972         * attribute.cs:
2973         (Attributable.ValidAttributeTargets): New abstract method. It gets
2974         list of valid attribute targets for explicit target declaration.
2975         (Attribute.Target): It holds target itself.
2976         (AttributeSection): Removed.
2977         (Attribute.CheckTargets): New method. It checks whether attribute
2978         target is valid for the current element.
2979
2980         * class.cs:
2981         (EventProperty): New class. For events that are declared like
2982         property (with add and remove accessors).
2983         (EventField): New class. For events that are declared like field.
2984         class.cs
2985
2986         * cs-parser.jay: Implemented explicit attribute target declaration.
2987
2988         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
2989         Override ValidAttributeTargets.
2990
2991         * parameter.cs:
2992         (ReturnParameter): Class for applying custom attributes on 
2993         the return type.
2994         (ParameterAtribute): New class. Class for applying custom
2995         attributes on the parameter type.
2996
2997 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
2998
2999         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3000         definitions. 
3001
3002         (Method): Allow UNSAFE here.
3003
3004         * modifiers.cs: Support unsafe reporting.
3005
3006 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3007
3008         * decl.cs: Fix bug #58478.
3009
3010 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3011
3012         * statement.cs: When checking for unreachable code on an EmptyStatement,
3013         set the location. Fixes bug #58488.
3014
3015 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3016
3017         * driver.cs: Add -pkg handling.
3018
3019         From Gonzalo: UseShelLExecute=false
3020
3021 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3022
3023         * attribute.cs:
3024         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3025         for attribute.
3026         (Attribute.IsClsCompliaceRequired): Moved to base for better
3027         accesibility.
3028         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3029         when attribute is AttributeUsageAttribute.
3030         (Attribute.GetValidTargets): Simplified.
3031         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3032         attribute for this type.
3033         (Attribute.ApplyAttributes): Method renamed to Emit and make
3034         non-static.
3035         (GlobalAttributeSection): New class for special handling of global
3036         attributes (assembly, module).
3037         (AttributeSection.Emit): New method.
3038
3039         * class.cs: Implemented Attributable abstract methods.
3040         (MethodCore.LabelParameters): Moved to Parameter class.
3041         (Accessor): Is back simple class.
3042         (PropertyMethod): Implemented Attributable abstract class.
3043         (DelegateMethod): Implemented Attributable abstract class.
3044         (Event): New constructor for disctintion between normal Event
3045         and Event with accessors.
3046
3047         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3048
3049         * codegen.cs, const.cs, decl.cs, delegate.cs:
3050         (CommonAssemblyModulClass): Implemented Attributable abstract class
3051         and simplified.
3052
3053         * enum.cs: Implement IAttributeSupport interface.
3054         (EnumMember): New class for emum members. Implemented Attributable
3055         abstract class
3056
3057         * parameter.cs:
3058         (ParameterBase): Is abstract.
3059         (ReturnParameter): New class for easier [return:] attribute handling.
3060
3061         * typemanager.cs: Removed builder_to_attr.
3062
3063 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3064
3065         Fix bug #57151.
3066         * attribute.cs (Attribute.GetPositionalValue): New function.
3067         * class.cs (TypeContainer.VerifyMembers): New function.
3068         (TypeContainer.Emit): Use it.
3069         (ClassOrStruct): New base class for Class and Struct.
3070         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3071         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3072         class.
3073         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3074         then each non-static field should have a FieldOffset attribute.
3075         Otherwise, none of the fields should have a FieldOffset attribute.
3076         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3077         and FieldOffset attributes.
3078         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3079         (TypeManager.field_offset_attribute_type): New core types.
3080         (TypeManager.InitCoreTypes): Initialize them.
3081
3082 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3083
3084         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3085         Return correct type.
3086         From bug #58270.
3087
3088 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3089
3090         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3091         be implicitly converted to ulong.
3092         
3093         * expression.cs: The logic for allowing operator &, | and ^ worked
3094         was wrong, it worked before because we did not report an error in
3095         an else branch.  Fixes 57895.
3096
3097         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3098         allow volatile fields to be reference types.
3099
3100 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3101
3102         * driver.cs: Add support for /debug-
3103
3104 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3105
3106         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3107         Add a 'complain' parameter to silence errors.
3108         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3109         silently overlooked type-resolutions.
3110         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3111         to reflect changes.
3112         (Attributes.Search): New function.
3113         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3114         (Attributes.GetAttributeFullName): Remove hack.
3115         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3116         Update to reflect changes.
3117         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3118         Use Attributes.Search instead of nested loops.
3119
3120 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3121
3122         * decl.cs:
3123         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3124         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3125         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3126
3127         * report.cs: (Report.Warning): Renamed to Warning_T because of
3128         parameter collision.
3129
3130 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3131
3132         * expression.cs (MemberAccess.ResolveMemberAccess):
3133         Exit with non-zero status after Report.Error.
3134         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3135         Likewise.
3136         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3137
3138 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3139
3140         * support.cs: Don't hang when the file is empty.
3141
3142 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3143
3144         * support.cs: In SeekableStreamReader, compute the preamble size of the
3145           underlying stream. Position changes should take into account that initial
3146           count of bytes.
3147
3148 2004-05-03  Todd Berman  <tberman@sevenl.net>
3149
3150         * driver.cs: remove unused GetSysVersion function.
3151
3152 2004-05-03  Todd Berman  <tberman@sevenl.net>
3153
3154         * driver.cs: Remove the hack from saturday, as well as the hack
3155         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3156         link_paths to get that bit proper.
3157
3158 2004-05-01  Todd Berman  <tberman@sevenl.net>
3159
3160         * driver.cs: Try a LoadFrom before a Load, this checks the current
3161         path. This is currently a bug in mono that is be fixed, however, this
3162         provides a workaround for now. This will be removed when the bug
3163         is fixed.
3164
3165 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3166
3167         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3168         incomplete key pairs (#57941).
3169
3170 2004-05-01  Todd Berman  <tberman@sevenl.net>
3171
3172         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3173         from the GAC
3174
3175 2004-04-30  Jackson Harper  <jackson@ximian.com>
3176
3177         * codegen.cs: Open keys readonly.
3178         
3179 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3180
3181         * typemanager.cs: don't report cyclic struct layout when a struct
3182         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3183         which has 2 Pango.Rectangle fields.
3184
3185 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3186
3187         * expression.cs: Handle IntPtr comparisons with IL code
3188         rather than a method call.
3189
3190 2004-04-29  Martin Baulig  <martin@ximian.com>
3191
3192         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3193         the list of PropertyInfo's in class hierarchy and find the
3194         accessor.  Fixes #56013.
3195
3196 2004-04-29  Martin Baulig  <martin@ximian.com>
3197
3198         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3199
3200 2004-04-29  Martin Baulig  <martin@ximian.com>
3201
3202         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3203
3204         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3205
3206 2004-04-29  Martin Baulig  <martin@ximian.com>
3207
3208         * class.cs (ConstructorInitializer.Resolve): Check whether the
3209         parent .ctor is accessible.  Fixes #52146.
3210
3211 2004-04-29  Martin Baulig  <martin@ximian.com>
3212
3213         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3214
3215         * statement.cs (Using.EmitLocalVariableDecls): Use
3216         TypeManager.idisposable_type, not typeof (IDisposable).
3217         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3218
3219 2004-04-29  Martin Baulig  <martin@ximian.com>
3220
3221         * class.cs (Event.Define): Don't emit the field and don't set
3222         RTSpecialName and SpecialName for events on interfaces.  Fixes
3223         #57703. 
3224
3225 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3226
3227         Refactor Attribute.ApplyAttributes.
3228         * attribute.cs (Attributable): New base class for objects that can
3229         have Attributes applied on them.
3230         (Attribute): Make AttributeUsage fields public.
3231         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3232         (Attribute.IsInternalCall): New property.
3233         (Attribute.UsageAttr): Convert to a public read-only property.
3234         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3235         (Attribute.ResolveType, Attribute.Resolve)
3236         (Attribute.ScanForIndexerName): Update to reflect changes.
3237         (Attribute.CheckAttributeTarget): Re-format.
3238         (Attribute.ApplyAttributes): Refactor, to various
3239         Attributable.ApplyAttributeBuilder methods.
3240         * decl.cs (MemberCore): Make Attributable.
3241         * class.cs (Accessor): Make Attributable.
3242         (MethodData.ApplyAttributes): Use proper attribute types, not
3243         attribute names.
3244         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3245         (TypeContainer.ApplyAttributeBuilder)
3246         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3247         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3248         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3249         (Operator.ApplyAttributeBuilder): New factored-out methods.
3250         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3251         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3252         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3253         * parameter.cs (ParameterBase): New Attributable base class
3254         that can also represent Return types.
3255         (Parameter): Update to the changes.
3256
3257 2004-04-29  Jackson Harper  <jackson@ximian.com>
3258
3259         * driver.cs: Prefer the corlib system version when looking for
3260         assemblies in the GAC. This is still a hack, but its a better hack
3261         now.
3262         
3263 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3264
3265         * decl.cs, enum.cs: Improved error 3005 reporting.
3266   
3267         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3268         (related_symbols): New private member for list of symbols
3269         related to reported error/warning.
3270         
3271         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3272
3273 2004-04-29  Martin Baulig  <martin@ximian.com>
3274
3275         * ecore.cs (Expression.Constantify): If we're an enum and
3276         TypeManager.TypeToCoreType() doesn't give us another type, use
3277         t.UnderlyingSystemType.  Fixes #56178.  
3278
3279 2004-04-29  Martin Baulig  <martin@ximian.com>
3280
3281         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3282         interfaces and for each interface, only add members directly
3283         declared in that interface.  Fixes #53255.
3284
3285 2004-04-28  Martin Baulig  <martin@ximian.com>
3286
3287         * expression.cs (ConditionalLogicalOperator): Use a temporary
3288         variable for `left' to avoid that we evaluate it more than once;
3289         bug #52588.
3290
3291 2004-04-28  Martin Baulig  <martin@ximian.com>
3292
3293         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3294         `void[]' (CS1547).
3295
3296 2004-04-28  Martin Baulig  <martin@ximian.com>
3297
3298         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3299         void (CS1547).
3300
3301         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3302         whether the type is not void (CS1547).
3303
3304 2004-04-28  Martin Baulig  <martin@ximian.com>
3305
3306         * expression.cs (Unary.DoResolveLValue): Override this and report
3307         CS0131 for anything but Operator.Indirection.
3308
3309 2004-04-28  Martin Baulig  <martin@ximian.com>
3310
3311         Committing a patch from Ben Maurer; see bug #50820.
3312
3313         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3314         check for classes.
3315
3316         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3317         classes.        
3318
3319 2004-04-28  Martin Baulig  <martin@ximian.com>
3320
3321         Committing a patch from Ben Maurer; see bug #50820.
3322
3323         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3324         check for classes.
3325
3326         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3327         classes.        
3328
3329 2004-04-28  Martin Baulig  <martin@ximian.com>
3330
3331         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3332         (Block.AddLabel): Call DoLookupLabel() to only search in the
3333         current block.
3334
3335 2004-04-28  Martin Baulig  <martin@ximian.com>
3336
3337         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3338         comparing StringConstants and NullLiterals in Equality and Inequality.
3339
3340 2004-04-28  Jackson Harper  <jackson@ximian.com>
3341
3342         * driver.cs: Attempt to load referenced assemblies from the
3343         GAC. This is the quick and dirty version of this method that
3344         doesnt take into account versions and just takes the first
3345         canidate found. Will be good enough for now as we will not have more
3346         then one version installed into the GAC until I update this method.
3347
3348 2004-04-28  Martin Baulig  <martin@ximian.com>
3349
3350         * typemanager.cs (TypeManager.CheckStructCycles): New public
3351         static method to check for cycles in the struct layout.
3352
3353         * rootcontext.cs (RootContext.PopulateTypes): Call
3354         TypeManager.CheckStructCycles() for each TypeContainer.
3355         [Note: We only need to visit each type once.]
3356
3357 2004-04-28  Martin Baulig  <martin@ximian.com>
3358
3359         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3360
3361         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3362         success and added `out object value'.  Use a `bool resolved' field
3363         to check whether we've already been called rather than
3364         `ConstantValue != null' since this breaks for NullLiterals.
3365
3366 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3367
3368         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3369         setting of this flag, since the 'set' method may be non-public.
3370
3371 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3372
3373         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3374         check on current_vector.Block.
3375
3376 2004-04-27  Martin Baulig  <martin@ximian.com>
3377
3378         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3379         a field initializer.  Fixes #56459.
3380
3381 2004-04-27  Martin Baulig  <martin@ximian.com>
3382
3383         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3384         we're not attempting to use an indexer.  Fixes #52154.
3385
3386 2004-04-27  Martin Baulig  <martin@ximian.com>
3387
3388         * statement.cs (Return): Don't create a return label if we don't
3389         need it; reverts my change from January 20th.  Thanks to Ben
3390         Maurer for this.
3391
3392 2004-04-27  Martin Baulig  <martin@ximian.com>
3393
3394         According to the spec, `goto' can only leave a nested scope, but
3395         never enter it.
3396
3397         * statement.cs (Block.LookupLabel): Only lookup in the current
3398         block, don't recurse into parent or child blocks.
3399         (Block.AddLabel): Check in parent and child blocks, report
3400         CS0140/CS0158 if we find a duplicate.
3401         (Block): Removed this indexer for label lookups.
3402         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3403         this already does the error reporting for us.
3404
3405         * flowanalysis.cs
3406         (FlowBranching.UsageVector.Block): New public variable; may be null.
3407         (FlowBranching.CreateSibling): Added `Block' argument.
3408         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3409         label for the target of a `goto' and check whether we're not
3410         leaving a `finally'.
3411
3412 2004-04-27  Martin Baulig  <martin@ximian.com>
3413
3414         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3415         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3416         just for returns).
3417
3418 2004-04-27  Martin Baulig  <martin@ximian.com>
3419
3420         * statement.cs (Block.AddLabel): Also check for implicit blocks
3421         and added a CS0158 check.
3422
3423 2004-04-27  Martin Baulig  <martin@ximian.com>
3424
3425         * flowanalysis.cs (FlowBranchingLoop): New class.
3426         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3427         UsageVector's instead of an ArrayList.
3428         (FlowBranching.Label): Likewise.
3429         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3430         (FlowBranching.AddBreakVector): New method.
3431
3432 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3433
3434         * attribute.cs: Small regression fix: only convert the type if we
3435         the type is different, fixes System.Drawing build.
3436
3437 2004-04-27  Martin Baulig  <martin@ximian.com>
3438
3439         * attribute.cs (Attribute.Resolve): If we have a constant value
3440         for a named field or property, implicity convert it to the correct
3441         type.
3442
3443 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3444
3445         * statement.cs (Block.Block): Implicit blocks share
3446         'child_variable_names' fields with parent blocks.
3447         (Block.AddChildVariableNames): Remove.
3448         (Block.AddVariable): Mark variable as "used by a child block" in
3449         every surrounding block.
3450         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3451         been used in a child block, complain about violation of "Invariant
3452         meaning in blocks" rule.
3453         * cs-parser.jay (declare_local_variables): Don't use
3454         AddChildVariableNames.
3455         (foreach_statement): Don't create an implicit block: 'foreach'
3456         introduces a scope.
3457
3458 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3459
3460         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3461         converting from 0L to ulong.  Fixes 57522.
3462
3463 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3464
3465         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3466         derived class hides via 'new' keyword field from base class (test-242.cs).
3467         TODO: Handle this in the more general way.
3468         
3469         * class.cs (CheckBase): Ditto.
3470
3471 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3472
3473         * decl.cs (caching_flags): New member for storing cached values
3474         as bit flags.
3475         (MemberCore.Flags): New enum where bit flags for caching_flags
3476         are defined.
3477         (MemberCore.cls_compliance): Moved to caching_flags.
3478         (DeclSpace.Created): Moved to caching_flags.
3479
3480         * class.cs: Use caching_flags instead of DeclSpace.Created
3481         
3482 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3483
3484         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3485         if we are only a derived class, not a nested class.
3486
3487         * typemanager.cs: Same as above, but do this at the MemberLookup
3488         level (used by field and methods, properties are handled in
3489         PropertyExpr).   Allow for the qualified access if we are a nested
3490         method. 
3491
3492 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3493
3494         * class.cs: Refactoring.
3495         (IMethodData): New inteface; Holds links to parent members
3496         to avoid member duplication (reduced memory allocation).
3497         (Method): Implemented IMethodData interface.
3498         (PropertyBase): New inner classes for get/set methods.
3499         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3500         (Event): New inner classes for add/remove methods.
3501         (Event.DelegateMethod): Implemented IMethodData interface.
3502
3503         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3504         EmitContext (related to class.cs refactoring).
3505
3506 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3507
3508         * delegate.cs (Delegate.VerifyApplicability): If the number of
3509         arguments are the same as the number of parameters, first try to
3510         verify applicability ignoring  any 'params' modifier on the last
3511         parameter.
3512         Fixes #56442.
3513
3514 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3515
3516         * class.cs (TypeContainer.AddIndexer): Use
3517         'ExplicitInterfaceName' to determine if interface name was
3518         explicitly specified.  'InterfaceType' is not initialized at this time.
3519         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3520         Indexers array is already in the required order.  Initialize
3521         'IndexerName' only if there are normal indexers.
3522         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3523         (TypeContainer.Emit): Emit DefaultMember attribute only if
3524         IndexerName is initialized.
3525         Fixes #56300.
3526
3527 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3528
3529         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3530         Fixes #57007
3531
3532 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3533
3534         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3535         attributes.
3536         Fix for #56456.
3537
3538         * attribute.cs (Attribute.Resolve): Check for duplicate named
3539         attributes.
3540         Fix for #56463.
3541
3542 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3543
3544         * iterators.cs (MarkYield): track whether we are in an exception,
3545         and generate code accordingly.  Use a temporary value to store the
3546         result for our state.
3547
3548         I had ignored a bit the interaction of try/catch with iterators
3549         since their behavior was not entirely obvious, but now it is
3550         possible to verify that our behavior is the same as MS .NET 2.0
3551
3552         Fixes 54814
3553
3554 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3555
3556         * iterators.cs: Avoid creating temporaries if there is no work to
3557         do. 
3558
3559         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3560         Enumerations, use TypeManager.EnumToUnderlying and call
3561         recursively. 
3562
3563         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3564         bug #57013
3565
3566         (This.Emit): Use EmitContext.EmitThis to emit our
3567         instance variable.
3568
3569         (This.EmitAssign): Ditto.
3570
3571         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3572         codepaths, we will move all the functionality into
3573         Mono.CSharp.This 
3574
3575         (FieldExpr.EmitAssign): Ditto.
3576
3577         This fixes several hidden bugs that I uncovered while doing a code
3578         review of this today.
3579
3580         * codegen.cs (EmitThis): reworked so the semantics are more clear
3581         and also support value types "this" instances.
3582
3583         * iterators.cs: Changed so that for iterators in value types, we
3584         do not pass the value type as a parameter.  
3585
3586         Initialization of the enumerator helpers is now done in the caller
3587         instead of passing the parameters to the constructors and having
3588         the constructor set the fields.
3589
3590         The fields have now `assembly' visibility instead of private.
3591
3592 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3593
3594         * expression.cs (Argument.Resolve): Check if fields passed as ref
3595         or out are contained in a MarshalByRefObject.
3596
3597         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3598         another compiler type.
3599
3600 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3601
3602         * class.cs (Indexer.Define): use the new name checking method.
3603         Also, return false on an error.
3604         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3605         (is_identifier_[start/part]_character): make static.
3606
3607 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3608
3609         * expression.cs (Binary.ResolveOperator): Do no append strings
3610         twice: since we can be invoked more than once (array evaluation)
3611         on the same concatenation, take care of this here.  Based on a fix
3612         from Ben (bug #56454)
3613
3614 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3615
3616         * codegen.cs: Fix another case where CS1548 must be reported (when 
3617         delay-sign isn't specified and no private is available #56564). Fix
3618         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3619         error when MCS is used on the MS runtime and we need to delay-sign 
3620         (which seems unsupported by AssemblyBuilder - see #56621).
3621
3622 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3623
3624         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3625         (TypeManager.ComputeNamespaces): Faster implementation for
3626         Microsoft runtime.
3627
3628         * compiler.csproj: Updated AssemblyName to mcs.
3629
3630 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
3631
3632         * rootcontext.cs: Add new types to the boot resolution.
3633
3634         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
3635         MulticastDelegate is not allowed.
3636
3637         * typemanager.cs: Add new types to lookup: System.TypedReference
3638         and ArgIterator.
3639
3640         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
3641         check for TypedReference or ArgIterator, they are not allowed. 
3642
3643         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
3644         makes us properly catch 1510 in some conditions (see bug 56016 for
3645         details). 
3646
3647 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
3648
3649         * CryptoConvert.cs: update from corlib version
3650         with endian fixes.
3651
3652 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
3653
3654         * class.cs (Indexer.Define): Check indexername declaration
3655
3656 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
3657
3658         * attribute.cs (IsClsCompliant): Fixed problem with handling
3659         all three states (compliant, not-compliant, undetected).
3660
3661 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
3662
3663         * attribute.cs (Attribute): Location is now public.
3664         (Resolve): Store resolved arguments (pos_values) in attribute class.
3665         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
3666         (GetClsCompliantAttributeValue): New method that gets
3667         CLSCompliantAttribute value.
3668         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
3669         if exists else null.
3670         (AttributeTester): New class for CLS-Compliant verification routines.
3671
3672         * class.cs (Emit): Add CLS-Compliant verification.
3673         (Method.GetSignatureForError): Implemented.
3674         (Constructor.GetSignatureForError): Implemented
3675         (Constructor.HasCompliantArgs): Returns if constructor has
3676         CLS-Compliant arguments.
3677         (Constructor.Emit): Override.
3678         (Construcor.IsIdentifierClsCompliant): New method; For constructors
3679         is needed to test only parameters.
3680         (FieldBase.GetSignatureForError): Implemented.
3681         (TypeContainer): New member for storing base interfaces.
3682         (TypeContainer.FindMembers): Search in base interfaces too.
3683
3684         * codegen.cs (GetClsComplianceAttribute): New method that gets
3685         assembly or module CLSCompliantAttribute value.
3686         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
3687         for assembly.
3688         (ModuleClass.Emit): Add error 3012 test.
3689
3690         * const.cs (Emit): Override and call base for CLS-Compliant tests.
3691
3692         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
3693         state for all decl types.
3694         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
3695         if CLS-Compliant tests are required.
3696         (IsClsCompliaceRequired): New method. Analyze whether code
3697         must be CLS-Compliant.
3698         (IsExposedFromAssembly): New method. Returns true when MemberCore
3699         is exposed from assembly.
3700         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
3701         value or gets cached value.
3702         (HasClsCompliantAttribute): New method. Returns true if MemberCore
3703         is explicitly marked with CLSCompliantAttribute.
3704         (IsIdentifierClsCompliant): New abstract method. This method is
3705         used to testing error 3005.
3706         (IsIdentifierAndParamClsCompliant): New method. Common helper method
3707         for identifier and parameters CLS-Compliant testing.
3708         (VerifyClsCompliance): New method. The main virtual method for
3709         CLS-Compliant verifications.
3710         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
3711         null. I don't know why is null (too many public members !).
3712         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
3713         and get value of first CLSCompliantAttribute that found.
3714
3715         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
3716         (VerifyClsCompliance): Override and add extra tests.
3717
3718         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
3719         clscheck- disable CLS-Compliant verification event if assembly is has
3720         CLSCompliantAttribute(true).
3721
3722         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
3723         ApllyAttribute is now called in emit section as in the other cases.
3724         Possible future Emit integration.
3725         (IsIdentifierClsCompliant): New override.
3726         (VerifyClsCompliance): New override.
3727         (GetEnumeratorName): Returns full enum name.
3728
3729         * parameter.cs (GetSignatureForError): Implemented.
3730
3731         * report.cs (WarningData): New struct for Warning message information.
3732         (LocationOfPreviousError): New method.
3733         (Warning): New method. Reports warning based on the warning table.
3734         (Error_T): New method. Reports error based on the error table.
3735
3736         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
3737         verifications are done here.
3738
3739         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
3740
3741         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
3742         CLSCompliantAttribute.
3743         (all_imported_types): New member holds all imported types from other
3744         assemblies.
3745         (LoadAllImportedTypes): New method fills static table with exported types
3746         from all referenced assemblies.
3747         (Modules): New property returns all assembly modules.
3748
3749 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
3750
3751         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
3752         throwing a parser error.
3753
3754         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
3755         which removes the hardcoded get_/set_ prefixes for properties, as
3756         IL allows for the properties to be named something else.  
3757
3758         Bug #56013
3759
3760         * expression.cs: Do not override operand before we know if it is
3761         non-null.  Fix 56207
3762
3763 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3764
3765         * typemanager.cs: support for pinned variables.
3766
3767 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3768
3769         * decl.cs, typemanager.cs: Avoid using an arraylist
3770         as a buffer if there is only one result set.
3771
3772 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3773
3774         * expression.cs: Make sure you cant call a static method
3775         with an instance expression, bug #56174.
3776
3777 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3778
3779         * class.cs (IsDuplicateImplementation): Improve error reporting to
3780         flag 663 (method only differs in parameter modifier).
3781
3782         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3783         in preprocessor directives.
3784
3785         * location.cs (LookupFile): Allow for the empty path.
3786
3787         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3788         better approach for some of that patch, but its failing with the
3789         CharSet enumeration.  For now try/catch will do.
3790
3791         * typemanager.cs: Do not crash if a struct does not have fields.
3792         Fixes 56150.
3793
3794 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3795
3796         * expression.cs: cs0213, cant fix a fixed expression.
3797         fixes 50231.
3798
3799 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3800
3801         * cs-parser.jay: detect invalid embeded statements gracefully.
3802         bug #51113.
3803
3804 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3805
3806         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3807         As a regex:
3808         s/
3809         the invocation type may not be a subclass of the tye of the item/
3810         The type of the item must be a subclass of the invocation item.
3811         /g
3812
3813         Fixes bug #50820.
3814
3815 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3816
3817         * attribute.cs: Added methods to get a string and a bool from an
3818         attribute. Required to information from AssemblyKeyFileAttribute,
3819         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3820         * codegen.cs: Modified AssemblyName creation to include support for
3821         strongnames. Catch additional exceptions to report them as CS1548.
3822         * compiler.csproj: Updated include CryptoConvert.cs.
3823         * compiler.csproj.user: Removed file - user specific configuration.
3824         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3825         Mono.Security assembly. The original class is maintained and tested in
3826         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3827         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3828         like CSC 8.0 (C# v2) supports.
3829         * Makefile: Added CryptoConvert.cs to mcs sources.
3830         * rootcontext.cs: Added new options for strongnames.
3831
3832 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3833
3834         * driver.cs: For --expect-error, report error code `2'
3835         if the program compiled with no errors, error code `1' if
3836         it compiled with an error other than the one expected.
3837
3838 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3839
3840         * compiler.csproj: Updated for Visual Studio .NET 2003.
3841         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3842         * compiler.sln: Updated for Visual Studio .NET 2003.
3843
3844 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3845
3846         * expression.cs: Fix bug #47234. We basically need to apply the
3847         rule that we prefer the conversion of null to a reference type
3848         when faced with a conversion to 'object' (csc behaviour).
3849
3850 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3851
3852         * statement.cs: Shorter form for foreach, eliminates
3853         a local variable. r=Martin.
3854
3855 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3856
3857         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3858         checks if we can use brtrue/brfalse to test for 0.
3859         * expression.cs: use the above in the test for using brtrue/brfalse.
3860         cleanup code a bit.
3861
3862 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3863
3864         * expression.cs: Rewrite string concat stuff. Benefits:
3865
3866         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3867         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3868         rather than a concat chain.
3869
3870         * typemanager.cs: Add lookups for more concat overloads.
3871
3872 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3873
3874         * expression.cs: Emit shorter il code for array init.
3875
3876         newarr
3877         dup
3878         // set 1
3879
3880         // set 2
3881
3882         newarr
3883         stloc.x
3884
3885         ldloc.x
3886         // set 1
3887
3888         ldloc.x
3889         // set 2
3890
3891 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3892
3893         * statement.cs: Before, two switch blocks would be merged if the
3894         total size of the blocks (end_item - begin_item + 1) was less than
3895         two times the combined sizes of the blocks.
3896
3897         Now, it will only merge if after the merge at least half of the
3898         slots are filled.
3899
3900         fixes 55885.
3901
3902 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3903
3904         * class.cs : csc build fix for GetMethods(). See bug #52503.
3905
3906 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3907
3908         * expression.cs: Make sure fp comparisons work with NaN.
3909         This fixes bug #54303. Mig approved this patch a long
3910         time ago, but we were not able to test b/c the runtime
3911         had a related bug.
3912
3913 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3914
3915         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3916
3917 2004-03-19  Martin Baulig  <martin@ximian.com>
3918
3919         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3920         error here and not in our caller.
3921
3922 2004-03-19  Martin Baulig  <martin@ximian.com>
3923
3924         * interface.cs: Completely killed this file.
3925         (Interface): We're now a TypeContainer and live in class.cs.
3926
3927         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3928         argument; we're now also called for interfaces.
3929         (TypeContainer.DefineMembers): Allow this method being called
3930         multiple times.
3931         (TypeContainer.GetMethods): New public method; formerly known as
3932         Interface.GetMethod().  This is used by PendingImplementation.
3933         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3934         it's now private and non-static.
3935         (Interface): Moved this here; it's now implemented similar to
3936         Class and Struct.
3937         (Method, Property, Event, Indexer): Added `bool is_interface'
3938         argument to their .ctor's.
3939         (MemberBase.IsInterface): New public field.
3940
3941         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3942         instances instead of InterfaceMethod, InterfaceProperty, etc.
3943         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3944         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3945
3946 2004-03-19  Martin Baulig  <martin@ximian.com>
3947
3948         * class.cs (MethodCore.IsDuplicateImplementation): New private
3949         method which does the CS0111 checking.
3950         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3951         Use IsDuplicateImplementation().
3952
3953 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3954
3955         * decl.cs (FindMemberToOverride): New method to find the correct
3956         method or property to override in the base class.
3957         * class.cs
3958             - Make Method/Property use the above method to find the
3959               version in the base class.
3960             - Remove the InheritableMemberSignatureCompare as it is now
3961               dead code.
3962
3963         This patch makes large code bases much faster to compile, as it is
3964         O(n) rather than O(n^2) to do this validation.
3965
3966         Also, it fixes bug 52458 which is that nested classes are not
3967         taken into account when finding the base class member.
3968
3969         Reviewed/Approved by Martin.
3970
3971 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3972
3973         * interface.cs: In all interface classes removed redundant
3974         member initialization.
3975
3976 2004-03-16  Martin Baulig  <martin@ximian.com>
3977
3978         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3979
3980 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3981
3982         * decl.cs (DefineTypeAndParents): New helper method to define a
3983         type's containers before the type itself is defined;  This is a
3984         bug exposed by the recent changes to Windows.Forms when an
3985         implemented interface was defined inside a class that had not been
3986         built yet.   
3987
3988         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3989
3990         (Check): Loop correctly to report errors modifiers
3991         (UNSAFE was not in the loop, since it was the same as TOP).
3992
3993         * interface.cs: Every interface member now takes a ModFlags,
3994         instead of a "is_new" bool, which we set on the base MemberCore. 
3995
3996         Every place where we called "UnsafeOk" in the interface, now we
3997         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3998         the unsafe settings from the member declaration instead of the
3999         container interface. 
4000
4001         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4002
4003         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4004         `set_indexer_name' to the pending bits (one per type).
4005
4006         We fixed a bug today that was picking the wrong method to
4007         override, since for properties the existing InterfaceMethod code
4008         basically ignored the method name.  Now we make sure that the
4009         method name is one of the valid indexer names.
4010
4011 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4012  
4013         * support.cs (SeekableStreamReader): Keep track of stream byte
4014         positions and don't mix them with character offsets to the buffer.
4015
4016         Patch from Gustavo Giráldez
4017
4018 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4019
4020         * interface.cs (InterfaceSetGetBase): Removed double member
4021         initialization, base class does it as well.
4022
4023 2004-03-13  Martin Baulig  <martin@ximian.com>
4024
4025         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4026         when compiling corlib.
4027
4028 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4029
4030         * convert.cs (ExplicitConversion): We were reporting an error on
4031         certain conversions (object_type source to a value type, when the
4032         expression was `null') before we had a chance to pass it through
4033         the user defined conversions.
4034
4035         * driver.cs: Replace / and \ in resource specifications to dots.
4036         Fixes 50752
4037
4038         * class.cs: Add check for duplicate operators.  Fixes 52477
4039
4040 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4041
4042         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4043         that are in the middle of the statements, not only at the end.
4044         Fixes #54987
4045
4046         * class.cs (TypeContainer.AddField): No longer set the
4047         `HaveStaticConstructor' flag, now we call it
4048         `UserDefineStaticConstructor' to diferentiate the slightly
4049         semantic difference.
4050
4051         The situation is that we were not adding BeforeFieldInit (from
4052         Modifiers.TypeAttr) to classes that could have it.
4053         BeforeFieldInit should be set to classes that have no static
4054         constructor. 
4055
4056         See:
4057
4058         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4059
4060         And most importantly Zoltan's comment:
4061
4062         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4063
4064         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4065          before its static fields are used', i.e. initialization does not need
4066          to be triggered by the first access to the type. Setting this flag
4067          helps the JIT to compile better code, since it can run the static
4068          constructor at JIT time, and does not need to generate code to call it
4069          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4070          this flag for lots of classes like String. 
4071          
4072          csc sets this flag if the type does not have an explicit static 
4073          constructor. The reasoning seems to be that if there are only static
4074          initalizers for a type, and no static constructor, then the programmer
4075          does not care when this initialization happens, so beforefieldinit
4076          can be used.
4077          
4078          This bug prevents the AOT compiler from being usable, since it 
4079          generates so many calls to mono_runtime_class_init that the AOT code
4080          is much slower than the JITted code. The JITted code is faster, 
4081          because it does not generate these calls if the vtable is type is
4082          already initialized, which is true in the majority of cases. But the
4083          AOT compiler can't do this."
4084
4085 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4086
4087         * class.cs (MethodData.Emit): Refactor the code so symbolic
4088         information is generated for destructors;  For some reasons we
4089         were taking a code path that did not generate symbolic information
4090         before. 
4091
4092 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4093
4094         * class.cs: Create a Constructor.CheckBase method that
4095         takes care of all validation type code. The method
4096         contains some code that was moved from Define.
4097
4098         It also includes new code that checks for duplicate ctors.
4099         This fixes bug #55148.
4100
4101 2004-03-09  Joshua Tauberer <tauberer@for.net>
4102
4103         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4104         a { ... }-style array creation invokes EmitStaticInitializers
4105         which is not good for reference-type arrays.  String, decimal
4106         and now null constants (NullCast) are not counted toward
4107         static initializers.
4108
4109 2004-03-05  Martin Baulig  <martin@ximian.com>
4110
4111         * location.cs (SourceFile.HasLineDirective): New public field;
4112         specifies whether the file contains or is referenced by a "#line"
4113         directive.
4114         (Location.DefineSymbolDocuments): Ignore source files which
4115         either contain or are referenced by a "#line" directive.        
4116
4117 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4118
4119         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4120         direct access to our parent, so check the method inline there.
4121
4122 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4123
4124         * expression.cs (Invocation.EmitCall): Miguel's last commit
4125         caused a regression. If you had:
4126
4127             T t = null;
4128             t.Foo ();
4129
4130         In Foo the implict this would be null.
4131
4132 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4133
4134         * expression.cs (Invocation.EmitCall): If the method is not
4135         virtual, do not emit a CallVirt to it, use Call.
4136
4137         * typemanager.cs (GetFullNameSignature): Improve the method to
4138         cope with ".ctor" and replace it with the type name.
4139
4140         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4141         as an argument the ConstructorBuilder where it is being defined,
4142         to catch the recursive constructor invocations.
4143
4144 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4145
4146         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4147         routines to check if a type is an enumerable/enumerator allow
4148         classes that implement the IEnumerable or IEnumerator interfaces.
4149
4150         * class.cs (Property, Operator): Implement IIteratorContainer, and
4151         implement SetYields.
4152
4153         (Property.Define): Do the block swapping for get_methods in the
4154         context of iterators.   We need to check if Properties also
4155         include indexers or not.
4156
4157         (Operator): Assign the Block before invoking the
4158         OperatorMethod.Define, so we can trigger the Iterator code
4159         replacement. 
4160
4161         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4162         Property and Operator classes are not created when we parse the
4163         declarator but until we have the block completed, so we use a
4164         singleton SimpleIteratorContainer.Simple to flag whether the
4165         SetYields has been invoked.
4166
4167         We propagate this setting then to the Property or the Operator to
4168         allow the `yield' to function.
4169
4170 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4171
4172         * codegen.cs: Implemented attribute support for modules.
4173         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4174         Assembly/Module functionality.
4175
4176         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4177         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4178         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4179
4180 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4181
4182         * interface.cs (FindMembers): The operation is performed on all base
4183         interfaces and not only on the first. It is required for future CLS Compliance patch.
4184
4185 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4186
4187         * statement.cs, codegen.cs:
4188         This patch deals with patterns such as:
4189
4190         public class List : IEnumerable {
4191
4192                 public MyEnumerator GetEnumerator () {
4193                         return new MyEnumerator(this);
4194                 }
4195
4196                 IEnumerator IEnumerable.GetEnumerator () {
4197                         ...
4198                 }
4199                 
4200                 public struct MyEnumerator : IEnumerator {
4201                         ...
4202                 }
4203         }
4204
4205         Before, there were a few things we did wrong:
4206         1) we would emit callvirt on a struct, which is illegal
4207         2) we emited ldarg when we needed to emit ldarga
4208         3) we would mistakenly call the interface methods on an enumerator
4209         type that derived from IEnumerator and was in another assembly. For example:
4210
4211         public class MyEnumerator : IEnumerator
4212
4213         Would have the interface methods called, even if there were public impls of the
4214         method. In a struct, this lead to invalid IL code.
4215
4216 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4217
4218         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4219           renamed to Emit.
4220
4221         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4222
4223 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4224
4225         * cs-parser.jay: Fix small regression: we were not testing V2
4226         compiler features correctly.
4227
4228         * interface.cs: If the emit context is null, then create one
4229
4230 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4231
4232         * decl.cs (GetSignatureForError): New virtual method to get full name
4233           for error messages.
4234
4235         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4236           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4237
4238         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4239           Duplicated members and code in these classes has been removed.
4240           Better encapsulation in these classes.
4241
4242 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4243
4244         * assign.cs (Assign.DoResolve): When dealing with compound
4245         assignments, there is a new rule in ECMA C# 2.4 (might have been
4246         there before, but it is documented here) that states that in:
4247
4248         a op= b;
4249
4250         If b is of type int, and the `op' is a shift-operator, then the
4251         above is evaluated as:
4252
4253         a = (int) a op b 
4254
4255         * expression.cs (Binary.ResolveOperator): Instead of testing for
4256         int/uint/long/ulong, try to implicitly convert to any of those
4257         types and use that in pointer arithmetic.
4258
4259         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4260         method to print information for from the type, not from the
4261         null-method we were given.
4262
4263 2004-02-01  Duncan Mak  <duncan@ximian.com>
4264
4265         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4266         parsing for cmd, fixes bug #53694.
4267
4268 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4269
4270         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4271         in the member name duplication tests. Property and operator name duplication
4272         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4273
4274 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4275
4276         * interface.cs (PopulateMethod): Fixed crash when interface method
4277         returns not existing type (error test cs0246-3.cs).
4278
4279 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4280
4281         * cs-parser.jay (interface_accessors): Re-write actions to also
4282         store attributes attached to get and set methods. Fix spelling
4283         while at it.
4284
4285         (inteface_property_declaration): Modify accordingly.
4286
4287         (InterfaceAccessorInfo): New helper class to store information to pass
4288         around between rules that use interface_accessors.
4289
4290         * interface.cs (Emit): Apply attributes on the get and set
4291         accessors of properties and indexers too.
4292
4293         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4294         right MethodBuilder when applying attributes to the get and set accessors.
4295
4296 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4297
4298         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4299
4300 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4301
4302         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4303
4304 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4305
4306         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4307         changes that treat `yield' specially when present before `break'
4308         or `return' tokens.
4309
4310         * cs-tokenizer.cs: yield is no longer a keyword.
4311
4312 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4313
4314         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4315         setting for default constructors.
4316         For default constructors are almost every time set wrong Modifier. The
4317         generated IL code has been alright. But inside mcs this values was
4318         wrong and this was reason why several of my CLS Compliance tests
4319         failed.
4320
4321 2004-01-22  Martin Baulig  <martin@ximian.com>
4322
4323         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4324         not a QualifiedIdentifier.  This is what `type_name_expression'
4325         was previously doing.
4326         (type_name_expression): Removed; the code is now in
4327         `namespace_or_type_name'.
4328         (qualified_identifier): Removed, use `namespace_or_type_name'
4329         instead.
4330         (QualifiedIdentifier): Removed this class.      
4331
4332 2004-01-22  Martin Baulig  <martin@ximian.com>
4333
4334         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4335         not a string as alias name.
4336
4337 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4338
4339         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4340         #52730 bug, and instead compute correctly the need to use a
4341         temporary variable when requesting an address based on the
4342         static/instace modified of the field and the constructor.
4343  
4344 2004-01-21  Martin Baulig  <martin@ximian.com>
4345
4346         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4347         class and namespace before looking up aliases.  Fixes #52517.
4348
4349 2004-01-21  Martin Baulig  <martin@ximian.com>
4350
4351         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4352         assinged in a 'try'; fixes exception4.cs.
4353
4354 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4355         * class.cs : Implemented parameter-less constructor for TypeContainer
4356
4357         * decl.cs: Attributes are now stored here. New property OptAttributes
4358
4359         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4360
4361         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4362
4363 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4364
4365         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4366           (CSharpSignature): New method for indexer and property signature.
4367
4368 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4369
4370         * pending.cs (IsVirtualFilter): Faster implementation.
4371
4372 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4373
4374         * typemanager.cs: Avoid inclusion of same assembly more than once.
4375
4376 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4377
4378         * cs-parser.jay: Fixed problem where the last assembly attribute
4379           has been applied also to following declaration (class, struct, etc.)
4380           
4381 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4382
4383         * class.cs: Added error CS0538, CS0539 reporting.
4384         Fixed crash on Microsoft runtime when field type is void.
4385
4386         * cs-parser.jay: Added error CS0537 reporting.
4387
4388         * pending.cs: Added error CS0535 reporting.
4389         Improved error report for errors CS0536, CS0534.
4390
4391 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4392
4393         Merge a few bits from the Anonymous Method MCS tree.
4394
4395         * statement.cs (ToplevelBlock): New class for toplevel methods,
4396         will hold anonymous methods, lifted variables.
4397
4398         * cs-parser.jay: Create toplevel blocks for delegates and for
4399         regular blocks of code. 
4400
4401 2004-01-20  Martin Baulig  <martin@ximian.com>
4402
4403         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4404         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4405         and `NeedExplicitReturn'; added `IsLastStatement'.
4406         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4407         have a `ReturnLabel' or we're not unreachable.
4408
4409         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4410         child's reachability; don't just override ours with it.  Fixes
4411         #58058 (lluis's example).
4412         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4413         InFinally(), InLoop(), InSwitch() and
4414         BreakCrossesTryCatchBoundary() methods.
4415
4416         * statement.cs (Return): Do all error checking in Resolve().
4417         Unless we are the last statement in a top-level block, always
4418         create a return label and jump to it.
4419         (Break, Continue): Do all error checking in Resolve(); also make
4420         sure we aren't leaving a `finally'.
4421         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4422         statement in a top-level block.
4423         (Block.Flags): Added `IsDestructor'.
4424         (Block.IsDestructor): New public property.
4425
4426 2004-01-20  Martin Baulig  <martin@ximian.com>
4427
4428         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4429
4430 2004-01-20  Martin Baulig  <martin@ximian.com>
4431
4432         * statement.cs (Statement.ResolveUnreachable): New public method.
4433         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4434         (Block.Resolve): Resolve unreachable statements.
4435
4436 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4437
4438         * expression.cs: We need to fix the case where we do
4439         not have a temp variable here.
4440
4441         * assign.cs: Only expression compound assignments need
4442         temporary variables.
4443
4444 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4445
4446         * flowanalysis.cs: Reduce memory allocation in a few ways:
4447           - A block with no variables should not allocate a bit
4448             vector for itself.
4449           - A method with no out parameters does not need any tracking
4450             for assignment of the parameters, so we need not allocate
4451             any data for it.
4452           - The arrays:
4453                 public readonly Type[] VariableTypes;
4454                 public readonly string[] VariableNames;
4455             Are redundant. The data is already stored in the variable
4456             map, so we need not allocate another array for it.
4457           - We need to add alot of checks for if (params | locals) == null
4458             due to the first two changes.
4459
4460 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4461
4462         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4463         implement IMemoryLocation, we store a copy on a local variable and
4464         take the address of it.  Patch from Benjamin Jemlich
4465
4466         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4467         to use a special "type_name_expression" rule which reduces the
4468         number of "QualifiedIdentifier" classes created, and instead
4469         directly creates MemberAccess expressions.
4470
4471 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4472
4473         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4474         that fixes #52853.  Null literal assignment to ValueType
4475
4476         * class.cs (MethodData.Emit): Instead of checking the name of the
4477         method to determine if its a destructor, create a new derived
4478         class from Method called Destructor, and test for that.  
4479
4480         * cs-parser.jay: Create a Destructor object instead of a Method.  
4481
4482         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4483
4484         Fixes: 52933
4485
4486 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4487
4488         * expression.cs (Binary.ResolveOperator): Perform an implicit
4489         conversion from MethodGroups to their delegate types on the
4490         Addition operation.
4491
4492         * delegate.cs: Introduce a new class DelegateCreation that is the
4493         base class for `NewDelegate' and `ImplicitDelegateCreation',
4494         factor some code in here.
4495
4496         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4497         conversion from MethodGroups to compatible delegate types. 
4498
4499         * ecore.cs (Expression.Resolve): Do not flag error 654
4500         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4501         we allow conversions from MethodGroups to delegate types now.
4502
4503         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4504         assignments in v2 either.
4505
4506 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4507
4508         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4509         static read-only fields in ctors.
4510
4511         Applied patch from Benjamin Jemlich 
4512
4513         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4514
4515 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4516
4517         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4518         here to return true, as they can be used like this:
4519
4520                 (XXX) int.MEMBER ()
4521
4522         Fixed 49836 and all the other dups
4523
4524 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4525
4526         * driver.cs: Implement /win32res and /win32icon.
4527
4528 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4529
4530         * cs-parser.jay: Add a rule to improve error handling for the
4531         common mistake of placing modifiers after the type.
4532
4533 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4534
4535         * cs-parser.jay (interface_event_declaration): Catch
4536         initialization of events on interfaces, and report cs0068
4537
4538         * cs-parser.jay (interface_event_declaration): Catch
4539         initialization of events. 
4540
4541         * ecore.cs: Better report missing constructors.
4542
4543         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4544         the error reporting done in the wrong place.  Fix.
4545
4546         * expression.cs (Binary.ResolveOperator): Catch the 
4547         operator + (E x, E y) error earlier, and later allow for implicit
4548         conversions in operator +/- (E e, U x) from U to the underlying
4549         type of E.
4550
4551         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4552         52596, if the container class is abstract, the default constructor
4553         is protected otherwise its public (before, we were always public).
4554
4555         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4556         fixed statement.
4557
4558         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4559         Jemlich that fixes bug #52597, MCS was generating invalid code for
4560         idisposable structs.   Thanks to Ben for following up with this
4561         bug as well.
4562
4563 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4564
4565         * driver.cs: Allow assemblies without code to be generated, fixes
4566         52230.
4567
4568 2004-01-07  Nick Drochak <ndrochak@gol.com>
4569
4570         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4571
4572 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4573
4574         * cs-parser.jay: Add rules to improve error reporting if fields or
4575         methods are declared at the namespace level (error 116)
4576
4577         * Add rules to catch event add/remove
4578
4579 2004-01-04  David Sheldon <dave-mono@earth.li>
4580
4581   * expression.cs: Added matching ")" to error message for 
4582   CS0077
4583
4584 2004-01-03 Todd Berman <tberman@gentoo.org>
4585
4586         * ecore.cs, attribute.cs:
4587         Applying fix from #52429.
4588
4589 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4590
4591         * ecore.cs, expression.cs, statement.cs:
4592         Total rewrite of how we handle branching. We
4593         now handle complex boolean expressions with fewer
4594         jumps. As well if (x == 0) no longer emits a ceq.
4595
4596         if (x is Foo) is much faster now, because we generate
4597         better code.
4598
4599         Overall, we get a pretty big improvement on our benchmark
4600         tests. The code we generate is smaller and more readable.
4601
4602         I did a full two-stage bootstrap. The patch was reviewed
4603         by Martin and Miguel.
4604
4605 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4606
4607         * cs-parser.jay: Make primary_expression not take a QI.
4608         we dont need this because the member_access rule covers
4609         us here. So we replace the rule with just IDENTIFIER.
4610
4611         This has two good effects. First, we remove a s/r conflict.
4612         Second, we allocate many fewer QualifiedIdentifier objects.
4613
4614 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4615
4616         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4617         set the correct information via SRE. This prevents
4618         hanging on the MS runtime. Fixes #29374.
4619
4620 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4621
4622         * convert.cs: correctly handle conversions to value types
4623         from Enum and ValueType as unboxing conversions.
4624
4625         Fixes bug #52569. Patch by Benjamin Jemlich.
4626
4627 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4628
4629         * expression.cs (BetterConversion): Prefer int -> uint
4630         over int -> ulong (csc's behaviour). This fixed bug #52046.
4631
4632 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4633
4634         * decl.cs (MemberCache.FindMembers): now returns a
4635         MemberInfo [].
4636
4637         * typemanager.cs: In general, go with with ^^.
4638         (CopyNewMethods): take an IList.
4639         (RealMemberLookup): Only allocate an arraylist
4640         if we copy from two sets of methods.
4641
4642         This change basically does two things:
4643         1) Fewer array lists allocated due to CopyNewMethods.
4644         2) the explicit cast in MemberList costed ALOT.
4645
4646 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4647
4648         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4649         a hashtable to avoid needless string allocations when an identifier is
4650         used more than once (the common case).
4651
4652 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4653
4654         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4655         is broken, it will not return anything. So, we
4656         have to use the information we have in mcs to
4657         do the task.
4658
4659         * typemanager.cs: Add a cache for GetInterfaces,
4660         since this will now be used more often (due to ^^)
4661
4662         (GetExplicitInterfaces) New method that gets the
4663         declared, not effective, interfaces on a type
4664         builder (eg, if you have interface IFoo, interface
4665         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4666         { IBar }.
4667
4668         This patch makes MCS able to bootstrap itself on
4669         Windows again.
4670
4671 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4672
4673         * expression.cs: Remove the Nop's that Miguel put
4674         in by mistake.
4675
4676 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4677
4678         * report.cs, codegen.cs: Give the real stack trace to
4679         the error when an exception is thrown.
4680
4681 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4682
4683         * decl.cs: only allocate hashtables for ifaces if 
4684         it is an iface!
4685
4686 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4687
4688         * expression.cs: fix the error from cs0121-2.cs
4689         (a parent interface has two child interfaces that
4690         have a function with the same name and 0 params
4691         and the function is called through the parent).
4692
4693 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4694
4695         * class.cs, rootcontext.cs, typmanager.cs: do not
4696         leak pointers.
4697
4698 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4699
4700         * codegen.cs: remove stack for the ec flow branching.
4701         It is already a linked list, so no need.
4702
4703 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4704
4705         * Makefile: Allow custom profiler here.
4706
4707 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4708
4709         * typemanager.cs (LookupType):
4710           - Use a static char [], because split takes
4711             a param array for args, so it was allocating
4712             every time.
4713           - Do not store true in a hashtable, it boxes.
4714
4715 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4716
4717         * flowanalysis.cs: bytify common enums.
4718
4719 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4720
4721         * modifiers.cs: Add a new set of flags for the
4722         flags allowed on explicit interface impls.
4723         * cs-parser.jay: catch the use of modifiers in
4724         interfaces correctly.
4725         * class.cs: catch private void IFoo.Blah ().
4726
4727         All related to bug #50572.
4728
4729 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4730
4731         * decl.cs: Rewrite the consistant accessability checking.
4732         Accessability is not linear, it must be implemented in
4733         a tableish way. Fixes #49704.
4734
4735 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4736
4737         * expression.cs: Handle negation in a checked context.
4738         We must use subtraction from zero. Fixes #38674.
4739
4740 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4741
4742         * class.cs: Ignore static void main in DLLs.
4743         * rootcontext.cs: Handle the target type here,
4744         since we are have to access it from class.cs
4745         * driver.cs: account for the above.
4746
4747 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4748
4749         * report.cs: Give line numbers and files if available.
4750
4751 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4752
4753         * driver.cs: Implement /addmodule.
4754
4755         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4756         ModuleBuilders.
4757
4758 2003-12-20  Martin Baulig  <martin@ximian.com>
4759
4760         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4761         (FieldBase.IsAssigned): Removed this field.
4762         (FieldBase.SetAssigned): New public method.
4763         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4764
4765 2003-12-20  Martin Baulig  <martin@ximian.com>
4766
4767         * expression.cs (LocalVariableReference.DoResolve): Don't set
4768         `vi.Used' if we're called from DoResolveLValue().
4769
4770         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4771         returns the usage vector it just merged into the current one -
4772         pass this one to UsageWarning().
4773         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4774         of the `EmitContext', don't call this recursively on our children.
4775
4776 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4777
4778         * driver.cs: Implement /target:module.
4779
4780 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4781
4782         * support.cs (CharArrayHashtable): New helper class.
4783
4784         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4785         char arrays, not strings, so we can avoid creating a string in
4786         consume_identifier if the identifier is a keyword.
4787
4788 2003-12-16  Martin Baulig  <martin@ximian.com>
4789
4790         * statement.cs (LocalInfo.Assigned): Removed this property.
4791         (LocalInfo.Flags): Removed `Assigned'.
4792         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4793         and uses flow analysis.
4794         (Block.UsageWarning): Made this method private.
4795         (Block.Resolve): Call UsageWarning() if appropriate.
4796
4797         * expression.cs (LocalVariableReference.DoResolve): Always set
4798         LocalInfo.Used here.
4799
4800 2003-12-13  Martin Baulig  <martin@ximian.com>
4801
4802         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4803         any value here; we're now using flow analysis to figure out
4804         whether a statement/block returns a value.
4805
4806 2003-12-13  Martin Baulig  <martin@ximian.com>
4807
4808         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4809         working again.
4810         (FlowBranching.MergeFinally): Don't call
4811         `branching.CheckOutParameters()' here, this is called in
4812         MergeTopBlock().
4813         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4814         when adding the `finally' vector.       
4815
4816 2003-12-13  Martin Baulig  <martin@ximian.com>
4817
4818         * flowanalysis.cs
4819         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4820         actually work and also fix #48962.
4821
4822 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4823
4824         * decl.cs: Do not check System.Object for nested types,
4825         since we know it does not have any. Big bang for buck:
4826
4827         BEFORE:
4828            Run 1:   8.35 seconds
4829            Run 2:   8.32 seconds
4830            corlib:  17.99 seconds
4831         AFTER:
4832            Run 1:   8.17 seconds
4833            Run 2:   8.17 seconds
4834            corlib:  17.39 seconds
4835
4836 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4837
4838         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4839         time we are returning 0 members, so we save alot here.
4840
4841 2003-12-11  Martin Baulig  <martin@ximian.com>
4842
4843         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4844         `MergeChild()', also just take the `FlowBranching' as argument;
4845         call Merge() on it and return the result.
4846         (FlowBranching.Merge): We don't need to do anything if we just
4847         have one sibling.
4848
4849 2003-12-11  Martin Baulig  <martin@ximian.com>
4850
4851         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4852         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4853         Maurer for this idea.
4854
4855 2003-12-11  Martin Baulig  <martin@ximian.com>
4856
4857         * flowanalysis.cs (MergeResult): This class is now gone; we now
4858         use the `UsageVector' for this.  The reason for this is that if a
4859         branching just has one sibling, we don't need to "merge" them at
4860         all - that's the next step to do.
4861         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4862         `MergeResult'.
4863
4864 2003-12-11  Martin Baulig  <martin@ximian.com>
4865
4866         Reworked flow analyis and made it more precise and bug-free.  The
4867         most important change is that we're now using a special `Reachability'
4868         class instead of having "magic" meanings of `FlowReturns'.  I'll
4869         do some more cleanups and optimizations and also add some more
4870         documentation this week.
4871
4872         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4873         largely reworked this class.
4874         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4875         the new `Reachability' class instead of having "magic" values here.
4876         (FlowBranching): We're now using an instance of `Reachability'
4877         instead of having separate `Returns', `Breaks' etc. fields.
4878
4879         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4880         based on flow analysis; ignore the return value of block.Emit ().
4881
4882 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4883
4884         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4885         if they are private.
4886
4887 2003-12-09  Martin Baulig  <martin@ximian.com>
4888
4889         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4890         call them directly on the UsageVector.
4891
4892 2003-12-09  Martin Baulig  <martin@ximian.com>
4893
4894         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4895         Changed return type from `FlowReturns' to `Reachability'.
4896
4897 2003-12-09  Martin Baulig  <martin@ximian.com>
4898
4899         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4900         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4901         `Reachable' fields with a single `Reachability' one.
4902
4903 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4904
4905         * class.cs (FindMembers): Remove foreach's.
4906
4907         Bootstrap times:
4908
4909         BEFORE
4910                 Run 1:   8.74 seconds
4911                 Run 2:   8.71 seconds
4912
4913         AFTER
4914                 Run 1:   8.64 seconds
4915                 Run 2:   8.58 seconds
4916
4917
4918 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4919
4920         * cs-parser.jay:
4921         * gen-treedump.cs:
4922         * statement.cs:
4923         This patch does a few things:
4924                 1. EmptyStatement is now a singleton, so it is never reallocated.
4925                 2. All blah is EmptyStatement constructs have been changed to
4926                    blah == EmptyStatement.Value, which is much faster and valid
4927                    now that EmptyStatement is a singleton.
4928                 3. When resolving a block, rather than allocating a new array for
4929                    the non-empty statements, empty statements are replaced with
4930                    EmptyStatement.Value
4931                 4. Some recursive functions have been made non-recursive.
4932         Mainly the performance impact is from (3), however (1) and (2) are needed for
4933         this to work. (4) does not make a big difference in normal situations, however
4934         it makes the profile look saner.
4935
4936         Bootstrap times:
4937
4938         BEFORE
4939         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4940         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4941         Total memory allocated: 56397 KB
4942
4943         AFTER
4944         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4945         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4946         Total memory allocated: 55666 KB
4947
4948 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4949
4950         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4951         than the hashtable in a hashtable version
4952
4953         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4954         we always end up concating a string. This results in a huge perf
4955         loss, because many strings have to be tracked by the GC. In this
4956         patch, we first use a hashtable that works with two keys, so that
4957         the strings do not need to be concat'ed.
4958
4959         Bootstrap times:
4960         BEFORE
4961                 Run 1:   8.74 seconds
4962                 Run 2:   8.71 seconds
4963
4964         AFTER
4965                 Run 1:   8.65 seconds
4966                 Run 2:   8.56 seconds
4967
4968 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4969
4970         * Makefile: Add a new target `do-time' that does a quick and simple
4971         profile, leaving easy to parse output.
4972
4973 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4974
4975         * codegen.cs (Init): Create the dynamic assembly with 
4976         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4977
4978 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4979
4980         * support.cs: Make the PtrHashtable use only one
4981         instance of its comparer.
4982
4983 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4984
4985         * typemanager.cs: Fix lookup of GetNamespaces.
4986
4987 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4988
4989         * expression.cs: Removed redundant line.
4990
4991         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4992         ArrayLists, use for loops with bounds.  
4993
4994         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4995         arraylist.
4996
4997         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4998         arraylists, use for loop with bounds.
4999
5000         The above three changes give us a 0.071 second performance
5001         improvement out of 3.294 seconds down to 3.223.  On my machine
5002         the above changes reduced the memory usage by 1,387 KB during
5003         compiler bootstrap.
5004
5005         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5006         QualifiedIdentifiers.  Before we created a new string through
5007         concatenation, and mostly later on, the result would be
5008         manipulated by DecomposeQI through string manipulation.
5009
5010         This reduced the compiler memory usage for bootstrapping from
5011         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5012         compile times in 0.05 seconds.
5013
5014 2003-11-28  Dick Porter  <dick@ximian.com>
5015
5016         * support.cs: Do string compares with the Invariant culture.
5017
5018         * rootcontext.cs: 
5019         * gen-treedump.cs: 
5020         * expression.cs: 
5021         * driver.cs: 
5022         * decl.cs: 
5023         * codegen.cs: 
5024         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5025         the comparison is done with the Invariant culture.
5026
5027 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5028
5029         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5030         GetEnumerator method.
5031
5032         (ProbeCollectionType): Iterate starting at the most specific type
5033         upwards looking for a GetEnumerator
5034
5035         * expression.cs: Shift count can be up to 31 for int/uint and 63
5036         for long/ulong.
5037
5038 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5039
5040         * statement.cs (Block.LookupLabel): Also look for the label on the
5041         children blocks.  Use a hash table to keep track of visited
5042         nodes. 
5043
5044         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5045         we actually did transform the other operand, otherwise fall back
5046         to the common codepath that casts to long.
5047
5048         * cs-tokenizer.cs: Use the same code pattern as the int case.
5049         Maybe I should do the parsing myself, and avoid depending on the
5050         Parse routines to get this done.
5051
5052 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5053
5054         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5055         which fixes bug 51347.  This time test it.
5056
5057         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5058         attributes for example can not tell the difference between these.
5059         The difference was only a syntax feature of the language. 
5060
5061         * attribute.cs: Apply attributes to delegates.
5062
5063         * delegate.cs: Call the apply attributes method.
5064
5065 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5066
5067         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5068         comparing 0 vs Byte.MinValue, not the value
5069
5070         (ImplicitConversionRequired): When reporting a conversion error,
5071         use error 31 to print out the constant error instead of the
5072         simpler 29.
5073
5074         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5075         which fixes bug 51347.
5076
5077 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5078
5079         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5080         which fixes the -warnaserror command line option.
5081
5082 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5083
5084         * cfold.cs (DoNumericPromotions): During constant folding of
5085         additions on UIntConstant, special case intconstants with
5086         IntConstants like we do on the expression binary operator. 
5087
5088 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5089
5090         * convert.cs (ImplicitReferenceConversion): We were missing a case
5091         (System.Enum are not value types or class types, so we need to
5092         classify them separatedly).
5093
5094         * driver.cs: We do not support error 2007.
5095
5096 2003-11-12 Jackson Harper <jackson@ximian.com>
5097
5098         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5099         system directory. Also use the full file name so users can
5100         libraries names mscorlib-o-tron.dll in a non system dir.
5101
5102 2003-11-10  Martin Baulig  <martin@ximian.com>
5103
5104         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5105         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5106         calling `ResolveType()' on them, directly assign their `Type'.
5107
5108 2003-11-08  Martin Baulig  <martin@ximian.com>
5109
5110         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5111         return value and the `out parent' parameter.
5112         (TypeContainer.DefineType): Moved the CS0644 check into
5113         GetClassBases().  Don't pass the interface types to the
5114         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5115         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5116
5117         * ecore.cs (TypeExpr.IsAttribute): New property.
5118         (TypeExpr.GetInterfaces): New method.
5119
5120         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5121         TypeExpr instead of a Type.
5122         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5123         (Interface.DefineType): Don't pass the interface types to the
5124         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5125         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5126
5127         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5128         instead of a `Type[]'.
5129         (TypeManager.RegisterBuilder): Likewise.
5130         (TypeManager.AddUserInterface): Likewise.
5131         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5132         `Type[]' and also return a `TypeExpr[]'.
5133         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5134
5135 2003-11-08  Martin Baulig  <martin@ximian.com>
5136
5137         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5138         Expression.     
5139
5140 2003-11-08  Martin Baulig  <martin@ximian.com>
5141
5142         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5143         TypeManager.ResolveExpressionTypes().
5144
5145         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5146         instead of an Expression.
5147         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5148         (TypeExpression): New public class; formerly known as `TypeExpr'.
5149
5150         * expression.cs (ComposedCast): Derive from TypeExpr.
5151
5152         * typemanager.cs (TypeManager.system_*_expr): These are now
5153         TypExpr's instead of Expression's.
5154         (TypeManager.ResolveExpressionTypes): New public static function;
5155         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5156         of them.        
5157
5158 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5159
5160         * expression.cs (New.DoResolve): Do not dereference value that
5161         might be a null return.
5162
5163         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5164         sure that the constant value has the right type.  Fixes an
5165         unreported bug, similar to 50425.
5166
5167         * const.cs (Const.LookupConstantValue): Call
5168         ImplicitStandardConversionExists before doing a conversion to
5169         avoid havng the TypeManager.ChangeType do conversions.
5170
5171         Reduced the number of casts used
5172
5173         (Const.ChangeType): New routine to enable reuse of the constant
5174         type changing code from statement.
5175
5176         * typemanager.cs (ChangeType): Move common initialization to
5177         static global variables.
5178
5179         Fixes #50425.
5180
5181         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5182         every value type to go through, even if it was void.  Fix that. 
5183
5184         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5185         character of the define, and the is_identifier_part_character for
5186         the rest of the string.
5187
5188 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5189
5190         * expression.cs (UnaryMutator.EmitCode): When I updated
5191         LocalVariableReference.DoResolve, I overdid it, and dropped an
5192         optimization done on local variable references.
5193
5194 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5195
5196         * ecore.cs: Convert the return from Ldlen into an int.
5197
5198 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5199
5200         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5201         the accessibility, this is a special case for toplevel non-public
5202         classes (internal for instance).
5203
5204 2003-10-20  Nick Drochak <ndrochak@gol.com>
5205
5206         * ecore.cs: Fix typo and build.  Needed another right paren.
5207
5208 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5209
5210         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5211         `internal' case regular and protected, but not allowing protected
5212         to be evaluated later.  Bug 49840
5213
5214 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5215
5216         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5217         to kb.Nlast, and not the kb.nFirst to isolate the switch
5218         statement.
5219
5220         Extract the underlying type, so enumerations of long/ulong are
5221         treated like long/ulong.
5222
5223 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5224
5225         * expression.cs (New): Overload the meaning of RequestedType to
5226         track the possible creation of the NewDelegate type, since
5227         DoResolve is invoked more than once for new constructors on field
5228         initialization.
5229
5230         See bugs: #48800 and #37014
5231
5232         * cs-parser.jay (declare_local_constants): Take an arraylist
5233         instead of a single constant.
5234
5235         (local_constant_declaration): It should take a
5236         constant_declarators, not a constant_declarator.  Fixes 49487
5237
5238         * convert.cs: Fix error report.
5239
5240 2003-10-13 Jackson Harper <jackson@ximian.com>
5241
5242         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5243         bug #49611
5244
5245 2003-10-09  Martin Baulig  <martin@ximian.com>
5246
5247         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5248         to the .ctor.
5249         (MethodCore.DoDefineParameters): Removed the TypeContainer
5250         argument; use the DeclSpace which was passed to the .ctor instead.
5251         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5252         TypeContainer; we only need a DeclSpace here.
5253
5254 2003-10-09  Martin Baulig  <martin@ximian.com>
5255
5256         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5257         to the .ctor.
5258         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5259         EmitContext's .ctor.    
5260
5261 2003-10-09  Martin Baulig  <martin@ximian.com>
5262
5263         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5264         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5265         AsAccessible(), moved them as well.
5266
5267         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5268
5269 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5270
5271         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5272
5273 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5274
5275         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5276         generation for >=, as spotted by Paolo, bug 48679.  
5277         Patch from David Waite.
5278
5279         * cs-tokenizer.cs: Add handling for #pragma.
5280
5281         * cs-parser.jay: Allow for both yield and yield return in the
5282         syntax.  The anti-cobolization of C# fight will go on!
5283
5284         * class.cs (TypeBuilder.DefineType): Catch error condition here
5285         (Parent.DefineType erroring out and returning null).
5286
5287         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5288         coping with enumerations variables, we were mistakenly processing
5289         them as a regular value type instead of built-in types.  Fixes the
5290         bug #48063
5291
5292         * typemanager.cs (IsBuiltinOrEnum): New method.
5293
5294 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5295
5296         * cs-parser.jay: Upgrade: yield now needs the return clause.
5297
5298 2003-09-19  Martin Baulig  <martin@ximian.com>
5299
5300         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5301         `MemberCache parent' argument.  Normally, an interface doesn't
5302         have a parent type except System.Object, but we use this in gmcs
5303         for generic type parameters.
5304
5305 2003-09-18  Martin Baulig  <martin@ximian.com>
5306
5307         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5308         on `type.IsInterface'; don't check whether the type has a parent
5309         to determine whether it's an interface.
5310
5311 2003-09-15  Martin Baulig  <martin@ximian.com>
5312
5313         * class.cs (TypeContainer.DefineType): Added an error flag to
5314         avoid reporting duplicate CS0146's ("class definition is
5315         circular.").
5316
5317         * driver.cs (Driver.MainDriver): Abort if
5318         RootContext.ResolveTree() reported any errors.
5319
5320 2003-09-07  Martin Baulig  <martin@ximian.com>
5321
5322         * report.cs (Error, Warning): Added overloaded versions which take
5323         a `params object[] args' and call String.Format().
5324
5325 2003-09-07  Martin Baulig  <martin@ximian.com>
5326
5327         * decl.cs (DeclSpace..ctor): Don't call
5328         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5329         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5330         (DeclSpace.RecordDecl): New method.
5331
5332         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5333
5334 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5335
5336         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5337         value attributes to be applied to ParameterBuilders.
5338
5339         * class.cs (MethodCore.LabelParameters): Make static and more
5340         generic so that it can be used from other places - like interface
5341         methods, for instance.
5342
5343         * interface.cs (Interface.Emit): Call LabelParameters before
5344         emitting attributes on the InterfaceMethod.
5345
5346 2003-08-26  Martin Baulig  <martin@ximian.com>
5347
5348         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5349         resolving aliases; fixes #47927.
5350
5351 2003-08-26  Martin Baulig  <martin@ximian.com>
5352
5353         * statement.cs (Using.DoResolve): This is internally emitting a
5354         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5355         do not always return.  Fixes #47681.
5356
5357 2003-08-26  Martin Baulig  <martin@ximian.com>
5358
5359         * decl.cs (MemberCore): Moved WarningNotHiding(),
5360         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5361         into MemberBase.
5362         (AdditionResult): Make this nested in DeclSpace.
5363         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5364         argument; call NamespaceEntry.Define() unless we're nested in a
5365         class or struct.
5366
5367         * namespace.cs (Namespace.DefineName): New public function.  This
5368         is called from DeclSpace's .ctor to add 
5369         (Namespace.Lookup): Include DeclSpaces in the lookup.
5370
5371         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5372
5373         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5374
5375 2003-08-25  Martin Baulig  <martin@ximian.com>
5376
5377         * convert.cs (Convert.ExplicitReferenceConversion): When
5378         converting from an interface type to a class, unbox if the target
5379         type is a struct type.  Fixes #47822.
5380
5381 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5382
5383         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5384         #47854.
5385
5386 2003-08-22  Martin Baulig  <martin@ximian.com>
5387
5388         * class.cs (TypeManager.DefineType): When defining a nested type,
5389         call DefineType() on our parent; fixes #47801.
5390
5391 2003-08-22  Martin Baulig  <martin@ximian.com>
5392
5393         * class.cs (MethodData.Define): While checking if a method is an
5394         interface implementation, improve the test a bit more to fix #47654.
5395
5396 2003-08-22  Martin Baulig  <martin@ximian.com>
5397
5398         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5399         correctly; fixes #47722.
5400
5401 2003-08-22  Martin Baulig  <martin@ximian.com>
5402
5403         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5404         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5405
5406         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5407
5408 2003-08-22  Martin Baulig  <martin@ximian.com>
5409
5410         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5411         can only be assigned in static constructors.  Fixes #47161.
5412
5413 2003-08-22  Martin Baulig  <martin@ximian.com>
5414
5415         Rewrote and improved the flow analysis code.
5416
5417         * flowbranching.cs (FlowBranching): Make this class abstract.
5418         (FlowBranching.CreateBranching): New static function to create a
5419         new flow branching.
5420         (FlowBranchingBlock, FlowBranchingException): New classes.
5421         (FlowBranching.UsageVector.Type): New public readonly field.
5422         (FlowBranching.UsageVector.Breaks): Removed the setter.
5423         (FlowBranching.UsageVector.Returns): Removed the setter.
5424         (FlowBranching.UsageVector): Added Break(), Return(),
5425         NeverReachable() and Throw() methods to modify the reachability.
5426         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5427         done by FlowBranching.Merge().
5428         (FlowBranching.UsageVector.MergeChild): New method; merges the
5429         merge result into the current vector.
5430         (FlowBranching.Merge): New abstract method to merge a branching.
5431
5432 2003-08-12  Martin Baulig  <martin@ximian.com>
5433
5434         * expression.cs (Indirection.CacheTemporaries): Create the
5435         LocalTemporary with the pointer type, not its element type.
5436
5437 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5438
5439         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5440         token was a keyword or not.
5441
5442         Add `error' options where an IDENTIFIER was expected;  Provide
5443         CheckToken and CheckIdentifierToken convenience error reporting
5444         functions. 
5445
5446         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5447
5448         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5449         NameSpaceEntry NameSpaceEntry.
5450
5451         (LookupInterfaceOrClass): Avoid creating a full qualified name
5452         from namespace and name: avoid doing lookups when we know the
5453         namespace is non-existant.   Use new Tree.LookupByNamespace which
5454         looks up DeclSpaces based on their namespace, name pair.
5455
5456         * driver.cs: Provide a new `parser verbose' to display the
5457         exception thrown during parsing.  This is turned off by default
5458         now, so the output of a failure from mcs is more graceful.
5459
5460         * namespace.cs: Track all the namespaces defined in a hashtable
5461         for quick lookup.
5462
5463         (IsNamespace): New method
5464
5465 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5466
5467         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5468         we know that we need to concatenate (full typename can never be
5469         null). 
5470
5471         * class.cs: ditto.
5472
5473         * statement.cs: Use a bitfield;  Do not initialize to null things
5474         which are done by the constructor by default.
5475
5476         * cs-parser.jay: bug fix, parameter was 4, not 3.
5477
5478         * expression.cs: Just use the property;
5479
5480         * statement.cs: No need for GetVariableInfo method.
5481
5482 2003-08-08  Martin Baulig  <martin@ximian.com>
5483
5484         * flowanalysis.cs (FlowReturns): This is now nested in the
5485         `FlowBranching' class.
5486         (MyBitVector): Moved this here from statement.cs.
5487         (FlowBranching.SiblingType): New enum type.
5488         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5489
5490 2003-08-07  Martin Baulig  <martin@ximian.com>
5491
5492         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5493         `FlowBranching' class and called `BranchingType'.
5494
5495 2003-08-07  Martin Baulig  <martin@ximian.com>
5496
5497         * flowanalysis.cs: Moved all the control flow analysis code into
5498         its own file.
5499
5500 2003-08-07  Martin Baulig  <martin@ximian.com>
5501
5502         * assign.cs (Assign.DoResolve): `target' must either be an
5503         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5504         #37319.
5505
5506 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5507
5508         * expression.cs (BinaryMethod): This kind of expression is created by the
5509         Binary class if it determines that the operator has to be handled
5510         by a method.
5511
5512         (BinaryDelegate): This kind of expression is created if we are
5513         dealing with a + or - operator on delegates.
5514
5515         (Binary): remove method, argumetns, and DelegateOperator: when
5516         dealing with methods, 
5517
5518         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5519
5520         * statement.cs (Block): use bitfields for the three extra booleans
5521         we had in use.   Remove unused topblock parameter.
5522
5523         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5524
5525         * assign.cs: Drop extra unneeded tests.
5526
5527 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5528
5529         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5530
5531         * statement.cs (Foreach): Use VariableStorage instead of
5532         LocalBuilders.   
5533
5534         * codegen.cs (VariableStorage): New class used by clients that
5535         require a variable stored: locals or fields for variables that
5536         need to live across yield.
5537
5538         Maybe provide a convenience api for EmitThis+EmitLoad?
5539
5540         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5541         these bad boys.
5542
5543 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5544
5545         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5546         RemapParameterLValue): New methods that are used to turn a
5547         precomputed FieldInfo into an expression like this:
5548
5549                 instance.FieldInfo
5550
5551         The idea is to use this instead of making LocalVariableReference
5552         have more than one meaning.
5553
5554         * cs-parser.jay: Add error production to BASE.
5555
5556         * ecore.cs: Deal with TypeManager.GetField returning null, which
5557         is now a valid return value.
5558
5559         (FieldExprNoAddress): New expression for Fields whose address can
5560         not be taken.
5561
5562         * expression.cs (LocalVariableReference): During the resolve
5563         phases, create new expressions if we are in a remapping context.
5564         Remove code that dealt with remapping here.
5565
5566         (ParameterReference): same.
5567
5568         (ProxyInstance): New expression, like the `This' expression, but
5569         it is born fully resolved.  We know what we are doing, so remove
5570         the errors that are targeted to user-provided uses of `this'.
5571
5572         * statement.cs (Foreach): our variable is now stored as an
5573         Expression;  During resolution, follow the protocol, dont just
5574         assume it will return this.
5575
5576 2003-08-06  Martin Baulig  <martin@ximian.com>
5577
5578         * support.cs (SeekableStreamReader.cs): New public class.
5579
5580         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5581         SeekableStreamReader instead of the normal StreamReader.
5582
5583 2003-08-04  Martin Baulig  <martin@ximian.com>
5584
5585         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5586         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5587         deambiguate casts and delegate invocations.
5588         (parenthesized_expression): Use the new tokens to ensure this is
5589         not a cast of method invocation.
5590
5591         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5592         when reading a `)' and Deambiguate_CloseParens () was previously
5593         called.
5594
5595         * expression.cs (ParenthesizedExpression): New class.  This is
5596         just used for the CS0075 test.
5597         (Binary.DoResolve): Check for CS0075.   
5598
5599 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5600
5601         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5602         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5603         reference comparison.
5604
5605         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5606         examine the ReturnType for equality - this is necessary in the
5607         cases of implicit and explicit operators whose signature also
5608         includes the return type.
5609
5610 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5611
5612         * namespace.cs: Cache the result of the namespace computation,
5613         instead of computing it every time.
5614
5615 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5616
5617         * decl.cs: Use a global arraylist that we reuse over invocations
5618         to avoid excesive memory consumption.  Reduces memory usage on an
5619         mcs compile by one meg (45 average).
5620
5621         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5622         private, work around that.
5623
5624 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5625
5626         * literal.cs (IntLiteral): Define Zero and One static literals. 
5627
5628         * cs-parser.jay (integer_literal): use static literals to reduce
5629         memory usage for the most used literals (0, 1 and -1).  211kb
5630         reduced in memory usage.
5631
5632         Replace all calls to `new ArrayList' with `new
5633         ArrayList(4)' which is a good average number for most allocations,
5634         and also requires only 16 bytes of memory for its buffer by
5635         default. 
5636
5637         This reduced MCS memory usage in seven megabytes for the RSS after
5638         bootstrapping.
5639
5640 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5641
5642         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5643         handle params methods the correct way by forming only one
5644         applicable set with params and normal methods in them. Earlier we
5645         were looking at params methods only if we found no normal methods
5646         which was not the correct thing to do.
5647
5648         (Invocation.BetterFunction): Take separate arguments indicating
5649         when candidate and the best method are params methods in their
5650         expanded form.
5651
5652         This fixes bugs #43367 and #46199.
5653
5654         * attribute.cs: Documentation updates.
5655
5656         (CheckAttribute): Rename to CheckAttributeTarget.
5657         (GetValidPlaces): Rename to GetValidTargets.
5658
5659         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5660         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5661
5662         Fixes bug #44468.
5663
5664 2003-07-28  Martin Baulig  <martin@ximian.com>
5665
5666         * class.cs (TypeContainer.DefineMembers): Use the base type's full
5667         name when looking up the base class of a nested class.  Fixes #46977.
5668
5669 2003-07-26  Martin Baulig  <martin@ximian.com>
5670
5671         * expression.cs (Indexers.Indexer): New nested struct; contains
5672         getter, setter and the indexer's type.
5673         (Indexers.Properties): This is now an ArrayList of
5674         Indexers.Indexer's.
5675         (IndexerAccess.DoResolveLValue): Correctly set the type if the
5676         indexer doesn't have any getters.
5677
5678         * assign.cs (Assign.DoResolve): Also do the implicit conversions
5679         for embedded property and indexer assignments.
5680
5681 2003-07-26  Martin Baulig  <martin@ximian.com>
5682
5683         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
5684         preprocessor directive is not the first non-whitespace character
5685         on a line.
5686
5687 2003-07-26  Martin Baulig  <martin@ximian.com>
5688
5689         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
5690         namespace parsing, follow the spec more closely.
5691
5692         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
5693         NamespaceEntry.Lookup().
5694
5695 2003-07-25  Martin Baulig  <martin@ximian.com>
5696
5697         * MethodCore.cs (OverridesSomething): New public field; it's set
5698         from TypeContainer.DefineMembers if this method overrides
5699         something (which doesn't need to be a method).  Fix #39462.
5700
5701 2003-07-25  Ravi Pratap  <ravi@ximian.com>
5702
5703         * typemanager.cs (GetMembers): Ensure that the list of members is
5704         reversed. This keeps things in sync.
5705
5706         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
5707         find an AttributeUsage attribute.
5708
5709         * expression.cs (Invocation.OverloadResolve): Perform the check
5710         which disallows Invoke to be directly called on a Delegate.
5711
5712         (Error_InvokeOnDelegate): Report error cs1533.
5713
5714 2003-07-25  Martin Baulig  <martin@ximian.com>
5715
5716         * expression.cs (Indexers.GetIndexersForType): Only look in the
5717         interface hierarchy if the requested type is already an
5718         interface.  Fixes #46788 while keeping #46502 fixed.
5719
5720 2003-07-25  Martin Baulig  <martin@ximian.com>
5721
5722         * class.cs (TypeContainer.DefineMembers): Check whether all
5723         readonly fields have been assigned and report warning CS0649 if
5724         not.
5725
5726         * statement.cs (LocalInfo.IsFixed): Always return true if this is
5727         a valuetype.
5728
5729 2003-07-24  Ravi Pratap  <ravi@ximian.com>
5730
5731         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
5732         returned from GetMethods to make things consistent with the
5733         assumptions MCS makes about ordering of methods.
5734
5735         This should comprehensively fix bug #45127 and it does :-)
5736
5737         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
5738         ordering is actually reverse.
5739
5740         * Clean up some debug messages I left lying around.
5741
5742         * interface.cs (Populate*): Get rid of code which emits attributes
5743         since the stage in which we emit attributes is the 'Emit' stage,
5744         not the define stage.
5745
5746         (Emit): Move attribute emission for interface members here.
5747
5748 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5749
5750         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5751         closely: we eliminate methods in base types when we have an
5752         applicable method in a top-level type.
5753
5754         Please see section 14.5.5.1 for an exact description of what goes
5755         on. 
5756
5757         This fixes bug #45127 and a host of other related to corlib compilation.
5758
5759         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5760         array is the method corresponding to the top-level type (this is
5761         because of the changes made to icall.c) so we change this
5762         accordingly.
5763
5764         (MethodGroupExpr.Name): This too.
5765
5766         * typemanager.cs (GetElementType): New method which does the right
5767         thing when compiling corlib. 
5768
5769         * everywhere: Make use of the above in the relevant places.
5770
5771 2003-07-22  Martin Baulig  <martin@ximian.com>
5772
5773         * cs-parser.jay (invocation_expression): Moved
5774         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5775         `cast_expression', but create a InvocationOrCast which later
5776         resolves to either an Invocation or a Cast.
5777
5778         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5779         method; call this before EmitStatement() to make sure that this
5780         expression can be used as a statement.
5781
5782         * expression.cs (InvocationOrCast): New class; resolves to either
5783         an Invocation or a Cast.
5784
5785         * statement.cs (StatementExpression): Call ResolveStatement() on
5786         the ExpressionStatement before emitting it.
5787
5788 2003-07-21  Martin Baulig  <martin@ximian.com>
5789
5790         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5791         `ref' and `out' attributes match; fixes #46220.
5792         (MemberAccess.ResolveMemberAccess): You can't reference a type
5793         through an expression; fixes #33180.
5794         (Indexers.GetIndexersForType): Don't return the indexers from
5795         interfaces the class implements; fixes #46502.
5796
5797 2003-07-21  Martin Baulig  <martin@ximian.com>
5798
5799         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5800         CS0661 checks; fixes bug #30442.
5801
5802 2003-07-21  Martin Baulig  <martin@ximian.com>
5803
5804         * decl.cs (AdditionResult): Added `Error'.
5805
5806         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5807
5808         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
5809         makes cs0031.cs actually work.
5810
5811 2003-07-20  Martin Baulig  <martin@ximian.com>
5812
5813         * namespace.cs: Fixed that bug which caused a crash when compiling
5814         the debugger's GUI.
5815
5816 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5817
5818         * typemanager.cs (LookupTypeReflection): Never expose types which
5819         are NotPublic, NestedPrivate, NestedAssembly, or
5820         NestedFamANDAssem.  We used to return these, and later do a check
5821         that would report a meaningful error, but the problem is that we
5822         would not get the real match, if there was a name override.
5823
5824 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5825
5826         * namespace.cs (Namespace, Name): Do not compute the namespace
5827         name dynamically, compute it in the constructor.  This reduced
5828         memory usage by 1697 KB.
5829
5830         * driver.cs: Use --pause to pause at the end.
5831
5832 2003-07-17  Peter Williams  <peter@newton.cx>
5833
5834         * Makefile: Change the name of the test target so that it doesn't
5835         conflict with the recursive test target.
5836
5837 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5838
5839         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5840         AddressOf): Do not use EmitThis, that was wrong, use the actual
5841         this pointer.
5842
5843 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5844
5845         * class.cs (MethodData.Define): While checking if a method is an
5846         interface implementation, improve the test: If we are not public
5847         (use new test here: use the computed MethodAttributes directly,
5848         instead of the parsed modifier flags) check if the `implementing'
5849         method comes from an interface or not.
5850
5851         * pending.cs (VerifyPendingMethods): Slightly better error
5852         message.
5853
5854         * makefile: add test target that does the mcs bootstrap.
5855
5856 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5857
5858         * interface.cs (Define): Do nothing here since there are no
5859         members to populate etc. Move the attribute emission out of here
5860         since this was just totally the wrong place to put it. Attribute
5861         application happens during the 'Emit' phase, not in the 'Define'
5862         phase.
5863
5864         (Emit): Add this method and move the attribute emission here
5865
5866         * rootcontext.cs (EmitCode): Call the Emit method on interface
5867         types too.
5868
5869 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5870
5871         * expression.cs (OverloadResolve): Report error only if Location
5872         is not 'Null' which means that there was a probe going on.
5873
5874 2003-07-14  Martin Baulig  <martin@ximian.com>
5875
5876         * expression.cs (ConditionalLogicalOperator): New public class to
5877         implement user defined conditional logical operators.
5878         This is section 14.11.2 in the spec and bug #40505.
5879
5880 2003-07-14  Martin Baulig  <martin@ximian.com>
5881
5882         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5883
5884 2003-07-14  Martin Baulig  <martin@ximian.com>
5885
5886         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5887
5888         * ecore.cs (IVariable.VerifyFixed): New interface method.
5889
5890         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5891         operator, check whether the variable is actually fixed.  Fixes bug
5892         #36055.  Set a variable definitely assigned when taking its
5893         address as required by the spec.
5894
5895         * statement.cs (LocalInfo.IsFixed): New field.
5896         (LocalInfo.MakePinned): Set `IsFixed' to true.
5897
5898 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5899
5900         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5901         for .ctors, ensure that we only ask for members declared in the
5902         attribute type (BindingFlags.DeclaredOnly).
5903
5904         Fixes bug #43632.
5905
5906         * expression.cs (Error_WrongNumArguments): Report error 1501
5907         correctly the way CSC does.
5908
5909 2003-07-13  Martin Baulig  <martin@ximian.com>
5910
5911         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5912         lookup on the fully qualified name, to make things like "X.X" work
5913         where "X.X" is a fully qualified type name, but we also have a
5914         namespace "X" in the using list.  Fixes #41975.
5915
5916 2003-07-13  Martin Baulig  <martin@ximian.com>
5917
5918         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5919         function. If we're a CompoundAssign, we need to create an embedded
5920         CompoundAssign, not an embedded Assign.
5921         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5922         Fixes #45854.
5923
5924 2003-07-13  Martin Baulig  <martin@ximian.com>
5925
5926         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5927         work to fix bug #46088.
5928
5929 2003-07-13  Ravi Pratap <ravi@ximian.com>
5930
5931         * class.cs (Operator.Emit): Do not emit attributes here - it is
5932         taken care of by the Method class that we delegate too. This takes
5933         care of bug #45876.
5934
5935 2003-07-10  Martin Baulig  <martin@ximian.com>
5936
5937         * expression.cs (TypeOfVoid): New class.
5938         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5939
5940 2003-07-10  Martin Baulig  <martin@ximian.com>
5941
5942         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5943         bug #35957.
5944
5945 2003-07-10  Martin Baulig  <martin@ximian.com>
5946
5947         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5948         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5949
5950         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5951
5952         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5953
5954 2003-07-10  Martin Baulig  <martin@ximian.com>
5955
5956         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5957         of decimal.  Fixes #42850.
5958
5959         NOTE: I also fixed the created byte blob, but this doesn't work on
5960         the MS runtime and csc never produces any byte blobs for decimal
5961         arrays.
5962
5963 2003-07-10  Martin Baulig  <martin@ximian.com>
5964
5965         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5966         structs; fixes #32068.
5967         (Block.AddChildVariableNames): Fixed #44302.
5968
5969 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5970
5971         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5972
5973 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5974
5975         * attribute.cs: And this test is onger needed.
5976
5977 2003-07-08  Martin Baulig  <martin@ximian.com>
5978
5979         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5980         inaccessible types.  Fixes #36313.
5981
5982         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5983
5984         * namespace.cs (NamespaceEntry): Create implicit entries for all
5985         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5986         implicit entries for N1.N2 and N1.
5987
5988 2003-07-08  Martin Baulig  <martin@ximian.com>
5989
5990         Rewrote the handling of namespaces to fix a lot of the issues
5991         wrt. `using' aliases etc.
5992
5993         * namespace.cs (Namespace): Splitted this class into a
5994         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5995
5996         * typemanager.cs (TypeManager.IsNamespace): Removed.
5997         (TypeManager.ComputeNamespaces): Only compute namespaces from
5998         loaded assemblies here, not the namespaces from the assembly we're
5999         currently compiling.
6000
6001 2003-07-08  Martin Baulig  <martin@ximian.com>
6002
6003         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6004
6005 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6006
6007         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6008         already fixed it.  
6009
6010         I thought about the memory savings here, but LookupTypeReflection
6011         is used under already very constrained scenarios.  Compiling
6012         corlib or mcs only exposes one hit, so it would not really reduce
6013         any memory consumption.
6014
6015 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6016
6017         * typemanager.cs: fixes bug #45889 by only adding public types from
6018         other assemblies to the list of known types.
6019
6020 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6021
6022         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6023         on the type we resolved.
6024
6025 2003-07-05  Martin Baulig  <martin@ximian.com>
6026
6027         * pending.cs (PendingImplementation.ParentImplements): Don't
6028         create the proxy if the parent is abstract.
6029
6030         * class.cs (TypeContainer.DefineIndexers): Process explicit
6031         interface implementations first.  Fixes #37714.
6032
6033 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6034
6035         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6036         defined recursively;  but since we modify the input parameters
6037         (left is set to `this' temporarily), we reset this value if the
6038         left_is_explicit is false, which gives the original semantics to
6039         the code.  
6040
6041         * literal.cs (NullPointer): new class used to represent a null
6042         literal in a pointer context.
6043
6044         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6045         type is a pointer, use a NullPointer object instead of a
6046         NullLiteral.   Closes 43687
6047
6048         (ExplicitConversion): Convert pointer values using
6049         the conv opcode to the proper type.
6050
6051         * ecore.cs (New): change ValueTypeVariable property into a method,
6052         that returns whether the valuetype is suitable for being used.
6053
6054         * expression.cs (Binary.DoNumericPromotions): Only return if we
6055         the int constant was a valid uint, and we can return both left and
6056         right as uints.  If not, we continue processing, to trigger the
6057         type conversion.  This fixes 39018.
6058
6059         * statement.cs (Block.EmitMeta): During constant resolution, set
6060         the CurrentBlock property on the emitcontext, so that we resolve
6061         constants propertly.
6062
6063 2003-07-02  Martin Baulig  <martin@ximian.com>
6064
6065         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6066         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6067
6068         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6069         than emitting it here.
6070
6071         * statement.cs: Fixed some more flow analysis bugs.
6072
6073 2003-07-02  Martin Baulig  <martin@ximian.com>
6074
6075         * class.cs (MethodData.Define): When implementing interface
6076         methods, set Final unless we're Virtual.
6077
6078         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6079         check work for interface methods.
6080
6081 2003-07-01  Martin Baulig  <martin@ximian.com>
6082
6083         * ecore.cs (EmitContext.This): Replaced this property with a
6084         GetThis() method which takes a Location argument.  This ensures
6085         that we get the correct error location for a CS0188.
6086
6087 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6088
6089         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6090         ImplicitStandardConversion.
6091
6092         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6093
6094 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6095
6096         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6097         optimization.
6098
6099 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6100
6101         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6102         constructors.
6103
6104         (MethodData.Define): Turn off initlocals for unsafe methods.
6105
6106 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6107
6108         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6109         complete;  Fixes #37521.
6110
6111         * delegate.cs: Use Modifiers.TypeAttr to compute the
6112         TypeAttributes, instead of rolling our own.  This makes the flags
6113         correct for the delegates.
6114
6115 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6116
6117         * class.cs (Constructor.Define): Set the private flag for static
6118         constructors as well.
6119
6120         * cs-parser.jay (statement_expression): Set the return value to
6121         null, to avoid a crash when we catch an error.
6122
6123 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6124
6125         * cs-parser.jay: Applied patch from Jackson that adds support for
6126         extern and unsafe modifiers to destructor declarations.
6127
6128         * expression.cs: Report error 21 if the user is trying to index a
6129         System.Array.
6130
6131         * driver.cs: Add an error message, suggested by the bug report.
6132
6133         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6134         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6135
6136 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6137
6138         * namespace.cs: Add some information to reduce FAQs.
6139
6140 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6141
6142         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6143         underlying enumeration types.  Fixes #43915.
6144
6145         * expression.cs: Treat ushort/short as legal values to be used in
6146         bitwise operations.
6147
6148 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6149
6150         * delegate.cs: transfer custom attributes for paramenters from
6151         the delegate declaration to Invoke and BeginInvoke.
6152
6153 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6154
6155         * attribute.cs: handle custom marshalers and emit marshal info
6156         for fields, too.
6157
6158 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6159
6160         * makefile.gnu: Added anonymous.cs to the compiler sources.
6161
6162 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6163
6164         * iterators.cs: Change the name of the proxy class to include two
6165         underscores.
6166
6167         * cs-parser.jay: Update grammar to include anonymous methods.
6168
6169         * anonymous.cs: new file.
6170
6171 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6172
6173         * class.cs (Field.Define): Add missing test for pointers and
6174         safety. 
6175
6176 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6177
6178         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6179         we use the stobj opcode.
6180
6181         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6182         since it wasn't the correct fix. 
6183
6184         It still is puzzling that we are required to use stobj for IntPtr
6185         which seems to be a ValueType.
6186
6187 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6188
6189         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6190         during regular simple name resolution.   Now, the trick is that
6191         instead of returning for processing the simplename, we do a
6192         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6193         contextual lookup type).   If a match is found, return that, if
6194         not, return for further composition.
6195
6196         This fixes long-standing 30485.
6197
6198         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6199         using the address to initialize an object, do an Stobj instead of
6200         using the regular Stelem.
6201
6202         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6203         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6204         Because if we are a BaseIndexerAccess that value will be true.
6205         Fixes 43643.
6206
6207         * statement.cs (GotoCase.Resolve): Return after reporting an
6208         error, do not attempt to continue. 
6209
6210         * expression.cs (PointerArithmetic.Emit): If our operand is a
6211         long, convert our constants to match the operand before
6212         multiplying.  Convert to I type before adding.   Fixes 43670.
6213
6214 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6215
6216         * enum.cs (ImplicitConversionExists) : Rename to
6217         ImplicitEnumConversionExists to remove ambiguity. 
6218
6219         * ecore.cs (NullCast): New type of cast expression class which
6220         basically is very similar to EmptyCast with the difference being
6221         it still is a constant since it is used only to cast a null to
6222         something else
6223         (eg. (string) null)
6224
6225         * convert.cs (ImplicitReferenceConversion): When casting a null
6226         literal, we return a NullCast.
6227
6228         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6229         should be around anymore.
6230
6231         The renaming (reported was slightly wrong). Corrections:
6232
6233         ConvertImplicitStandard -> ImplicitConversionStandard
6234         ConvertExplicitStandard -> ExplicitConversionStandard
6235
6236         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6237         before passing them in !
6238
6239         * convert.cs (ImplicitConversionStandard): When comparing for
6240         equal expr and target types, ensure that expr is not a
6241         NullLiteral.
6242
6243         In general, we must not be checking (expr_type ==
6244         target_type) in the top level conversion methods
6245         (ImplicitConversion, ExplicitConversion etc). This checking is
6246         done in the methods that they delegate to.
6247
6248 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6249
6250         * convert.cs: Move Error_CannotConvertType,
6251         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6252         ImplicitNumericConversion, ImplicitConversionExists,
6253         ImplicitUserConversionExists, StandardConversionExists,
6254         FindMostEncompassedType, FindMostSpecificSource,
6255         FindMostSpecificTarget, ImplicitUserConversion,
6256         ExplicitUserConversion, GetConversionOperators,
6257         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6258         TryImplicitIntConversion, Error_CannotConvertImplicit,
6259         ConvertImplicitRequired, ConvertNumericExplicit,
6260         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6261         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6262         its own file.
6263
6264         Perform the following renames:
6265
6266         StandardConversionExists -> ImplicitStandardConversionExists
6267         ConvertImplicit -> ImplicitConversion
6268         ConvertImplicitStandard -> ImplicitStandardConversion
6269         TryImplicitIntConversion -> ImplicitIntConversion
6270         ConvertImplicitRequired -> ImplicitConversionRequired
6271         ConvertNumericExplicit -> ExplicitNumericConversion
6272         ConvertReferenceExplicit -> ExplicitReferenceConversion
6273         ConvertExplicit -> ExplicitConversion
6274         ConvertExplicitStandard -> ExplicitStandardConversion
6275
6276 2003-05-19  Martin Baulig  <martin@ximian.com>
6277
6278         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6279         (TypeInfo): Added support for structs having structs as fields.
6280
6281         * ecore.cs (FieldExpr): Implement IVariable.
6282         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6283         VariableInfo for the field.
6284
6285 2003-05-18  Martin Baulig  <martin@ximian.com>
6286
6287         * expression.cs (This.DoResolve): Report a CS0027 if we're
6288         emitting a field initializer.
6289
6290 2003-05-18  Martin Baulig  <martin@ximian.com>
6291
6292         * expression.cs (This.ResolveBase): New public function.
6293         (This.DoResolve): Check for CS0188.
6294
6295         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6296         This.Resolve().
6297
6298         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6299         `instance_expression' to null if we don't have any non-static
6300         methods.
6301
6302 2003-05-18  Martin Baulig  <martin@ximian.com>
6303
6304         Reworked the way how local variables and parameters are handled by
6305         the flow analysis code.
6306
6307         * statement.cs (TypeInfo, VariableMap): New public classes.
6308         (VariableInfo): New public class.  This is now responsible for
6309         checking whether a variable has been assigned.  It is used for
6310         parameters and local variables.
6311         (Block.EmitMeta): Take the InternalParameters as argument; compute
6312         the layout of the flow vectors here.
6313         (Block.LocalMap, Block.ParameterMap): New public properties.
6314         (FlowBranching): The .ctor doesn't get the InternalParameters
6315         anymore since Block.EmitMeta() now computes the layout of the flow
6316         vector.
6317         (MyStructInfo): This class is now known as `StructInfo' and nested
6318         in `TypeInfo'; we don't access this directly anymore.
6319
6320         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6321         property and removed IsAssigned(), IsFieldAssigned(),
6322         SetAssigned() and SetFieldAssigned(); we now call them on the
6323         VariableInfo so we don't need to duplicate this code everywhere.
6324
6325         * expression.cs (ParameterReference): Added `Block block' argument
6326         to the .ctor.
6327         (LocalVariableReference, ParameterReference, This): The new
6328         VariableInfo class is now responsible for all the definite
6329         assignment stuff.
6330
6331         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6332         IsParameterAssigned, SetParameterAssigned): Removed.
6333
6334 2003-05-18  Martin Baulig  <martin@ximian.com>
6335
6336         * typemanager.cs (InitCoreTypes): Try calling
6337         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6338         the 3-args-version.  Corlib now also needs our `void_type'.
6339         (GetMethod): Added overloaded version which takes an optional
6340         `bool report_errors' to allow lookups of optional methods.
6341
6342 2003-05-12  Martin Baulig  <martin@ximian.com>
6343
6344         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6345         only used for locals and not for parameters.
6346
6347 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6348
6349         * support.cs (InternalParameters.ParameterType): Return the
6350         ExternalType of the parameter.
6351
6352         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6353         they were unused.
6354
6355 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6356
6357         * class.cs (MethodData.Define): Do not set the `newslot' on
6358         interface members, if they are also flagged as "override".
6359
6360         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6361         better code for ++i and i++.  This only works for static fields
6362         and local variables.
6363
6364         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6365         want to pull the DeclSpace out of the builder_to_declspace instead
6366         of the TypeBuilder (like in TypeContainer.FindMembers).
6367
6368         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6369         instead of LookupTypeContainer.  Fixes the crash on .NET for
6370         looking up interface members.
6371
6372         * const.cs: Create our own emit context during the Definition
6373         stage, so that constants are evaluated in the proper context, when
6374         a recursive definition happens.
6375
6376 2003-05-11  Martin Baulig  <martin@ximian.com>
6377
6378         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6379         new block for a switch section.
6380         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6381         the adding/lookup in the switch block.  Fixes #39828.
6382
6383 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6384
6385         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6386         functionality: I needed to convert the data after I had performed
6387         the add/sub operation into the operands type size.
6388
6389         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6390         pass the type for the box operation, otherwise the resulting
6391         object would have been of type object.
6392
6393         (BoxedCast): Add constructor to specify the type to box as.
6394
6395 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6396
6397         * iterators.cs: I was reusing the `count' variable inadvertently,
6398         take steps to not allow this to happen.
6399
6400 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6401
6402         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6403         by creating an array at the point where the params starts and
6404         putting all those arguments there, then adjusting the size of the
6405         array.
6406
6407 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6408
6409         * expression.cs (New.AddressOf): Implement interface
6410         IMemoryLocation.  This is used when the `new' operator is used in
6411         the context of an invocation to a method on a value type.
6412
6413         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6414         example. 
6415
6416         * namespace.cs: Also check the using aliases here.
6417
6418         * driver.cs: Move the test for using validity after the types have
6419         been entered, so we do a single pass that also includes the using
6420         aliases. 
6421
6422         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6423         in the regular case.   CreateSiblingForFinally is doing extra
6424         error checking.
6425
6426         * attribute.cs (GetAttributeArgumentExpression): Store the result
6427         on an out value, and use the return value to indicate failure
6428         instead of using null (which is a valid return for Constant.GetValue).
6429
6430         * statement.cs: Perform the analysis flow for the increment
6431         portion after the statement, because this will be the real flow of
6432         execution.  Fixes #42385
6433
6434         * codegen.cs (EmitContext.EmitArgument,
6435         EmitContext.EmitStoreArgument): New helper functions when the
6436         RemapToProxy flag is set.
6437
6438         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6439         function.
6440
6441         Add support for remapping parameters. 
6442
6443         * iterators.cs: Propagate parameter values;  Store parameter
6444         values in the proxy classes.
6445
6446 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6447
6448         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6449         need a proxy reference;  I do not know what I was thinking
6450
6451         * cs-parser.jay (constructor_initializer): catch another error,
6452         and display nice message.
6453
6454         (field_declaration): catch void field declaration
6455         to flag a better error. 
6456
6457         * class.cs (MemberBase.CheckBase): Report an error instead of a
6458         warning if a new protected member is declared in a struct. 
6459         (Field.Define): catch the error of readonly/volatile.
6460
6461         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6462
6463         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6464         volatile variable is taken
6465
6466 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6467
6468         * statement.cs (Fixed.Resolve): Report an error if we are not in
6469         an unsafe context.
6470
6471 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6472
6473         * typemanager.cs: reuse the code that handles type clashes for
6474         delegates and enumerations.
6475
6476         * class.cs (Report28): Always report.
6477
6478         * expression.cs (EncodeAsAttribute): Allow nulls here.
6479
6480 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6481
6482         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6483         the functionality for testing whether an expression is valid for
6484         an attribute here.  Also handle the case of arrays of elements
6485         being stored. 
6486
6487         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6488         encoding a linear array into an array of objects that are suitable
6489         to be passed to an CustomAttributeBuilder.
6490
6491         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6492
6493         * ecore.cs: (FieldExpr): Handle field remapping here.
6494
6495         * iteratators.cs: Pass the instance variable (if the method is an
6496         instance method) to the constructors, so we can access the field
6497         variables on the class.
6498
6499         TODO: Test this with structs.  I think the THIS variable on
6500         structs might have to be a pointer, and not a refenrece
6501
6502 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6503
6504         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6505         local variables to fields in a proxy class.
6506
6507         * iterators.cs (PopulateProxy): Rename our internal fields to
6508         <XXX>.  
6509         Create a <THIS> field if we are an instance method, so we can
6510         reference our parent container variables.
6511         (MapVariable): Called back from the EmitContext code to enter a
6512         new variable to field mapping into the proxy class (we just create
6513         a FieldBuilder).
6514
6515         * expression.cs
6516         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6517         for using the remapped locals to fields.
6518
6519         I placed the code here, because that gives the same semantics to
6520         local variables, and only changes the Emit code.
6521
6522         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6523         statements inside iterators.
6524         (VariableInfo): Add a FieldBuilder for the cases when we are
6525         remapping local variables to fields in a proxy class
6526
6527         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6528         current_block != null.
6529
6530         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6531         not cope with strings, as it has been moved to the
6532         TableSwitchEmit.  Fixed bug in switch generation.
6533
6534         * expression.cs (New.DoResolve): Provide more context for the user
6535         when reporting an error.
6536
6537         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6538         pointers. 
6539
6540         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6541         check the permissions for it.  Note than in a type-resolution
6542         context the check was already present in DeclSpace.ResolveType,
6543         but was missing from the MemberAccess.
6544
6545         (ArrayCreation.CheckIndices): warn if the user has
6546         more nested levels of expressions, but there are no more
6547         dimensions specified.  Avoids crash on bug 41906.
6548
6549 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6550
6551         * statement.cs (Block): replace Implicit bool, for a generic
6552         flags.   
6553         New flag: `Unchecked'.  This is used during the EmitMeta phase
6554         (which is out-of-line with the regular Resolve/Emit process for a
6555         statement, as this is done ahead of time, but still gets a chance
6556         to call constant resolve).
6557
6558         (Block.Flags): new enum for adding a new flag.
6559
6560         (Block.EmitMeta): track the state of unchecked.
6561
6562         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6563         to enable constant resolution to work there as well.
6564
6565 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6566
6567         * typemanager.cs (ienumerable_type): Also look up
6568         System.Collections.IEnumerable. 
6569
6570 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6571
6572         TODO: Test more than one conditional per method.
6573
6574         * class.cs (Indexer.Define): Report the location where the user is
6575         referencing the unsupported feature.
6576
6577         (MethodData): Overload the use of `conditionals' to
6578         minimize the creation of needless ArrayLists.   This saves roughly
6579         212kb on my machine.
6580
6581         (Method): Implement the new IIteratorContainer interface.
6582         (Method.SetYields): Implement the method by setting the ModFlags
6583         to contain METHOD_YIELDS.
6584
6585         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6586         which just got set to null.
6587
6588         * iterators.cs: New file.
6589
6590         (Yield, YieldBreak): New statements.
6591
6592         * statement.cs (Return.Resolve): Flag an error if we are used in
6593         an iterator method.
6594
6595         * codegen.cs (InIterator): New flag set if the code is being
6596         compiled in an iterator method.
6597
6598         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6599         internal modifier, and we just use it to avoid adding extra
6600         fields, as this is seldom used.  
6601
6602         * cs-parser.jay: Add yield_statement (yield and yield break).
6603
6604         * driver.cs: New flag -v2 to turn on version 2 features. 
6605
6606         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6607         hashtable when v2 is enabled.
6608
6609 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6610
6611         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6612         there is already a namespace defined with this name.
6613
6614         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6615         people upgraded their corlibs.
6616
6617         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6618         always use fully qualified types, no need to use the compiler
6619         front end.
6620
6621         (TypeManager.IsNamespace): Use binarysearch.
6622
6623         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6624         AddDelegate): I did not quite use the new IsValid API properly: I
6625         have to pass the short-name and the fullname.  I was passing only
6626         the basename instead of the fullname sometimes. 
6627
6628         (TypeContainer.DefineType): call NamespaceClash.
6629
6630         * interface.cs (Interface.DefineType): use NamespaceClash before
6631         defining the type.
6632
6633         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6634         defining the type.
6635
6636         * enum.cs: (Enum.DefineType): use NamespaceClash before
6637         defining the type.
6638
6639         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6640         speed increase.  First, use the negative_hits cache when we get a
6641         negative.  Second, add the type with its full original name
6642         instead of the new . and + encoded name (reflection uses + to
6643         separate type from a nested type).  Use LookupTypeReflection
6644         directly which bypasses the type->name hashtable (that we already
6645         know does not contain the type.
6646
6647         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6648         location/container type. 
6649
6650         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6651
6652 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6653
6654         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6655
6656         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6657         method is being referenced in the method group from a static
6658         context, and report error 120 if so.
6659
6660         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6661         Error118. 
6662
6663         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6664         is created, we create the A namespace).
6665
6666         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6667         Fixes #41591
6668
6669 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6670
6671         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6672         invocation to ModuleBuilder.GetType with the same values will
6673         return a new type instance, so we need to cache its return
6674         values. 
6675
6676         * expression.cs (Binary.ResolveOperator): Only allow the compare
6677         operators on enums if they are of the same type.
6678
6679         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6680         types of ValueType on their own case.  Before we were giving them
6681         the same treatment as objects.
6682
6683         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6684         fullname.  Short name is used to compare against container name.
6685         Fullname is used to check against defined namespace names.
6686
6687         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6688         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6689
6690         (Method.CheckBase): Call parent.
6691         (MemberBase.CheckBase): Check for protected members on sealed
6692         classes.
6693         (PropertyBase.CheckBase): Call parent.
6694         (Field.Define): Call parent.
6695
6696         * report.cs: Negative error codes are now mapped to 8000 - code,
6697         so that the display is render more nicely.
6698
6699         * typemanager.cs: Do not use try/catch, instead report a regular
6700         error. 
6701
6702         (GetPointerType, GetReferenceType): These methods provide
6703         mechanisms to obtain the T* and T& from a T.  We had the code
6704         previously scattered around the code base, and it also used
6705         TypeManager.LookupType that would go through plenty of caches.
6706         This one goes directly to the type source.
6707
6708         In some places we did the Type.GetType followed by
6709         ModuleBuilder.GetType, but not in others, so this unifies the
6710         processing as well.
6711
6712         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6713         statements now that we have namespace information.
6714
6715         * typemanager.cs (IsNamespace): New method, returns whether the
6716         string presented is a namespace or not.
6717
6718         (ComputeNamespaces): New public entry point, computes the list of
6719         available namespaces, using the GetNamespaces API call in Mono, or
6720         the slower version in MS.NET.   
6721
6722         Now before we start the semantic analysis phase, we have a
6723         complete list of namespaces including everything that the user has
6724         provided.
6725
6726         Deleted old code to cache namespaces in .nsc files.
6727
6728 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6729
6730         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6731         class/struct location definition Location for the implicit
6732         constructor location.
6733
6734         (Operator.Define): Use the location of the operator for the
6735         implicit Method definition.
6736
6737         (Constructor.Emit): use the constructor location for the implicit
6738         base initializer constructor.
6739
6740         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6741         and the Expression class now contains two new methods:
6742
6743         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6744         isolate type lookup from the rest of the resolution process.
6745
6746         Since we use Expressions to hold type definitions due to the way
6747         we parse the input we have historically overloaded Resolve to
6748         perform the Type lookups if a special flag is passed.  Now this is
6749         eliminated and two methods take their place. 
6750
6751         The differences in the two methods between xStep and xTerminal is
6752         that xStep is involved in our current lookup system that uses
6753         SimpleNames to compose a name, while xTerminal is used just to
6754         catch the case where the simplename lookup failed.
6755
6756 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6757
6758         * expression.cs (ResolveMemberAccess): Remove redundant code.
6759         TypeExpr expressions are always born fully resolved.
6760
6761         * interface.cs (PopulateMethod): Do not lookup the types twice.
6762         We were doing it once during SemanticAnalysis and once during
6763         PopulateMethod.
6764
6765         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6766         in local variable type definitions, were being returned as a
6767         SimpleName (we decomposed everything into a string), that is
6768         because primary_expression was being used instead of a type in the
6769         grammar (reduce/reduce conflicts).
6770
6771         The part that was wrong is that we converted the expression into a
6772         string (an oversimplification in one hand, compounded with primary
6773         expressions doing string concatenation).
6774
6775         So things like:
6776
6777         A.B.C [] x;
6778
6779         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6780         using clauses from working on this particular context.  And a type
6781         was being matched directly against "A.B.C[]".
6782
6783         We now use the correct approach, and allow for ComposedCast to be
6784         part of the unary expression.  So the "A.B.C []" become a composed
6785         cast of "A.B.C" (as a nested group of MemberAccess with a
6786         SimpleName at the end) plus the rank composition "[]". 
6787
6788         Also fixes 35567
6789
6790 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6791
6792         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6793         for the access level checking.
6794
6795         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6796         `TypeContainer container', because I kept getting confused when I
6797         was debugging this code.
6798
6799         * expression.cs (Indexers): Instead of tracking getters/setters,
6800         we now track them in parallel.  We create one arraylist less, but
6801         most importantly it is possible now for the LValue code to find a
6802         matching get for a set.
6803
6804         (IndexerAccess.DoResolveLValue): Update the code.
6805         GetIndexersForType has been modified already to extract all the
6806         indexers from a type.  The code assumed it did not.
6807
6808         Also make the code set the correct return type for the indexer.
6809         This was fixed a long time ago for properties, but was missing for
6810         indexers.  It used to be void_type.
6811
6812         (Binary.Emit): Test first for doubles instead of
6813         floats, as they are more common.
6814
6815         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6816         when dealing with floats and the <=, >= operators.  This fixes bug
6817         #39314 
6818
6819         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6820         to load the array value by emitting a load on the foreach variable
6821         type.  This was incorrect.  
6822
6823         We now emit the code to load an element using the the array
6824         variable type, and then we emit the conversion operator.
6825
6826         Fixed #40176
6827
6828 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6829
6830         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6831
6832 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6833
6834         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6835         test for protection before we test for signatures. 
6836
6837         (MethodSignature.ToString): implement.
6838
6839         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6840         to the case where we reduced into a LongConstant.
6841
6842         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6843         depend on whether the information is acurrate, because the
6844         Microsoft runtime will always claim that the array type is public,
6845         regardless of the real state.
6846
6847         If the type is a pointer, another problem happens: the type is
6848         reported as non-public in Microsoft.  
6849
6850         In both cases we have to call CheckAccessLevel recursively with
6851         the underlying type as the argument to be tested.
6852
6853 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6854
6855         * assign.cs (Assign.Emit): If we are dealing with a compound
6856         assignment expression, we should use the code path that stores the
6857         intermediate result in a temporary value.  This fixes #40903.
6858
6859         *expression.cs (Indirection.ToString): Provide ToString method for
6860         debugging. 
6861
6862 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6863
6864         * class.cs: Null out fields holding references to Block objects so
6865         they can be garbage collected.
6866
6867         * expression.cs (OverloadResolve): Remove unused local.
6868
6869 2003-04-07  Martin Baulig  <martin@ximian.com>
6870
6871         * codegen.cs (EmitContext.CurrentFile): New public field.
6872         (EmitContext.Mark): Use the CurrentFile to check whether the
6873         location is in the correct file.
6874         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6875
6876 2003-04-07  Martin Baulig  <martin@ximian.com>
6877
6878         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6879
6880         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6881         location.  [FIXME: The location argument which gets passed to this
6882         method is sometimes wrong!]
6883
6884 2003-04-07  Nick Drochak <ndrochak@gol.com>
6885
6886         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6887
6888 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6889
6890         * expression.cs (Indirection.EmitAssign): We were using the
6891         temporary, but returning immediately instead of continuing the
6892         EmitAssing flow.
6893
6894 2003-04-06  Martin Baulig  <martin@ximian.com>
6895
6896         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6897         if it's a nested child, but also deriving from the outer class.
6898         See test 190.cs.
6899
6900         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6901         nested child, but also deriving from the outer class.  See
6902         test-190.cs.
6903         (FilterWithClosure): We may access private members of the outer
6904         class if we're a nested child and deriving from the outer class.
6905         (RealMemberLookup): Only set `closure_private_ok' if the
6906         `original_bf' contained BindingFlags.NonPublic.
6907
6908 2003-04-05  Martin Baulig  <martin@ximian.com>
6909
6910         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
6911
6912 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6913
6914         * class.cs (Event.Define): Do not allow abstract events to have
6915         initializers. 
6916
6917 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6918
6919         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6920         block in event declarations.
6921
6922         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6923         value type, get its address.
6924
6925         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6926         leaving a class on the stack instead of a boolean value (int
6927         0/1).  Change the code so we compare against null, and then the
6928         result against zero.
6929
6930         * class.cs (TypeContainer.GetClassBases): We were checking for the
6931         parent class being sealed too late.
6932
6933         * expression.cs (Binary.Emit): For <= and >= when dealing with
6934         floating point values, use cgt.un and clt.un instead of cgt and
6935         clt alone.
6936
6937 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6938
6939         * statement.cs: Apply the same optimization as MS: skip the 
6940         GetEnumerator returning an IEnumerator, and use the one returning a 
6941         CharEnumerator instead. This allows us to avoid the try-finally block 
6942         and the boxing.
6943
6944 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6945
6946         * cs-parser.jay: Attributes cannot be applied to
6947                          namespaces. Fixes #40473
6948
6949 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6950
6951         * class.cs:
6952         (Add*): check if the name is valid using the full name for constants,
6953         fields, properties and events.
6954
6955 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6956
6957         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6958         char constants to be part of the enumeration.
6959
6960         * expression.cs (Conditional.DoResolve): Add support for operator
6961         true. Implements the missing functionality from 14.12
6962
6963         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6964         operator true/false as required by the spec.
6965
6966         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6967         implicit conversion to boolean.
6968
6969         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6970         also one where the type implements `operator true'. 
6971
6972         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6973         get an expression that will invoke operator true based on an
6974         expression.  
6975
6976         (GetConversionOperators): Removed the hack that called op_True
6977         here.  
6978
6979         (Expression.ResolveBoolean): Move this from Statement.
6980
6981 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6982
6983         * ecore.cs (FieldExpr): do not allow initialization of initonly
6984         fields on derived classes
6985
6986 2003-03-13  Martin Baulig  <martin@ximian.com>
6987
6988         * statement.cs (Block.Emit): Call ig.BeginScope() and
6989         ig.EndScope() when compiling with debugging info; call
6990         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6991
6992 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6993
6994         * expression.cs (Indexers): Do not construct immediately, allow
6995         for new members to be appended as we go.  Fixes 38143
6996
6997 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6998
6999         * expression.cs: save/restore context when resolving an unchecked
7000         expression.
7001
7002 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7003
7004         * cfold.cs: Catch division by zero in modulus operator during
7005         constant folding.
7006
7007 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7008
7009         * interface.cs (Interface.DefineMembers): Avoid defining members
7010         twice. 
7011
7012 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7013
7014         * driver.cs: handle the +/- options for -noconfig
7015
7016         * statement.cs (Unckeched.Resolve): Also track the state of
7017         unchecked in the Resolve phase.
7018
7019 2003-02-27  Martin Baulig  <martin@ximian.com>
7020
7021         * ecore.cs (Expression.MemberLookup): Don't create a
7022         MethodGroupExpr for something which is not a method.  Fixes #38291.
7023
7024 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7025
7026         * class.cs (MemberBase.CheckParameters): Also check that the type
7027         is unmanaged if it is a pointer.
7028
7029         * expression.cs (SizeOf.Resolve): Add location information.
7030
7031         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7032         a managed type is declared.
7033
7034         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7035         parameter modifiers as well.  Fixes bug 38606
7036
7037         * class.cs: Very sad.  Am backing out the speed up changes
7038         introduced by the ArrayList -> Array in the TypeContainer, as they
7039         were not actually that much faster, and introduced a bug (no error
7040         reports on duplicated methods).
7041
7042         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7043         source first, this will guarantee that we have a valid expression
7044         before calling in lower levels functions that will require a
7045         resolved object.  Then use this original_source in the
7046         target.ResolveLValue instead of the original source that was
7047         passed to us.
7048
7049         Another change.  Use target.Resolve instead of LValueResolve.
7050         Although we are resolving for LValues, we will let the Assign code
7051         take care of that (it will be called again from Resolve).  This
7052         basically allows code like this:
7053
7054         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7055         class Y { void A (X x) { x [0] += o; }
7056
7057         The problem was that the indexer was trying to resolve for
7058         set_Item (idx, object o) and never finding one.  The real set_Item
7059         was set_Item (idx, X).  By delaying the process we get the right
7060         semantics. 
7061
7062         Fixes bug 36505
7063
7064 2003-02-23  Martin Baulig  <martin@ximian.com>
7065
7066         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7067         while calling DoEmit ().
7068
7069         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7070         source files; if you use the #line directive inside a method, the
7071         compiler stops emitting line numbers for the debugger until it
7072         reaches the end of the method or another #line directive which
7073         restores the original file.
7074
7075 2003-02-23  Martin Baulig  <martin@ximian.com>
7076
7077         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7078
7079 2003-02-23  Martin Baulig  <martin@ximian.com>
7080
7081         * statement.cs (Block.AddChildVariableNames): We need to call this
7082         recursively, not just for our immediate children.
7083
7084 2003-02-23  Martin Baulig  <martin@ximian.com>
7085
7086         * class.cs (Event.Define): Always make the field private, like csc does.
7087
7088         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7089         actually work, fixes bug #37521.
7090
7091 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7092
7093         * delegate.cs: When creating the various temporary "Parameters"
7094         classes, make sure that we call the ComputeAndDefineParameterTypes
7095         on those new parameters (just like we do with the formal ones), to
7096         allow them to be resolved in the context of the DeclSpace.
7097
7098         This fixes the bug that Dick observed in Bugzilla #38530.
7099
7100 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7101
7102         * expression.cs (ResolveMemberAccess): When resolving a constant,
7103         do not attempt to pull a constant if the value was not able to
7104         generate a valid constant.
7105
7106         * const.cs (LookupConstantValue): Do not report more errors than required.
7107
7108 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7109
7110         * expression.cs: fixes bug #38328.
7111
7112 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7113
7114         * class.cs: Changed all the various members that can be part of a
7115         class from being an ArrayList to be an Array of the right type.
7116         During the DefineType type_list, interface_list, delegate_list and
7117         enum_list are turned into types, interfaces, delegates and enums
7118         arrays.  
7119
7120         And during the member population, indexer_list, event_list,
7121         constant_list, field_list, instance_constructor_list, method_list,
7122         operator_list and property_list are turned into their real arrays.
7123
7124         Although we could probably perform this operation earlier, for
7125         good error reporting we need to keep the lists and remove the
7126         lists for longer than required.
7127
7128         This optimization was triggered by Paolo profiling the compiler
7129         speed on the output of `gen-sample-program.pl' perl script. 
7130
7131         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7132         not crash in methods like MemberLookupFailed that use this field.  
7133
7134         This problem arises when the compiler fails to resolve a type
7135         during interface type definition for example.
7136
7137 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7138
7139         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7140         inherit from System.Object, so we have to stop at null, not only
7141         when reaching System.Object.
7142
7143 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7144
7145         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7146         DeclaredOnly because the parent indexer might have had a different
7147         name, but did not loop until the top of the hierarchy was reached.
7148
7149         The problem this one fixes is 35492: when a class implemented an
7150         indexer from an interface, we were getting the interface method
7151         (which was abstract) and we were flagging an error (can not invoke
7152         abstract method).
7153
7154         This also keeps bug 33089 functioning, and test-148 functioning.
7155
7156         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7157         out if a method is special is to see if it is declared in a
7158         property or event, or whether it is one of the predefined operator
7159         names.   This should fix correctly #36804.
7160
7161 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7162
7163         The goal here is to remove the dependency on EmptyCast.Peel ().
7164         Killing it completely.
7165
7166         The problem is that currently in a number of places where
7167         constants are expected, we have to "probe" for an EmptyCast, and
7168         Peel, which is not the correct thing to do, as this will be
7169         repetitive and will likely lead to errors. 
7170
7171         The idea is to remove any EmptyCasts that are used in casts that
7172         can be reduced to constants, so we only have to cope with
7173         constants. 
7174
7175         This bug hunt was triggered by Bug 37363 and the desire to remove
7176         the duplicate pattern where we were "peeling" emptycasts to check
7177         whether they were constants.  Now constants will always be
7178         constants.
7179
7180         * ecore.cs: Use an enumconstant here instead of wrapping with
7181         EmptyCast.  
7182
7183         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7184         throwing me off.  By handling this we can get rid of a few hacks.
7185
7186         * statement.cs (Switch): Removed Peel() code.
7187
7188 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7189
7190         * class.cs: Location information for error 508
7191
7192         * expression.cs (New.DoResolve): Add a guard against double
7193         resolution of an expression.  
7194
7195         The New DoResolve might be called twice when initializing field
7196         expressions (see EmitFieldInitializers, the call to
7197         GetInitializerExpression will perform a resolve on the expression,
7198         and later the assign will trigger another resolution
7199
7200         This leads to bugs (#37014)
7201
7202         * delegate.cs: The signature for EndInvoke should contain any ref
7203         or out parameters as well.  We were not doing this in the past. 
7204
7205         * class.cs (Field.Define): Do not overwrite the type definition
7206         inside the `volatile' group.  Turns out that volatile enumerations
7207         were changing the type here to perform a validity test, which
7208         broke conversions. 
7209
7210 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7211
7212         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7213         and structs, we do not want to load the instance variable
7214
7215         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7216         enum_type has to be handled like an object reference (implicit
7217         conversions exists from this to object), but the regular IsClass
7218         and IsValueType tests will never return true for this one.
7219
7220         Also we use TypeManager.IsValueType instead of type.IsValueType,
7221         just for consistency with the rest of the code (this is only
7222         needed if we ever use the construct exposed by test-180.cs inside
7223         corlib, which we dont today).
7224
7225 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7226
7227         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7228         just InternalCall.
7229
7230 2003-02-09  Martin Baulig  <martin@ximian.com>
7231
7232         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7233         (Namespace.DefineNamespaces): New static public method; this is
7234         called when we're compiling with debugging to add all namespaces
7235         to the symbol file.
7236
7237         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7238         pass it to the Namespace's .ctor.
7239
7240         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7241         and MethodBase arguments; pass the namespace ID to the symwriter;
7242         pass the MethodBase instead of the token to the symwriter.
7243         (SymbolWriter.DefineNamespace): New method to add a namespace to
7244         the symbol file.
7245
7246 2003-02-09  Martin Baulig  <martin@ximian.com>
7247
7248         * symbolwriter.cs: New file.  This is a wrapper around
7249         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7250         methods here in near future.
7251
7252 2003-02-09  Martin Baulig  <martin@ximian.com>
7253
7254         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7255         ILGenerator.MarkSequencePoint() which are actually used by the
7256         symbol writer.
7257
7258 2003-02-09  Martin Baulig  <martin@ximian.com>
7259
7260         * location.cs (SourceFile): New public sealed class.  This
7261         contains the name and an index which is used in the location's token.
7262         (Location): Reserve an appropriate number of bits in the token for
7263         the source file instead of walking over that list, this gives us a
7264         really huge performance improvement when compiling with debugging.
7265
7266         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7267         `SourceFile' argument instead of a string.
7268         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7269         but don't parse/tokenize here, we need to generate the list of all
7270         source files before we do that.
7271         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7272         the files.
7273
7274         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7275         instead of a string.
7276
7277         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7278         of a string.
7279
7280 2003-02-09  Martin Baulig  <martin@ximian.com>
7281
7282         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7283         filename on `#line default'.
7284
7285 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7286
7287         * statement.cs: don't clear the pinned var when the fixed statement
7288         returns from the method (fixes bug#37752).
7289
7290 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7291
7292         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7293         to IsValueType.
7294
7295 2003-02-07  Martin Baulig  <martin@ximian.com>
7296
7297         * driver.cs: Removed the `--debug-args' command line argument.
7298
7299         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7300         automatically by the AsssemblyBuilder.
7301         (CodeGen.InitializeSymbolWriter): We don't need to call any
7302         initialization function on the symbol writer anymore.  This method
7303         doesn't take any arguments.
7304
7305 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7306
7307         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7308         from referenced assemblies as well.
7309
7310 2003-02-02  Martin Baulig  <martin@ximian.com>
7311
7312         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7313
7314 2003-02-02  Martin Baulig  <martin@ximian.com>
7315
7316         * class.cs (Constructor.Emit): Open the symbol writer before
7317         emitting the constructor initializer.
7318         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7319         single-stepping through constructor initializers.
7320
7321 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7322
7323         * class.cs: Handle error 549: do not allow virtual methods in
7324         sealed classes. 
7325
7326 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7327
7328         * decl.cs: Check access levels when resolving types
7329
7330 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7331
7332         * statement.cs: Add parameters and locals set in catch blocks that might 
7333         return to set vector
7334
7335 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7336
7337         * class.cs (Operator): Set the SpecialName flags for operators.
7338
7339         * expression.cs (Invocation.DoResolve): Only block calls to
7340         accessors and operators on SpecialName methods.
7341
7342         (Cast.TryReduce): Handle conversions from char constants.
7343
7344
7345 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7346
7347         * statement.cs: small memory and time optimization in FlowBranching.
7348
7349 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7350
7351         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7352         problem that the last fix but in the other sid (Set).
7353
7354         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7355         access when there is no indexer in the hierarchy.
7356
7357 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7358
7359         * class.cs: Combine some if statements.
7360
7361 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7362
7363         * driver.cs: fixed bug #37187.
7364
7365 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7366
7367         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7368         any indexer, it's needed to build a list with all the indexers in the
7369         hierarchy (AllGetters), else we have problems. Fixes #35653.
7370
7371 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7372
7373         * class.cs (MethodData.Define): It is wrong for an interface
7374         implementation to be static in both cases: explicit and implicit.
7375         We were only handling this in one case.
7376
7377         Improve the if situation there to not have negations.
7378
7379         * class.cs (Field.Define): Turns out that we do not need to check
7380         the unsafe bit on field definition, only on usage.  Remove the test.
7381
7382 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7383
7384         * driver.cs: use assembly.Location instead of Codebase (the latest
7385         patch made mcs fail when using MS assemblies).
7386
7387 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7388
7389         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7390         get the path to *corlib.dll.
7391
7392 2003-01-21  Nick Drochak <ndrochak@gol.com>
7393
7394         * cs-tokenizer.cs:
7395         * pending.cs:
7396         * typemanager.cs: Remove compiler warnings
7397
7398 2003-01-20  Duncan Mak  <duncan@ximian.com>
7399
7400         * AssemblyInfo.cs: Bump the version number to 0.19.
7401
7402 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7403
7404         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7405
7406 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7407
7408         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7409
7410 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7411
7412         * cs-parser.jay: Small fix: we were not comparing the constructor
7413         name correctly.   Thanks to Zoltan for the initial pointer.
7414
7415 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7416
7417         * cs-tokenizer.cs: Set file name when specified with #line
7418
7419 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7420
7421         * cs-parser.jay: Only perform the constructor checks here if we
7422         are named like the class;  This will help provider a better
7423         error.  The constructor path is taken when a type definition is
7424         not found, but most likely the user forgot to add the type, so
7425         report that rather than the constructor error.
7426
7427 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7428
7429         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7430         allocations.
7431
7432 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7433
7434         * cs-parser.jay: Add cleanup call.
7435
7436 2003-01-13  Duncan Mak  <duncan@ximian.com>
7437
7438         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7439         consistent with other methods.
7440
7441 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7442
7443         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7444
7445 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7446
7447         * attribute.cs: only set GuidAttr to true when we have a
7448         GuidAttribute.
7449
7450 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7451
7452         * ecore.cs:
7453         * expression.cs:
7454         * typemanager.cs: fixes to allow mcs compile corlib with the new
7455         Type.IsSubclassOf fix.
7456
7457 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7458
7459         * expression.cs (LocalVariableReference.DoResolve): Classify a
7460         constant as a value, not as a variable.   Also, set the type for
7461         the variable.
7462
7463         * cs-parser.jay (fixed_statement): take a type instead of a
7464         pointer_type, so we can produce a better error message later.
7465
7466         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7467         as an error.  
7468
7469         (For.DoEmit): Make inifinite loops have a
7470         non-conditional branch back.
7471
7472         (Fixed.DoEmit): First populate the pinned variables, then emit the
7473         statement, then clear the variables.  Before I was emitting the
7474         code once for each fixed piece.
7475
7476
7477 2003-01-08  Martin Baulig  <martin@ximian.com>
7478
7479         * statement.cs (FlowBranching.MergeChild): A break in a
7480         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7481
7482 2003-01-08  Martin Baulig  <martin@ximian.com>
7483
7484         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7485         lives in the same number space than `param_map'.  Fixes #36154.
7486
7487 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7488
7489         * cs-parser.jay (constructor_declaration): Set the
7490         Constructor.ModFlags before probing for it.  This makes the
7491         compiler report 514, 515 and 132 (the code was there, but got
7492         broken). 
7493
7494         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7495         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7496         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7497
7498 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7499
7500         * enum.cs: create the enum static fields using the enum type.
7501
7502 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7503
7504         * class.cs: don't try to create the ParamBuilder for the return
7505         type if it's not needed (and handle it breaking for the ms runtime
7506         anyway).
7507
7508 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7509
7510         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7511
7512 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7513
7514         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7515         the command.   This showed up while compiling the JANET source
7516         code, which used \r as its only newline separator.
7517
7518 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7519
7520         * class.cs (Method.Define): If we are an operator (because it
7521         reuses our code), then set the SpecialName and HideBySig.  #36128
7522
7523 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7524
7525         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7526         exception, report error 120 `object reference required'.
7527
7528         * driver.cs: Add --pause option, used during to measure the size
7529         of the process as it goes with --timestamp.
7530
7531         * expression.cs (Invocation.DoResolve): Do not allow methods with
7532         SpecialName to be invoked.
7533
7534 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7535
7536         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7537         number before adding it.
7538
7539 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7540
7541         * ecore.cs (StandardImplicitConversion): When in an unsafe
7542         context, we allow conversion between void * to any other pointer
7543         type. This fixes bug #35973.
7544
7545 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7546
7547         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7548         is not thrown when extensionless outputs are used 
7549
7550 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7551
7552         * rootcontext.cs: fixed compilation of corlib.
7553
7554 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7555
7556         * attribute.cs (Attributes.Contains): Add new method.
7557
7558         * class.cs (MethodCore.LabelParameters): if the parameter is an
7559         `out' parameter, check that no attribute `[In]' has been passed.
7560
7561         * enum.cs: Handle the `value__' name in an enumeration.
7562
7563 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7564
7565         * decl.cs: Added special case to allow overrides on "protected
7566         internal" methods
7567
7568 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7569
7570         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7571         since it makes much more sense.
7572
7573         (Attributes.ctor): Don't require a Location parameter.
7574
7575         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7576
7577         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7578         since we already have that information per attribute.
7579
7580         * everywhere : make appropriate changes.
7581
7582         * class.cs (LabelParameters): Write the code which actually
7583         applies attributes to the return type. We can't do this on the MS
7584         .NET runtime so we flag a warning in the case an exception is
7585         thrown.
7586
7587 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7588
7589         * const.cs: Handle implicit null conversions here too.
7590
7591 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7592
7593         * class.cs (MethodCore.LabelParameters): Remove the extra
7594         Type [] parameter since it is completely unnecessary. Instead
7595         pass in the method's attributes so that we can extract
7596         the "return" attribute.
7597
7598 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7599
7600         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7601         of ignoring it and letting the compile continue.
7602
7603         * typemanager.cs (ChangeType): use an extra argument to return an
7604         error condition instead of throwing an exception.
7605
7606 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7607
7608         * expression.cs (Unary.TryReduce): mimic the code for the regular
7609         code path.  Perform an implicit cast in the cases where we can
7610         implicitly convert to one of the integral types, and then reduce
7611         based on that constant.   This fixes bug #35483.
7612
7613 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7614
7615         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7616
7617 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7618
7619         * namespace.cs: fixed bug #35489.
7620
7621 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7622
7623         * class.cs: Remove some dead code.
7624
7625         * cs-parser.jay: Estimate the number of methods needed
7626         (RootContext.MethodCount);
7627
7628         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7629         numbers instead of StringBuilders.
7630
7631         * support.cs (PtrHashtable): Add constructor with initial size;
7632         We can now reduce reallocations of the method table.
7633
7634 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7635
7636         * attribute.cs (ApplyAttributes): Keep track of the emitted
7637         attributes on a per-target basis. This fixes bug #35413.
7638
7639 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7640
7641         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7642         default to the Windows 1252 encoding.
7643
7644         (UnixParseOption): Support version, thanks to Alp for the missing
7645         pointer. 
7646
7647         * AssemblyInfo.cs: Add nice assembly information.
7648
7649         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7650         (bug 35169).
7651
7652         * cs-parser.jay: Allow a trailing comma before the close bracked
7653         in the attribute_section production.
7654
7655         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7656         address of the instance was being taken, I will take this out,
7657         because we take the address of the object immediately here.
7658
7659 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7660
7661         * typemanager.cs (AreMultipleAllowed): Take care of the most
7662         obvious case where attribute type is not in the current assembly -
7663         stupid me ;-)
7664
7665 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7666
7667         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7668         definitions, instead of doing that afterwards.  
7669
7670         Also we use a nice little hack, depending on the constructor, we
7671         know if we are a "composed" name or a simple name.  Hence, we
7672         avoid the IndexOf test, and we avoid 
7673
7674         * codegen.cs: Add code to assist in a bug reporter to track down
7675         the source of a compiler crash. 
7676
7677 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7678
7679         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7680         types have been emitted for a given element and flag an error
7681         if something which does not have AllowMultiple set is used more
7682         than once.
7683
7684         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7685         attribute types and their corresponding AllowMultiple properties
7686
7687         (AreMultipleAllowed): Check the property for a given type.
7688
7689         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7690         property in the case we have a TypeContainer.
7691
7692         (Attributes.AddAttribute): Detect duplicates and just skip on
7693         adding them. This trivial fix catches a pretty gross error in our
7694         attribute emission - global attributes were being emitted twice!
7695
7696         Bugzilla bug #33187 is now fixed.
7697
7698 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7699
7700         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7701         instead of pp_and).
7702
7703         * expression.cs (Binary.ResolveOperator): I can only use the
7704         Concat (string, string, string) and Concat (string, string,
7705         string, string) if the child is actually a concatenation of
7706         strings. 
7707
7708 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7709
7710         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7711         context where we need a 2-character lookahead.
7712
7713         * pending.cs (PendingImplementation): Rework so we can keep track
7714         of interface types all the time, and flag those which were
7715         implemented by parents as optional.
7716
7717 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7718
7719         * expression.cs (Binary.ResolveOperator): Use
7720         String.Concat(string,string,string) or
7721         String.Concat(string,string,string,string) when possible. 
7722
7723         * typemanager: More helper methods.
7724
7725
7726 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7727
7728         * pending.cs: remove the bogus return from GetMissingInterfaces()
7729         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7730
7731 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7732
7733         * namespace.cs: avoid duplicated 'using xxx' being added to
7734         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7735         when we get more than one 'using' statement for the same namespace.
7736         Report a CS0105 warning for it.
7737
7738 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7739
7740         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7741         of calling getChar/putback, uses internal knowledge of it.    
7742
7743         (xtoken): Reorder tokenizer so most common patterns are checked
7744         first.  This reduces the compilation time in another 5% (from 8.11s
7745         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7746
7747         The parsing time is 22% of the compilation in mcs, and from that
7748         64% is spent on the tokenization process.  
7749
7750         I tried using a binary search for keywords, but this is slower
7751         than the hashtable.  Another option would be to do a couple of
7752         things:
7753
7754                 * Not use a StringBuilder, instead use an array of chars,
7755                   with a set value.  Notice that this way we could catch
7756                   the 645 error without having to do it *afterwards*.
7757
7758                 * We could write a hand-parser to avoid the hashtable
7759                   compares altogether.
7760
7761         The identifier consumption process takes 37% of the tokenization
7762         time.  Another 15% is spent on is_number.  56% of the time spent
7763         on is_number is spent on Int64.Parse:
7764
7765                 * We could probably choose based on the string length to
7766                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7767                   computations. 
7768
7769         Another 3% is spend on wrapping `xtoken' in the `token' function.
7770
7771         Handle 0xa0 as whitespace (#34752)
7772
7773 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7774
7775         * typemanager.cs (IsCLRType): New routine to tell whether a type
7776         is one of the builtin types.  
7777
7778         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7779         typecode in more places instead of doing pointer comparissions.
7780         We could leverage some knowledge about the way the typecodes are
7781         laid out.
7782
7783         New code to cache namespaces in assemblies, it is currently not
7784         invoked, to be used soon.
7785
7786         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7787
7788         * expression.cs (Binary.ResolveOperator): specially handle
7789         strings, and do not perform user-defined operator overloading for
7790         built-in types.
7791
7792 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7793
7794         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7795         internalcall as it is a pretty simple operation;  Avoid whenever
7796         possible to call Char.IsLetter.
7797
7798         (consume_identifier): Cut by half the number of
7799         hashtable calls by merging the is_keyword and GetKeyword behavior.
7800
7801         Do not short-circuit, because if we do, we
7802         report errors (ie, #if false && true would produce an invalid
7803         directive error);
7804
7805
7806 2002-11-24  Martin Baulig  <martin@ximian.com>
7807
7808         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7809         check constant ranges and report a CS0221.  Fixes #33186.
7810
7811 2002-11-24  Martin Baulig  <martin@ximian.com>
7812
7813         * cs-parser.jay: Make this work for uninitialized variable
7814         declarations in the `for' initializer.  Fixes #32416.
7815
7816 2002-11-24  Martin Baulig  <martin@ximian.com>
7817
7818         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7819         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7820
7821 2002-11-24  Martin Baulig  <martin@ximian.com>
7822
7823         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7824         argument; if true, we also check for user-defined conversions.
7825         This is only needed if both arguments are of a user-defined type.
7826         Fixes #30443, added test-175.cs.
7827         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7828
7829         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7830
7831 2002-11-24  Martin Baulig  <martin@ximian.com>
7832
7833         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7834         function to get the store opcode.
7835         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7836         only emit the Ldelema if the store opcode is Stobj.  You must run
7837         both test-34 and test-167 to test this.  Fixes #34529.
7838
7839 2002-11-23  Martin Baulig  <martin@ximian.com>
7840
7841         * ecore.cs (Expression.MemberLookup): Added additional
7842         `qualifier_type' argument which is used when we're being called
7843         from MemberAccess.DoResolve() and null if we're called from a
7844         SimpleName lookup.
7845         (Expression.MemberLookupFailed): New method to report errors; this
7846         does the CS1540 check and reports the correct error message.
7847
7848         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7849         argument for the CS1540 check and redone the way how we're dealing
7850         with private members.  See the comment in the source code for details.
7851         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7852         `closure_start_type' to `closure_qualifier_type' and check whether
7853         it's not null.  It was not this filter being broken, it was just
7854         being called with the wrong arguments.
7855
7856         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7857         and pass it the correct `qualifier_type'; this also does the error
7858         handling for us.
7859
7860 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7861
7862         * expression.cs (Invocation.EmitParams): If the we are dealing
7863         with a non-built-in value type, load its address as well.
7864
7865         (ArrayCreation): Use a a pretty constant instead
7866         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7867         static initializers.  
7868
7869         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7870         because they are not really value types, just glorified integers. 
7871
7872         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7873
7874         * ecore.cs: Remove redundant code for enumerations, make them use
7875         the same code path as everything else, fixes the casting issue
7876         with enumerations in Windows.Forms.
7877
7878         * attribute.cs: Do only cast to string if it is a string, the
7879         validation happens later.
7880
7881         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7882         people upgrade their corlibs.
7883
7884         * ecore.cs: Oops, enumerations were not following the entire code path
7885
7886 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7887
7888         * typemanager.cs (FilterWithClosure): Commented out the test for
7889         1540 in typemanager.cs, as it has problems when accessing
7890         protected methods from a parent class (see test-174.cs). 
7891
7892         * attribute.cs (Attribute.ValidateGuid): new method.
7893         (Attribute.Resolve): Use above.
7894
7895 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7896
7897         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7898
7899         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7900         handling for enumerations, as we only needed the TypeContainer
7901         functionality to begin with (this is required for the fix below to
7902         work for enums that reference constants in a container class for
7903         example). 
7904
7905         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7906
7907         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7908         a valid TypeBuilder to perform lookups on.o
7909
7910         * class.cs (InheritableMemberSignatureCompare): Use true in the
7911         call to GetGetMethod and GetSetMethod, because we are comparing
7912         the signature, and we need to get the methods *even* if they are
7913         private. 
7914
7915         (PropertyBase.CheckBase): ditto.
7916
7917         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7918         GotoCase.Resolve): Use Peel on EmpytCasts.
7919
7920         * ecore.cs (EmptyCast): drop child, add Peel method.
7921
7922 2002-11-17  Martin Baulig  <martin@ximian.com>
7923
7924         * ecore.cs (EmptyCast.Child): New public property.
7925
7926         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7927         label resolved to an EmptyCast.  Fixes #34162.
7928         (GotoCase.Resolve): Likewise.
7929         (Block.EmitMeta): Likewise.
7930
7931 2002-11-17  Martin Baulig  <martin@ximian.com>
7932
7933         * expression.cs (Invocation.BetterConversion): Prefer int over
7934         uint; short over ushort; long over ulong for integer literals.
7935         Use ImplicitConversionExists instead of StandardConversionExists
7936         since we also need to check for user-defined implicit conversions.
7937         Fixes #34165.  Added test-173.cs.
7938
7939 2002-11-16  Martin Baulig  <martin@ximian.com>
7940
7941         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7942         with the `true' and `false' literals.  Fixes #33151.
7943
7944 2002-11-16  Martin Baulig  <martin@ximian.com>
7945
7946         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7947         October 22nd; don't do the cs1540 check for static members.
7948
7949         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7950         now using our own filter here and doing the cs1540 check again.
7951
7952 2002-11-16  Martin Baulig  <martin@ximian.com>
7953
7954         * support.cs (InternalParameters): Don't crash if we don't have
7955         any fixed parameters.  Fixes #33532.
7956
7957 2002-11-16  Martin Baulig  <martin@ximian.com>
7958
7959         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7960         when looking up static methods to make this work on Windows.
7961         Fixes #33773.
7962
7963 2002-11-16  Martin Baulig  <martin@ximian.com>
7964
7965         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7966         a setter rather than using PropertyInfo.CanWrite.
7967
7968 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7969
7970         * class.cs: Allow acces to block member by subclasses. Fixes build
7971         breaker.
7972
7973 2002-11-14  Martin Baulig  <martin@ximian.com>
7974
7975         * class.cs (Constructor.Emit): Added the extern/block check.
7976         Fixes bug #33678.
7977
7978 2002-11-14  Martin Baulig  <martin@ximian.com>
7979
7980         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7981         iteration while looking for indexers, this is needed because the
7982         indexer may have a different name in our base classes.  Fixed the
7983         error reporting (no indexers at all, not get accessor, no
7984         overloaded match).  Fixes bug #33089.
7985         (IndexerAccess.DoResolveLValue): Likewise.
7986
7987 2002-11-14  Martin Baulig  <martin@ximian.com>
7988
7989         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7990         indexers.  Fixes the first part of bug #33089.
7991         (MethodSignature.InheritableMemberSignatureCompare): Added support
7992         for properties.
7993
7994 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7995
7996         * attribute.cs (Attribute.Resolve): Catch the
7997         NullReferenceException and report it since it isn't supposed to
7998         happen. 
7999
8000 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8001
8002         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8003         LogicalOr and LogicalAnd that can benefit from recursively
8004         handling EmitBranchable.  The code now should be nice for Paolo.
8005
8006 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8007
8008         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8009         the Type lookups, as we perform quite a number of lookups on
8010         non-Types.  This can be removed once we can deterministically tell
8011         whether we have a type or a namespace in advance.
8012
8013         But this might require special hacks from our corlib.
8014
8015         * TODO: updated.
8016
8017         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8018         and double which avoids a conversion from an integer to a double.
8019
8020         * expression.cs: tiny optimization, avoid calling IsConstant,
8021         because it effectively performs the lookup twice.
8022
8023 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8024
8025         But a bogus return here to keep the semantics of the old code
8026         until the Mono runtime is fixed.
8027
8028         * pending.cs (GetMissingInterfaces): New method used to remove all
8029         the interfaces that are already implemented by our parent
8030         classes from the list of pending methods. 
8031
8032         * interface.cs: Add checks for calls after ResolveTypeExpr.
8033
8034 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8035
8036         * class.cs (Class.Emit): Report warning 67: event not used if the
8037         warning level is beyond 3.
8038
8039         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8040         being a NullLiteral.
8041
8042         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8043         specifiers. 
8044
8045         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8046         path that might fail if a type can not be resolved.
8047
8048         * expression.cs (Binary.Emit): Emit unsigned versions of the
8049         operators. 
8050
8051         * driver.cs: use error 5.
8052
8053 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8054
8055         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8056
8057 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8058
8059         * cs-parser.jay (switch_section): A beautiful patch from Martin
8060         Baulig that fixed 33094.
8061
8062 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8063
8064         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8065         Check whether the base is abstract and report an error if so.
8066
8067         * expression.cs (IndexerAccess.DoResolveLValue,
8068         IndexerAccess.DoResolve): ditto. 
8069
8070         (Invocation.DoResolve): ditto.
8071
8072         (Invocation.FullMethodDesc): Improve the report string.
8073
8074         * statement.cs (Block): Eliminate IsVariableDefined as it is
8075         basically just a wrapper for GetVariableInfo.
8076
8077         * ecore.cs (SimpleName): Use new 
8078
8079         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8080         type, as we return the actual parameter ref/unref state on a
8081         different call.
8082
8083 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8084
8085         * support.cs: Return proper flags REF/OUT fixing the previous
8086         commit.  
8087
8088         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8089         not used to mean `ref' but `ref or out' in ParameterReference
8090
8091         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8092         full type signature instead of calling TypeManger.CSharpName
8093         ourselves. 
8094
8095         * support.cs (InternalParameters.ParameterDesc): Do not compare
8096         directly to the modflags, because REF/OUT will actually be bitsets
8097         if set. 
8098
8099         * delegate.cs (VerifyMethod): Check also the modifiers.
8100
8101         * cs-tokenizer.cs: Fix bug where floating point values with an
8102         exponent where a sign was missing was ignored.
8103
8104         * driver.cs: Allow multiple assemblies to be specified in a single
8105         /r: argument
8106
8107 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8108
8109         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8110         because identifiers after a parenthesis would end up in this kind
8111         of production, and we needed to desamiguate it for having casts
8112         like:
8113
8114                 (UserDefinedType *) xxx
8115
8116 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8117
8118         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8119         we should set on the Bindingflags.NonPublic, but not turn on
8120         private_ok.  private_ok controls whether a Private member is
8121         returned (this is chekced on the filter routine), while the
8122         BindingFlags.NonPublic just controls whether private/protected
8123         will be allowed.   This fixes the problem part of the problem of
8124         private properties being allowed to be used in derived classes.
8125
8126         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8127         so we can call the children DoResolveLValue method (this will
8128         properly signal errors on lvalue assignments to base properties)
8129
8130         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8131         getter are null, and we have a property info, we know that this
8132         happened because the lookup failed, so we report an error 122 for
8133         protection level violation.
8134
8135         We also silently return if setter and getter are null in the
8136         resolve functions, this condition only happens if we have flagged
8137         the error before.  This is the other half of the problem. 
8138
8139         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8140         not have accessibility information, that is why we were returning
8141         true in the filter function in typemanager.cs.
8142
8143         To properly report 122 (property is inaccessible because of its
8144         protection level) correctly, we report this error in ResolveAccess
8145         by failing if both the setter and the getter are lacking (ie, the
8146         lookup failed). 
8147
8148         DoResolve and DoLResolve have been modified to check for both
8149         setter/getter being null and returning silently, the reason being
8150         that I did not want to put the knowledge about this error in upper
8151         layers, like:
8152
8153         int old = Report.Errors;
8154         x = new PropertyExpr (...);
8155         if (old != Report.Errors)
8156                 return null;
8157         else
8158                 return x;
8159
8160         So the property expr is returned, but it is invalid, so the error
8161         will be flagged during the resolve process. 
8162
8163         * class.cs: Remove InheritablePropertySignatureCompare from the
8164         class, as we no longer depend on the property signature to compute
8165         whether it is possible to implement a method or not.
8166
8167         The reason is that calling PropertyInfo.GetGetMethod will return
8168         null (in .NET, in Mono it works, and we should change this), in
8169         cases where the Get Method does not exist in that particular
8170         class.
8171
8172         So this code:
8173
8174         class X { public virtual int A { get { return 1; } } }
8175         class Y : X { }
8176         class Z : Y { public override int A { get { return 2; } } }
8177
8178         Would fail in Z because the parent (Y) would not have the property
8179         defined.  So we avoid this completely now (because the alternative
8180         fix was ugly and slow), and we now depend exclusively on the
8181         method names.
8182
8183         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8184         reference method, instead of using the property.
8185
8186         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8187         routines are gone now.
8188
8189         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8190         names, they were incorrectly named.
8191
8192         * cs-tokenizer.cs: Return are more gentle token on failure. 
8193
8194         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8195         had an out-of-sync index variable, which caused it to remove from
8196         the list of pending methods the wrong method sometimes.
8197
8198 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8199
8200         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8201         CanWrite, because those refer to this particular instance of the
8202         property, and do not take into account the fact that we can
8203         override single members of a property.
8204
8205         Constructor requires an EmitContext.  The resolution process does
8206         not happen here, but we need to compute the accessors before,
8207         because the resolution does not always happen for properties.
8208
8209         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8210         subclass, before we did not update this flag, but we did update
8211         bindingflags. 
8212
8213         (GetAccessors): Drop this routine, as it did not work in the
8214         presence of partially overwritten set/get methods. 
8215
8216         Notice that this broke the cs1540 detection, but that will require
8217         more thinking. 
8218
8219 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8220
8221         * class.cs:
8222         * codegen.cs:
8223         * driver.cs: issue a warning instead of an error if we don't support
8224         debugging for the platform. Also ignore a couple of errors that may
8225         arise when trying to write the symbols. Undo my previous patch.
8226
8227 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8228
8229         * driver.cs: ignore /debug switch except for Unix platforms.
8230
8231 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8232
8233         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8234
8235 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8236
8237         * driver.cs: Do not make mcs-debug conditional, so we do not break
8238         builds that use it.
8239
8240         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8241         review this patch.  But basically after all the children variables
8242         have been merged, the value of "Breaks" was not being set to
8243         new_breaks for Switch blocks.  I think that it should be set after
8244         it has executed.  Currently I set this to the value of new_breaks,
8245         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8246         conservative, but I do not understand this code very well.
8247
8248         I did not break anything in the build, so that is good ;-)
8249
8250         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8251
8252 2002-10-20  Mark Crichton  <crichton@gimp.org>
8253
8254         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8255
8256 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8257
8258         * cfold.cs: Fixed compile blocker.
8259
8260 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8261
8262         * driver.cs: I was chekcing the key, not the file.
8263
8264 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8265
8266         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8267         message that we were generating - we just need to silently return
8268         a null.
8269
8270 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8271
8272         * class.cs (Event.Define): Change my previous commit, as this
8273         breaks the debugger.  This is a temporary hack, as it seems like
8274         the compiler is generating events incorrectly to begin with.
8275
8276         * expression.cs (Binary.ResolveOperator): Added support for 
8277         "U operator - (E x, E y)"
8278
8279         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8280         y)".
8281
8282         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8283         init-only variables, but this path did not take into account that
8284         there might be also instance readonly variables.  Correct this
8285         problem. 
8286
8287         This fixes bug 32253
8288
8289         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8290         delegates as well.
8291
8292         * driver.cs: Change the extension for modules to `netmodule'
8293
8294         * cs-parser.jay: Improved slightly the location tracking for
8295         the debugger symbols.
8296
8297         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8298         modifiers that were specified instead of the hardcoded value
8299         (FamAndAssem).  This was basically ignoring the static modifier,
8300         and others.  Fixes 32429.
8301
8302         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8303         fixed a bug in the process (32476)
8304
8305         * expression.cs (ArrayAccess.EmitAssign): Patch from
8306         hwang_rob@yahoo.ca that fixes bug 31834.3
8307
8308 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8309
8310         * driver.cs: Make the module extension .netmodule.
8311
8312 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8313
8314         * driver.cs: Report an error if the resource file is not found
8315         instead of crashing.
8316
8317         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8318         false, like Emit does.
8319
8320 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8321
8322         * typemanager.cs: Remove unused private member.  Also reported mcs
8323         bug to report this as a warning like csc.
8324
8325 2002-10-15  Martin Baulig  <martin@gnome.org>
8326
8327         * statement.cs (Statement.Emit): Made this a virtual method; emits
8328         the line number info and calls DoEmit().
8329         (Statement.DoEmit): New protected abstract method, formerly knows
8330         as Statement.Emit().
8331
8332         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8333
8334 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8335
8336         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8337         have fixed a remaining problem: not every AddXXXX was adding a
8338         fully qualified name.  
8339
8340         Now everyone registers a fully qualified name in the DeclSpace as
8341         being defined instead of the partial name.  
8342
8343         Downsides: we are slower than we need to be due to the excess
8344         copies and the names being registered this way.  
8345
8346         The reason for this is that we currently depend (on the corlib
8347         bootstrap for instance) that types are fully qualified, because
8348         we dump all the types in the namespace, and we should really have
8349         types inserted into the proper namespace, so we can only store the
8350         basenames in the defined_names array.
8351
8352 2002-10-10  Martin Baulig  <martin@gnome.org>
8353
8354         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8355         from bug #31834, see the bug report for a testcase which is
8356         miscompiled.
8357
8358 2002-10-10  Martin Baulig  <martin@gnome.org>
8359
8360         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8361         flow analysis code for this.
8362
8363         * statement.cs (Do, While, For): Tell the flow analysis code about
8364         infinite loops.
8365         (FlowBranching.UsageVector): Added support for infinite loops.
8366         (Block.Resolve): Moved the dead code elimination here and use flow
8367         analysis to do it.
8368
8369 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8370
8371         * class.cs (Field.Define): Catch cycles on struct type
8372         definitions. 
8373
8374         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8375         fields if the fields are static.  We only need to check instance
8376         fields. 
8377
8378         * expression.cs (As.DoResolve): Test for reference type.
8379
8380         * statement.cs (Using.ResolveExpression): Use
8381         ConvertImplicitRequired, not ConvertImplicit which reports an
8382         error on failture
8383         (Using.ResolveLocalVariableDecls): ditto.
8384
8385         * expression.cs (Binary.ResolveOperator): Report errors in a few
8386         places where we had to.
8387
8388         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8389
8390 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8391
8392         * expression.cs: Use StoreFromPtr instead of extracting the type
8393         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8394
8395         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8396         an enumeration value to a System.Enum, but System.Enum is not a
8397         value type, but an class type, so we need to box.
8398
8399         (Expression.ConvertExplicit): One codepath could return
8400         errors but not flag them.  Fix this.  Fixes #31853
8401
8402         * parameter.cs (Resolve): Do not allow void as a parameter type.
8403
8404 2002-10-06  Martin Baulig  <martin@gnome.org>
8405
8406         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8407         if it's a class type and not a struct.  Fixes #31815.
8408
8409 2002-10-06  Martin Baulig  <martin@gnome.org>
8410
8411         * statement.cs: Reworked the flow analysis code a bit to make it
8412         usable for dead code elimination.
8413
8414 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8415
8416         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8417
8418 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8419
8420         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8421         to fix the test 165, will investigate deeper.
8422
8423 2002-10-04  Martin Baulig  <martin@gnome.org>
8424
8425         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8426         finally blocks actually work.
8427         (Try.Resolve): We don't need to create a sibling for `finally' if
8428         there is no finally block.
8429
8430 2002-10-04  Martin Baulig  <martin@gnome.org>
8431
8432         * class.cs (Constructor.Define): The default accessibility for a
8433         non-default constructor is private, not public.
8434
8435 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8436
8437         * class.cs (Constructor): Make AllowedModifiers public, add
8438         EXTERN.
8439
8440         * cs-parser.jay: Perform the modifiers test here, as the
8441         constructor for the Constructor class usually receives a zero
8442         because of the way we create it (first we create, later we
8443         customize, and we were never checking the modifiers).
8444
8445         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8446         is a version of LookupTypeReflection that includes the type-name
8447         cache.  This can be used as a fast path for functions that know
8448         the fully qualified name and are only calling into *.GetType() to
8449         obtain a composed type.
8450
8451         This is also used by TypeManager.LookupType during its type
8452         composition.
8453
8454         (LookupType): We now also track the real type name, as sometimes
8455         we can get a quey for the real type name from things like
8456         ComposedCast.  This fixes bug 31422.
8457
8458         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8459         complete type fullname, it does not have to go through the type
8460         resolution system to obtain the composed version of the type (for
8461         obtaining arrays or pointers).
8462
8463         (Conditional.Emit): Use the EmitBoolExpression to
8464         generate nicer code, as requested by Paolo.
8465
8466         (ArrayCreation.CheckIndices): Use the patch from
8467         hwang_rob@yahoo.ca to validate the array initializers. 
8468
8469 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8470
8471         * class.cs (ConstructorInitializer.Emit): simplify code by using
8472         Invocation.EmitCall, and at the same time, fix the bugs in calling
8473         parent constructors that took variable arguments. 
8474
8475         * ecore.cs (Expression.ConvertNumericExplicit,
8476         Expression.ImplicitNumericConversion): Remove the code that
8477         manually wrapped decimal (InternalTypeConstructor call is now gone
8478         as well).
8479
8480         * expression.cs (Cast.TryReduce): Also handle decimal types when
8481         trying to perform a constant fold on the type.
8482
8483         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8484
8485         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8486         that only turned off an error report, and did nothing else. 
8487
8488 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * driver.cs: Handle and ignore /fullpaths
8491
8492 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8493
8494         * expression.cs (Binary.ResolveOperator): Catch the case where
8495         DoNumericPromotions returns true, 
8496
8497         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8498
8499 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8500
8501         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8502         report error 70.
8503
8504 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8505
8506         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8507         conversion exists, but it is also required that the conversion be
8508         performed.  This manifested in "(Type64Enum) 2".  
8509
8510         * class.cs (TypeManager.AddMethod): The fix is not to change
8511         AddEnum, because that one was using a fully qualified name (every
8512         DeclSpace derivative does), but to change the AddMethod routine
8513         that was using an un-namespaced name.  This now correctly reports
8514         the duplicated name.
8515
8516         Revert patch until I can properly fix it.  The issue
8517         is that we have a shared Type space across all namespaces
8518         currently, which is wrong.
8519
8520         Options include making the Namespace a DeclSpace, and merge
8521         current_namespace/current_container in the parser.
8522
8523 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8524
8525         * cs-parser.jay: Improve error reporting when we get a different
8526         kind of expression in local_variable_type and
8527         local_variable_pointer_type. 
8528
8529         Propagate this to avoid missleading errors being reported.
8530
8531         * ecore.cs (ImplicitReferenceConversion): treat
8532         TypeManager.value_type as a target just like object_type.   As
8533         code like this:
8534
8535         ValueType v = 1;
8536
8537         Is valid, and needs to result in the int 1 being boxed before it
8538         is assigned to the value type v.
8539
8540         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8541         to validate the enumeration name.
8542
8543         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8544         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8545         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8546
8547         * ecore.cs (TryImplicitIntConversion): When doing an
8548         implicit-enumeration-conversion, check if the type is 64-bits and
8549         perform a conversion before passing to EnumConstant.
8550
8551 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8552
8553         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8554         report ambiguous type references.  Unlike the MS version, we
8555         report what the ambiguity is.   Innovation at work ;-)
8556
8557         (DeclSpace.FindType): Require a location argument to
8558         display when we display an ambiguous error.
8559
8560         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8561
8562         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8563
8564         * expression.cs (EmitDynamicInitializers): Apply patch from
8565         hwang_rob@yahoo.ca that fixes the order in which we emit our
8566         initializers. 
8567
8568 2002-09-21  Martin Baulig  <martin@gnome.org>
8569
8570         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8571         delegate takes no arguments.
8572
8573 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8574
8575         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8576         from integers.
8577
8578         * expression.cs: Extract the underlying type.
8579
8580         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8581
8582         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8583
8584 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8585
8586         * class.cs (TypeContainer.DefineType): We can not use the nice
8587         PackingSize with the size set to 1 DefineType method, because it
8588         will not allow us to define the interfaces that the struct
8589         implements.
8590
8591         This completes the fixing of bug 27287
8592
8593         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8594         means also structs.  This fixes part of the problem. 
8595         (Expresion.ImplicitReferenceConversionExists): ditto.
8596
8597         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8598         error if there were no errors reported during the type lookup
8599         process, to avoid duplicates or redundant errors.  Without this
8600         you would get an ambiguous errors plus a type not found.  We have
8601         beaten the user enough with the first error.  
8602
8603         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8604         reference. 
8605
8606         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8607         during the resolution process, stop the lookup, this avoids
8608         repeated error reports (same error twice).
8609
8610         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8611
8612         * typemanager.cs (LookupType): Redo the type lookup code to match
8613         the needs of System.Reflection.  
8614
8615         The issue is that System.Reflection requires references to nested
8616         types to begin with a "+" sign instead of a dot.  So toplevel
8617         types look like: "NameSpace.TopLevelClass", and nested ones look
8618         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8619         levels. 
8620
8621 2002-09-19  Martin Baulig  <martin@gnome.org>
8622
8623         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8624         says that a method always returns or always throws an exception,
8625         don't report the CS0161.
8626
8627         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8628         set `Returns = new_returns'.
8629
8630 2002-09-19  Martin Baulig  <martin@gnome.org>
8631
8632         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8633         to an enum constant, check for a CS0176.
8634
8635 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8636
8637         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8638         for operators that must be in pairs and report errors.
8639
8640         * ecore.cs (SimpleName.DoResolveType): During the initial type
8641         resolution process, when we define types recursively, we must
8642         check first for types in our current scope before we perform
8643         lookups in the enclosing scopes.
8644
8645         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8646
8647         (Invocation.VerifyArgumentsCompat): Call
8648         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8649         I thought we were supposed to always call this, but there are a
8650         few places in the code where we dont do it.
8651
8652 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8653
8654         * driver.cs: Add support in -linkres and -resource to specify the
8655         name of the identifier.
8656
8657 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8658
8659         * ecore.cs (StandardConversionExists): Sync with the conversion
8660         code: allow anything-* to void* conversions.
8661
8662         (FindMostSpecificSource): Use an Expression argument
8663         instead of a Type, because we might be handed over a Literal which
8664         gets a few more implicit conversions that plain types do not.  So
8665         this information was being lost.
8666
8667         Also, we drop the temporary type-holder expression when not
8668         required.
8669
8670 2002-09-17  Martin Baulig  <martin@gnome.org>
8671
8672         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8673         this is an explicit interface implementation.
8674
8675 2002-09-17  Martin Baulig  <martin@gnome.org>
8676
8677         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8678         different `IndexerName' attributes.
8679
8680         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8681         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8682         virtual CommonResolve().
8683
8684 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8685
8686         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8687         and convert that to the UnderlyingType.
8688
8689         * statement.cs (Foreach.Resolve): Indexers are just like variables
8690         or PropertyAccesses.
8691
8692         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8693         inside quoted strings, we were not doing this before.
8694
8695 2002-09-16  Martin Baulig  <martin@gnome.org>
8696
8697         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8698         resolve it.  This is needed for the definite assignment check of the
8699         instance expression, fixes bug #29846.
8700         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8701
8702 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8703
8704         * parameter.cs: Fix compile error.  Cannot reference static member
8705         from an instance object.  Is this an mcs bug?
8706
8707 2002-09-14  Martin Baulig  <martin@gnome.org>
8708
8709         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8710         multiple times.  Fixes bug #30295, added test-166.cs.
8711
8712 2002-09-14  Martin Baulig  <martin@gnome.org>
8713
8714         * statement.cs (Block.Emit): Don't emit unreachable code.
8715         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8716         `break' statements.
8717         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8718
8719 2002-09-14  Martin Baulig  <martin@gnome.org>
8720
8721         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8722         is set.
8723
8724 2002-09-14  Martin Baulig  <martin@gnome.org>
8725
8726         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8727         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8728         be false on the ms runtime.
8729
8730 2002-09-13  Martin Baulig  <martin@gnome.org>
8731
8732         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8733         the CS0038 error message.
8734
8735 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8736
8737         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8738         constant inside, return it.
8739
8740 2002-09-12  Martin Baulig  <martin@gnome.org>
8741
8742         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8743         implicit conversion can be done between enum types.
8744
8745         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8746         check whether an implicit conversion to the current enum's UnderlyingType
8747         exists and report an error if not.
8748
8749         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8750         without debugging support.
8751
8752         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8753         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8754
8755 2002-09-12  Martin Baulig  <martin@gnome.org>
8756
8757         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8758
8759         * ecore.cs (IMemberExpr.DeclaringType): New property.
8760         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8761         nonstatic member of an outer type (CS0038).
8762
8763 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8764
8765         * driver.cs: Activate the using-error detector at warning level
8766         4 (at least for MS-compatible APIs).
8767
8768         * namespace.cs (VerifyUsing): Small buglett fix.
8769
8770         * pending.cs (PendingImplementation): pass the container pointer. 
8771
8772         * interface.cs (GetMethods): Allow for recursive definition.  Long
8773         term, I would like to move every type to support recursive
8774         definitions, not the current ordering mechanism that we have right
8775         now.
8776
8777         The situation is this: Attributes are handled before interfaces,
8778         so we can apply attributes to interfaces.  But some attributes
8779         implement interfaces, we will now handle the simple cases
8780         (recursive definitions will just get an error).  
8781
8782         * parameter.cs: Only invalidate types at the end if we fail to
8783         lookup all types.  
8784
8785 2002-09-09  Martin Baulig  <martin@gnome.org>
8786
8787         * ecore.cs (PropertyExpr.Emit): Also check for
8788         TypeManager.system_int_array_get_length so this'll also work when
8789         compiling corlib.  Fixes #30003.
8790
8791 2002-09-09  Martin Baulig  <martin@gnome.org>
8792
8793         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8794         and throw an exception if we can't get the type's size.  Fixed #30040,
8795         added test-165.cs.
8796
8797 2002-09-09  Martin Baulig  <martin@gnome.org>
8798
8799         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8800
8801         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8802         context.  Fixes bug #30027.
8803
8804         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8805         virtual functions.  Fixes bug #30043, added test-164.cs.
8806
8807 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8808
8809         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8810
8811 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8812
8813         * driver.cs: Use an object to get the windows codepage since it's not a
8814         static property.
8815
8816 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8817
8818         * statement.cs (For.Emit): for infinite loops (test == null)
8819         return whether there is a break inside, not always "true".
8820
8821         * namespace.cs (UsingEntry): New struct to hold the name of the
8822         using definition, the location where it is defined, and whether it
8823         has been used in a successful type lookup.
8824
8825         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8826         strings.
8827
8828         * decl.cs: ditto.
8829
8830 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8831
8832         * attribute.cs : Fix incorrect code which relied on catching
8833         a NullReferenceException to detect a null being passed in
8834         where an object was expected.
8835
8836 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8837
8838         * statement.cs (Try): flag the catch variable as assigned
8839
8840         * expression.cs (Cast): Simplified by using ResolveType instead of
8841         manually resolving.
8842
8843         * statement.cs (Catch): Fix bug by using ResolveType.
8844
8845 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8846
8847         * expression.cs (BetterConversion): Special case for when we have
8848         a NullLiteral as the argument and we have to choose between string
8849         and object types - we choose string the way csc does.
8850
8851         * attribute.cs (Attribute.Resolve): Catch the
8852         NullReferenceException and report error #182 since the Mono
8853         runtime no more has the bug and having this exception raised means
8854         we tried to select a constructor which takes an object and is
8855         passed a null.
8856
8857 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8858
8859         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8860         message (1502, 1503) when we can't locate a method after overload
8861         resolution. This is much more informative and closes the bug
8862         Miguel reported.
8863
8864         * interface.cs (PopulateMethod): Return if there are no argument
8865         types. Fixes a NullReferenceException bug.
8866
8867         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8868         expressions too. Previously we were checking only in one place for
8869         positional arguments leaving out named arguments.
8870
8871         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8872         type to the enum type is not allowed. Remove code corresponding to
8873         that.
8874
8875         (ConvertNumericExplicit): Allow explicit conversions from
8876         the underlying type to enum type. This precisely follows the spec
8877         and closes a bug filed by Gonzalo.
8878
8879 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8880
8881         * compiler.csproj:
8882         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8883
8884 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8885
8886         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8887         it was important that we stored the right value after the
8888         reduction in `converted'.
8889
8890 2002-09-04  Martin Baulig  <martin@gnome.org>
8891
8892         * location.cs (Location.SymbolDocument): Use full pathnames for the
8893         source files.
8894
8895 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8896
8897         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8898         of the expression resolve mechanism, because that will catch the
8899         SimpleName error failures.
8900
8901         (Conditional): If we can not resolve the
8902         expression, return, do not crash.
8903
8904 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8905
8906         * cs-tokenizer.cs:
8907         (location): display token name instead of its number.
8908
8909 2002-08-28  Martin Baulig  <martin@gnome.org>
8910
8911         * expression.cs (Binary.ResolveOperator): Don't silently return
8912         but return an error if an operator cannot be applied between two
8913         enum types.
8914
8915 2002-08-28  Martin Baulig  <martin@gnome.org>
8916
8917         * class.cs (Constructor.Define): Set the permission attributes
8918         correctly instead of making all constructors public.
8919
8920 2002-08-28  Martin Baulig  <martin@gnome.org>
8921
8922         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8923         for private members before reporting a CS0103; if we find anything,
8924         it's a CS0122.
8925
8926 2002-08-28  Martin Baulig  <martin@gnome.org>
8927
8928         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8929         to check whether `closure_start_type == closure_invocation_type',
8930         we also need to check whether `m.DeclaringType == closure_invocation_type'
8931         before bypassing the permission checks.  We might be accessing
8932         protected/private members from the base class.
8933         (TypeManager.RealMemberLookup): Only set private_ok if private
8934         members were requested via BindingFlags.NonPublic.
8935
8936         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8937
8938         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8939         MethodGroupExpr.IsExplicitImpl if appropriate.
8940         (Invocation.DoResolve): Don't report the CS0120 for explicit
8941         interface implementations.
8942
8943 2002-08-27  Martin Baulig  <martin@gnome.org>
8944
8945         * expression.cs (Invocation.DoResolve): If this is a static
8946         method and we don't have an InstanceExpression, we must report
8947         a CS0120.
8948
8949 2002-08-25  Martin Baulig  <martin@gnome.org>
8950
8951         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8952         `==' between a valuetype and an object.
8953
8954 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8955
8956         * ecore.cs (TypeExpr): Provide a ToString method.
8957
8958 2002-08-24  Martin Baulig  <martin@gnome.org>
8959
8960         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8961         now called proggie.dbg and it's a binary file.
8962
8963 2002-08-23  Martin Baulig  <martin@gnome.org>
8964
8965         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8966
8967 2002-08-23  Martin Baulig  <martin@gnome.org>
8968
8969         * struct.cs (MyStructInfo.ctor): Make this work with empty
8970         structs; it's not allowed to use foreach() on null.
8971
8972 2002-08-23  Martin Baulig  <martin@gnome.org>
8973
8974         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8975         writer the full pathname of the generated assembly.
8976
8977 2002-08-23  Martin Baulig  <martin@gnome.org>
8978
8979         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8980         A `finally' block never returns or breaks; improved handling of
8981         unreachable code.
8982
8983 2002-08-23  Martin Baulig  <martin@gnome.org>
8984
8985         * statement.cs (Throw.Resolve): Allow `throw null'.
8986
8987 2002-08-23  Martin Baulig  <martin@gnome.org>
8988
8989         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8990         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8991         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8992         MemberLookup would return a wrong event if this is an explicit
8993         interface implementation and the class has an event with the same
8994         name.
8995
8996 2002-08-23  Martin Baulig  <martin@gnome.org>
8997
8998         * statement.cs (Block.AddChildVariableNames): New public method.
8999         (Block.AddChildVariableName): Likewise.
9000         (Block.IsVariableNameUsedInChildBlock): Likewise.
9001         (Block.AddVariable): Check whether a variable name has already
9002         been used in a child block.
9003
9004         * cs-parser.jay (declare_local_variables): Mark all variable names
9005         from the current block as being used in a child block in the
9006         implicit block.
9007
9008 2002-08-23  Martin Baulig  <martin@gnome.org>
9009
9010         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9011         find the symbol writer.
9012
9013         * driver.cs: csc also allows the arguments to /define being
9014         separated by commas, not only by semicolons.
9015
9016 2002-08-23  Martin Baulig  <martin@gnome.org>
9017
9018         * interface.cs (Interface.GetMembers): Added static check for events.
9019
9020 2002-08-15  Martin Baulig  <martin@gnome.org>
9021
9022         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9023         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9024
9025         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9026         why the MethodData.EmitDestructor() change was necessary.
9027
9028 2002-08-20  Martin Baulig  <martin@gnome.org>
9029
9030         * class.cs (TypeContainer.FindMembers): Added static check for events.
9031
9032         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9033
9034         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9035         use Type.GetEvents(), not Type.FindMembers().
9036
9037 2002-08-20  Martin Baulig  <martin@gnome.org>
9038
9039         * decl.cs (MemberCache): Added a special method cache which will
9040         be used for method-only searched.  This ensures that a method
9041         search will return a MethodInfo with the correct ReflectedType for
9042         inherited methods.      
9043
9044 2002-08-20  Martin Baulig  <martin@gnome.org>
9045
9046         * decl.cs (DeclSpace.FindMembers): Made this public.
9047
9048 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9049
9050         * delegate.cs: fixed build on windows.
9051         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9052
9053 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9054
9055         * ecore.cs (StandardConversionExists): Return a false
9056         if we are trying to convert the void type to anything else
9057         since that is not allowed.
9058
9059         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9060         we flag error 70 in the event an event is trying to be accessed
9061         directly from outside the declaring type.
9062
9063 2002-08-20  Martin Baulig  <martin@gnome.org>
9064
9065         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9066         MemberCache from typemanager.cs to decl.cs.
9067
9068 2002-08-19  Martin Baulig  <martin@gnome.org>
9069
9070         * class.cs (TypeContainer): Implement IMemberContainer.
9071         (TypeContainer.DefineMembers): Create the MemberCache.
9072         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9073         return public members if BindingFlags.Public was given, check
9074         whether members are static.
9075
9076 2002-08-16  Martin Baulig  <martin@gnome.org>
9077
9078         * decl.cs (DeclSpace.Define): Splitted this in Define and
9079         DefineMembers.  DefineMembers is called first and initializes the
9080         MemberCache.
9081
9082         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9083         DefineMembers() on all our DeclSpaces.
9084
9085         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9086         but call DefineMembers() on all nested interfaces.  We call their
9087         Define() in our new Define() function.
9088
9089         * interface.cs (Interface): Implement IMemberContainer.
9090         (Interface.Define): Moved all code except the attribute stuf to
9091         DefineMembers().
9092         (Interface.DefineMembers): Initialize the member cache.
9093
9094         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9095         need this anymore since we can use MemberCache.FindMembers directly.
9096
9097 2002-08-19  Martin Baulig  <martin@gnome.org>
9098
9099         * typemanager.cs (MemberCache): When creating the cache for an
9100         interface type, add all inherited members.
9101         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9102         to `out bool used_cache' and documented it.
9103         (TypeManager.MemberLookup): If we already used the cache in the first
9104         iteration, we don't need to do the interfaces check.
9105
9106 2002-08-19  Martin Baulig  <martin@gnome.org>
9107
9108         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9109         here from IMemberFinder and don't implement this interface anymore.
9110         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9111
9112         * typemanager.cs (IMemberFinder): This interface is now only used by
9113         classes which actually support the member cache.
9114         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9115         since we only put DeclSpaces into this Hashtable.
9116         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9117         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9118
9119 2002-08-16  Martin Baulig  <martin@gnome.org>
9120
9121         * typemanager.cs (ICachingMemberFinder): Removed.
9122         (IMemberFinder.MemberCache): New property.
9123         (TypeManager.FindMembers): Merged this with RealFindMembers().
9124         This function will never be called from TypeManager.MemberLookup()
9125         so we can't use the cache here, just the IMemberFinder.
9126         (TypeManager.MemberLookup_FindMembers): Check whether the
9127         IMemberFinder has a MemberCache and call the cache's FindMembers
9128         function.
9129         (MemberCache): Rewrote larger parts of this yet another time and
9130         cleaned it up a bit.
9131
9132 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9133
9134         * driver.cs (LoadArgs): Support quoting.
9135
9136         (Usage): Show the CSC-like command line arguments.
9137
9138         Improved a few error messages.
9139
9140 2002-08-15  Martin Baulig  <martin@gnome.org>
9141
9142         * typemanager.cs (IMemberContainer.Type): New property.
9143         (IMemberContainer.IsInterface): New property.
9144
9145         The following changes are conditional to BROKEN_RUNTIME, which is
9146         defined at the top of the file.
9147
9148         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9149         class'es members, but add all members from TypeHandle.ObjectType
9150         if we're an interface.
9151         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9152         is the current type.
9153         (MemberCache.CacheEntry.Container): Removed this field.
9154         (TypeHandle.GetMembers): Include inherited members.
9155
9156 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9157
9158         * typemanager.cs: fixed compilation and added a comment on a field that
9159         is never used.
9160
9161 2002-08-15  Martin Baulig  <martin@gnome.org>
9162
9163         * class.cs (ConstructorInitializer.Resolve): In the
9164         Expression.MemberLookup call, use the queried_type as
9165         invocation_type.
9166
9167         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9168         declared' attribute, it's always true.
9169         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9170         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9171         temporary wrapper for FindMembers which tells MemberLookup whether
9172         members from the base classes are included in the return value.
9173         This will go away soon.
9174         (TypeManager.MemberLookup): Use this temporary hack here; once the
9175         new MemberCache is completed, we don't need to do the DeclaredOnly
9176         looping here anymore since the MemberCache will take care of this.
9177         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9178         (MemberCache): When creating the MemberCache for a class, get
9179         members from the current class and all its base classes.
9180         (MemberCache.CacheEntry.Container): New field.  This is a
9181         temporary hack until the Mono runtime is fixed to distinguish
9182         between ReflectedType and DeclaringType.  It allows us to use MCS
9183         with both the MS runtime and the unfixed Mono runtime without
9184         problems and without accecting performance.
9185         (MemberCache.SearchMembers): The DeclaredOnly looping from
9186         TypeManager.MemberLookup is now done here.      
9187
9188 2002-08-14  Martin Baulig  <martin@gnome.org>
9189
9190         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9191         Type.GetFields on dynamic types but get the fields from the
9192         corresponding TypeContainer.
9193         (MyStructInfo.GetStructInfo): Added check for enum types.
9194
9195         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9196         (MemberList.SyncRoot): Implemented.
9197         (TypeManager.FilterWithClosure): No need to check permissions if
9198         closure_start_type == closure_invocation_type, don't crash if
9199         closure_invocation_type is null.
9200
9201 2002-08-13  Martin Baulig  <martin@gnome.org>
9202
9203         Rewrote TypeContainer.FindMembers to use a member cache.  This
9204         gives us a speed increase of about 35% for the self-hosting MCS
9205         build and of about 15-20% for the class libs (both on GNU/Linux).
9206
9207         * report.cs (Timer): New class to get enhanced profiling.  This
9208         whole class is "TIMER" conditional since it remarkably slows down
9209         compilation speed.
9210
9211         * class.cs (MemberList): New class.  This is an IList wrapper
9212         which we're now using instead of passing MemberInfo[]'s around to
9213         avoid copying this array unnecessarily.
9214         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9215         (ICachingMemberFinder, IMemberContainer): New interface.
9216         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9217         has already been checked, otherwise use it for the name comparision.
9218         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9219         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9220         if possible.  Returns a MemberList, not a MemberInfo [].
9221         (TypeHandle): New class, implements IMemberContainer.  We create
9222         one instance of this class per type, it contains a MemberCache
9223         which is used to do the member lookups.
9224         (MemberCache): New class.  Each instance of this class contains
9225         all members of a type and a name-based hash table.
9226         (MemberCache.FindMembers): This is our new member lookup
9227         function.  First, it looks up all members of the requested name in
9228         the hash table.  Then, it walks this list and sorts out all
9229         applicable members and returns them.
9230
9231 2002-08-13  Martin Baulig  <martin@gnome.org>
9232
9233         In addition to a nice code cleanup, this gives us a performance
9234         increase of about 1.4% on GNU/Linux - not much, but it's already
9235         half a second for the self-hosting MCS compilation.
9236
9237         * typemanager.cs (IMemberFinder): New interface.  It is used by
9238         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9239         Enum, Delegate or Interface.
9240         (TypeManager.finder_to_member_finder): New PtrHashtable.
9241         (TypeManager.finder_to_container): Removed.
9242         (TypeManager.finder_to_delegate): Removed.
9243         (TypeManager.finder_to_interface): Removed.
9244         (TypeManager.finder_to_enum): Removed.
9245
9246         * interface.cs (Interface): Implement IMemberFinder.
9247
9248         * delegate.cs (Delegate): Implement IMemberFinder.
9249
9250         * enum.cs (Enum): Implement IMemberFinder.
9251
9252         * class.cs (TypeContainer): Implement IMemberFinder.
9253
9254 2002-08-12  Martin Baulig  <martin@gnome.org>
9255
9256         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9257
9258 2002-08-12  Martin Baulig  <martin@gnome.org>
9259
9260         * ecore.cs (ITypeExpression): New interface for expressions which
9261         resolve to a type.
9262         (TypeExpression): Renamed to TypeLookupExpression.
9263         (Expression.DoResolve): If we're doing a types-only lookup, the
9264         expression must implement the ITypeExpression interface and we
9265         call DoResolveType() on it.
9266         (SimpleName): Implement the new ITypeExpression interface.
9267         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9268         hack, the situation that we're only looking up types can't happen
9269         anymore when this method is called.  Moved the type lookup code to
9270         DoResolveType() and call it.
9271         (SimpleName.DoResolveType): This ITypeExpression interface method
9272         is now doing the types-only lookup.
9273         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9274         (ResolveFlags): Added MaskExprClass.
9275
9276         * expression.cs (MemberAccess): Implement the ITypeExpression
9277         interface.
9278         (MemberAccess.DoResolve): Added support for a types-only lookup
9279         when we're called via ITypeExpression.DoResolveType().
9280         (ComposedCast): Implement the ITypeExpression interface.
9281
9282         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9283         Expression.Resolve() with ResolveFlags.Type instead.
9284
9285 2002-08-12  Martin Baulig  <martin@gnome.org>
9286
9287         * interface.cs (Interface.Define): Apply attributes.
9288
9289         * attribute.cs (Attribute.ApplyAttributes): Added support for
9290         interface attributes.
9291
9292 2002-08-11  Martin Baulig  <martin@gnome.org>
9293
9294         * statement.cs (Block.Emit): Only check the "this" variable if we
9295         do not always throw an exception.
9296
9297         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9298         whether the property has a set accessor.
9299
9300 2002-08-11  Martin Baulig  <martin@gnome.org>
9301
9302         Added control flow analysis support for structs.
9303
9304         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9305         with control flow analysis turned off.
9306         (IVariable): New interface.
9307         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9308         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9309         (FieldExpr.DoResolve): Resolve the instance expression with flow
9310         analysis turned off and do the definite assignment check after the
9311         resolving when we know what the expression will resolve to.
9312
9313         * expression.cs (LocalVariableReference, ParameterReference):
9314         Implement the new IVariable interface, only call the flow analysis
9315         code if ec.DoFlowAnalysis is true.
9316         (This): Added constructor which takes a Block argument.  Implement
9317         the new IVariable interface.
9318         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9319         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9320         This does the definite assignment checks for struct members.
9321
9322         * class.cs (Constructor.Emit): If this is a non-static `struct'
9323         constructor which doesn't have any initializer, call
9324         Block.AddThisVariable() to tell the flow analysis code that all
9325         struct elements must be initialized before control returns from
9326         the constructor.
9327
9328         * statement.cs (MyStructInfo): New public class.
9329         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9330         argument to this indexer.  If non-zero, check an individual struct
9331         member, not the whole struct.
9332         (FlowBranching.CheckOutParameters): Check struct members.
9333         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9334         overloaded versions of these methods which take an additional
9335         `int field_idx' argument to check struct members.
9336         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9337         overloaded versions of these methods which take an additional
9338         `string field_name' argument to check struct member.s
9339         (VariableInfo): Implement the IVariable interface.
9340         (VariableInfo.StructInfo): New public property.  Returns the
9341         MyStructInfo instance of the variable if it's a struct or null.
9342         (Block.AddThisVariable): New public method.  This is called from
9343         Constructor.Emit() for non-static `struct' constructor which do
9344         not have any initializer.  It creates a special variable for the
9345         "this" instance variable which will be checked by the flow
9346         analysis code to ensure that all of the struct's fields are
9347         initialized before control returns from the constructor.
9348         (UsageVector): Added support for struct members.  If a
9349         variable/parameter is a struct with N members, we reserve a slot
9350         in the usage vector for each member.  A struct is considered fully
9351         initialized if either the struct itself (slot 0) or all its
9352         members are initialized.
9353
9354 2002-08-08  Martin Baulig  <martin@gnome.org>
9355
9356         * driver.cs (Driver.MainDriver): Only report an error CS5001
9357         if there were no compilation errors.
9358
9359         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9360         `UnsafeContext' property to determine whether the parent is in
9361         unsafe context rather than checking the parent's ModFlags:
9362         classes nested in an unsafe class are unsafe as well.
9363
9364 2002-08-08  Martin Baulig  <martin@gnome.org>
9365
9366         * statement.cs (UsageVector.MergeChildren): Distinguish between
9367         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9368         we return.  Added test17() and test18() to test-154.cs.
9369
9370 2002-08-08  Martin Baulig  <martin@gnome.org>
9371
9372         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9373         Family access, make sure the invoking type isn't a subclass of the
9374         queried type (that'd be a CS1540).
9375
9376         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9377         this method which takes an additional `Type invocation_type'.
9378
9379         * expression.cs (BaseAccess.DoResolve): Use the base type as
9380         invocation and query type.
9381         (MemberAccess.DoResolve): If the lookup failed and we're about to
9382         report a CS0122, try a lookup with the ec.ContainerType - if this
9383         succeeds, we must report a CS1540.
9384
9385 2002-08-08  Martin Baulig  <martin@gnome.org>
9386
9387         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9388         (MethodGroupExpr): Implement the IMemberExpr interface.
9389
9390         * expression (MemberAccess.ResolveMemberAccess): No need to have
9391         any special code for MethodGroupExprs anymore, they're now
9392         IMemberExprs.   
9393
9394 2002-08-08  Martin Baulig  <martin@gnome.org>
9395
9396         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9397         Family, FamANDAssem and FamORAssem permissions.
9398         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9399
9400 2002-08-08  Martin Baulig  <martin@gnome.org>
9401
9402         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9403         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9404         or loop block.
9405
9406 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9407
9408         * driver.cs: implemented /resource option to embed managed resources.
9409
9410 2002-08-07  Martin Baulig  <martin@gnome.org>
9411
9412         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9413         (FieldBase.HasFieldInitializer): New public property.
9414         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9415         returns the field initializer and makes sure it is only resolved once.
9416         (TypeContainer.EmitFieldInitializers): Call
9417         FieldBase.GetInitializerExpression to get the initializer, this ensures
9418         that it isn't resolved multiple times.
9419
9420         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9421         the resolving process (SimpleName/MemberLookup) that we're currently
9422         emitting a field initializer (which must not access any instance members,
9423         this is an error CS0236).
9424
9425         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9426         argument, if the `IsFieldInitializer' flag is set, we must report and
9427         error CS0236 and not an error CS0120.   
9428
9429 2002-08-07  Martin Baulig  <martin@gnome.org>
9430
9431         * ecore.cs (IMemberExpr): New public interface.
9432         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9433         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9434         if the expression is an IMemberExpr.
9435
9436         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9437         to be null, implicitly default to `this' if we're non-static in
9438         this case.  Simplified the code a lot by using the new IMemberExpr
9439         interface.  Also fixed bug #28176 here.
9440
9441 2002-08-06  Martin Baulig  <martin@gnome.org>
9442
9443         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9444         ParameterReferences during semantic analysis so that we can do a
9445         type-only search when resolving Cast, TypeOf and SizeOf.
9446         (block): Pass the `current_local_parameters' to the Block's
9447         constructor.
9448
9449         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9450         argument to the constructor.
9451         (ConstructorInitializer.Resolve): Create a temporary implicit
9452         block with the parameters.
9453
9454         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9455         references here if we aren't doing a type-only search.
9456
9457         * statement.cs (Block): Added constructor which takes a
9458         `Parameters parameters' argument.
9459         (Block.Parameters): New public property.
9460
9461         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9462         to `Parameters' and made it public readonly.
9463
9464 2002-08-06  Martin Baulig  <martin@gnome.org>
9465
9466         * ecore.cs (Expression.Warning): Made this public as well.
9467
9468         * report.cs (Report.Debug): Print the contents of collections.
9469
9470 2002-08-06  Martin Baulig  <martin@gnome.org>
9471
9472         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9473         used to tell Resolve() which kinds of expressions it may return.
9474         (Expression.Resolve): Added overloaded version of this method which
9475         takes a `ResolveFlags flags' argument.  This can be used to tell
9476         Resolve() which kinds of expressions it may return.  Reports a
9477         CS0118 on error.
9478         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9479         ResolveFlags.SimpleName.
9480         (Expression.Error118): Added overloaded version of this method which
9481         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9482         which kinds of expressions are allowed.
9483
9484         * expression.cs (Argument.ResolveMethodGroup): New public method.
9485         Resolves an argument, but allows a MethodGroup to be returned.
9486         This is used when invoking a delegate.
9487
9488         * TODO: Updated a bit.
9489
9490 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9491
9492         Fixed compilation with csc.
9493
9494         * ecore.cs: Expression.Error made public. Is this correct? Should
9495         Warning be made public too?
9496
9497         * expression.cs: use ea.Location instead of ea.loc.
9498         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9499
9500 2002-08-06  Martin Baulig  <martin@gnome.org>
9501
9502         * ecore.cs (Expression.loc): Moved the location here instead of
9503         duplicating it in all derived classes.
9504         (Expression.Location): New public property.
9505         (Expression.Error, Expression.Warning): Made them non-static and
9506         removed the location argument.
9507         (Expression.Warning): Added overloaded version which takes an
9508         `int level' argument.
9509         (Expression.Error118): Make this non-static and removed the
9510         expression and location arguments.
9511         (TypeExpr): Added location argument to the constructor.
9512
9513         * expression.cs (StaticCallExpr): Added location argument to
9514         the constructor.
9515         (Indirection, PointerArithmetic): Likewise.
9516         (CheckedExpr, UnCheckedExpr): Likewise.
9517         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9518         (StringPtr): Likewise.
9519
9520
9521 2002-08-05  Martin Baulig  <martin@gnome.org>
9522
9523         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9524
9525         * assign.cs (Assign.DoResolve): Check whether the source
9526         expression is a value or variable.
9527
9528         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9529         while resolving the corresponding blocks.
9530
9531         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9532         an error, don't silently return null.
9533
9534         * statement.cs (Block.AddVariable): Do the error reporting here
9535         and distinguish between CS0128 and CS0136.
9536         (Block.DoResolve): Report all unused labels (warning CS0164).
9537         (LabeledStatement): Pass the location to the constructor.
9538         (LabeledStatement.HasBeenReferenced): New property.
9539         (LabeledStatement.Resolve): Set it to true here.
9540
9541         * statement.cs (Return.Emit): Return success even after reporting
9542         a type mismatch error (CS0126 or CS0127), this is what csc does and
9543         it avoids confusing the users with any consecutive errors.
9544
9545 2002-08-05  Martin Baulig  <martin@gnome.org>
9546
9547         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9548
9549         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9550
9551         * expression.cs (MemberAccess.DoResolve): Silently return if an
9552         error has already been reported.
9553
9554         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9555         error has already been reported.
9556
9557 2002-08-05  Martin Baulig  <martin@gnome.org>
9558
9559         * statement.cs (UsageVector): Only initialize the `parameters'
9560         vector if we actually have any "out" parameters.
9561
9562 2002-08-05  Martin Baulig  <martin@gnome.org>
9563
9564         * expression.cs (Binary.ResolveOperator): When combining delegates,
9565         they must have the same type.
9566
9567 2002-08-05  Martin Baulig  <martin@gnome.org>
9568
9569         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9570         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9571         work with the ms runtime and we also don't need it: if we're a
9572         PropertyBuilder and not in the `indexer_arguments' hash, then we
9573         are a property and not an indexer.
9574
9575         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9576         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9577         since the latter one doesn't work with the ms runtime.
9578
9579 2002-08-03  Martin Baulig  <martin@gnome.org>
9580
9581         Fixed bugs #27998 and #22735.
9582
9583         * class.cs (Method.IsOperator): New public field.
9584         (Method.CheckBase): Report CS0111 if there's already a method
9585         with the same parameters in the current class.  Report CS0508 when
9586         attempting to change the return type of an inherited method.
9587         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9588         and it's not marked abstract or extern.
9589         (PropertyBase): New abstract base class for Property and Indexer.
9590         (PropertyBase.CheckBase): Moved here from Property and made it work
9591         for indexers.
9592         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9593         the same so we can reuse it there.
9594         (Property, Indexer): Derive from PropertyBase.
9595         (MethodSignature.inheritable_property_signature_filter): New delegate
9596         to find properties and indexers.
9597
9598         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9599         argument and improved error reporting.
9600
9601         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9602         EmptyReadOnlyParameters and made it a property.
9603
9604         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9605         version of this method which takes a `PropertyInfo indexer'.
9606         (TypeManager.RegisterIndexer): New method.
9607
9608         * class.cs: Added myself as author of this file :-)
9609
9610 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9611
9612         * class.cs: fixed compilation on windoze.
9613
9614 2002-08-03  Martin Baulig  <martin@gnome.org>
9615
9616         * interface.cs (Interface.GetInterfaceBases): Check whether all
9617         base interfaces are at least as accessible than the current one.
9618
9619         * class.cs (TypeContainer.GetClassBases): Check whether base types
9620         are at least as accessible than the current type.
9621         (TypeContainer.AsAccessible): Implemented and made non-static.
9622         (MemberBase.CheckParameters): Report errors if the accessibility
9623         checks fail.
9624
9625         * delegate.cs (Delegate.Delegate): The default visibility is
9626         internal for top-level types and private for nested types.
9627         (Delegate.Define): Report errors if the accessibility checks fail.
9628
9629         * enum.cs (Enum.Enum): The default visibility is internal for
9630         top-level types and private for nested types.
9631         (Enum.DefineType): Compute the correct visibility.
9632
9633         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9634         function which takes a `bool is_toplevel' instead of a TypeContainer.
9635
9636         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9637         builtin type.
9638
9639 2002-08-02  Martin Baulig  <martin@gnome.org>
9640
9641         * expression.cs (LocalVariableReferenc): Added constructor which
9642         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9643         (LocalVariableReference.IsReadOnly): New property.
9644         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9645         variable is readonly, use our own readonly flag to do this; you can
9646         use the new constructor to get a writable reference to a read-only
9647         variable.
9648
9649         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9650         reference to the local variable.
9651
9652 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9653
9654         * rootcontext.cs (ResolveCore): Also include System.Exception
9655
9656         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9657         we reach an EmptyStatement.
9658
9659         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9660         is also fine.
9661
9662         * expression.cs (Binary.ResolveOperator): Check error result in
9663         two places.
9664
9665         use brtrue/brfalse directly and avoid compares to null.
9666
9667 2002-08-02  Martin Baulig  <martin@gnome.org>
9668
9669         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9670         Fixes bug #28407, added test-155.cs.
9671
9672 2002-08-01  Martin Baulig  <martin@gnome.org>
9673
9674         * class.cs (Event.EmitDefaultMethod): Make this work with static
9675         events.  Fixes #28311, added verify-3.cs.
9676
9677 2002-08-01  Martin Baulig  <martin@gnome.org>
9678
9679         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9680         `is_disposable' fields.
9681         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9682         `hm.is_disposable' if we're using the collection pattern.
9683         (Foreach.EmitCollectionForeach): Use the correct type for the
9684         enumerator's local variable, only emit the try/finally block if
9685         necessary (fixes #27713).
9686
9687 2002-08-01  Martin Baulig  <martin@gnome.org>
9688
9689         * ecore.cs (Expression.report118): Renamed to Error118 and made
9690         it public static.
9691
9692         * statement.cs (Throw.Resolve): Check whether the expression is of
9693         the correct type (CS0118) and whether the type derives from
9694         System.Exception (CS0155).
9695         (Catch.Resolve): New method.  Do the type lookup here and check
9696         whether it derives from System.Exception (CS0155).
9697         (Catch.CatchType, Catch.IsGeneral): New public properties.
9698
9699         * typemanager.cs (TypeManager.exception_type): Added.
9700
9701 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9702
9703         * driver.cs: Updated About function.
9704
9705 2002-07-31  Martin Baulig  <martin@gnome.org>
9706
9707         Implemented Control Flow Analysis.
9708
9709         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9710         (EmitContext.CurrentBranching): Added.
9711         (EmitContext.StartFlowBranching): Added.
9712         (EmitContext.EndFlowBranching): Added.
9713         (EmitContext.KillFlowBranching): Added.
9714         (EmitContext.IsVariableAssigned): Added.
9715         (EmitContext.SetVariableAssigned): Added.
9716         (EmitContext.IsParameterAssigned): Added.
9717         (EmitContext.SetParameterAssigned): Added.
9718         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9719         Added control flow analysis stuff here.
9720
9721         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9722         resolve the expression as lvalue.
9723         (LocalVariableReference.DoResolve): Check whether the variable has
9724         already been assigned.
9725         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9726         the parameter as assigned here.
9727         (ParameterReference.DoResolve): Check whether the parameter has already
9728         been assigned.
9729         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9730         expression as lvalue.
9731
9732         * statement.cs (FlowBranching): New class for the flow analysis code.
9733         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9734         (LabeledStatement.IsDefined): New public property.
9735         (LabeledStatement.AddUsageVector): New public method to tell flow
9736         analyis that the label may be reached via a forward jump.
9737         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9738         flow analysis.
9739         (VariableInfo.Number): New public field.  This is used by flow analysis
9740         to number all locals of a block.
9741         (Block.CountVariables): New public property.  This is the number of
9742         local variables in this block (including the locals from all parent
9743         blocks).
9744         (Block.EmitMeta): Number all the variables.
9745
9746         * statement.cs: Added flow analysis support to all classes.
9747
9748 2002-07-31  Martin Baulig  <martin@gnome.org>
9749
9750         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9751         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9752         then use this argument.
9753
9754         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9755
9756         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9757         use this to specify /define options.
9758
9759 2002-07-29  Martin Baulig  <martin@gnome.org>
9760
9761         * statement.cs (Fixed): Moved all code that does variable lookups
9762         and resolvings from Emit to Resolve.
9763
9764         * statement.cs (For): Moved all code that does variable lookups
9765         and resolvings from Emit to Resolve.
9766
9767         * statement.cs (Using): Moved all code that does variable lookups
9768         and resolvings from Emit to Resolve.
9769
9770 2002-07-29  Martin Baulig  <martin@gnome.org>
9771
9772         * attribute.cs (Attribute.Resolve): Explicitly catch a
9773         System.NullReferenceException when creating the
9774         CustromAttributeBuilder and report a different warning message.
9775
9776 2002-07-29  Martin Baulig  <martin@gnome.org>
9777
9778         * support.cs (ParameterData.ParameterName): Added method to
9779         get the name of a parameter.
9780
9781         * typemanager.cs (TypeManager.IsValueType): New public method.
9782
9783 2002-07-29  Martin Baulig  <martin@gnome.org>
9784
9785         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9786         is a flag which specifies that it's either ref or out.
9787         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9788         the out parameter to `out Parameter.Modifier mod', also set the
9789         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9790
9791         * support.cs (InternalParameters.ParameterModifier): 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         * expression.cs (Argument.GetParameterModifier): Distinguish
9796         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9797         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9798
9799 2002-07-29  Martin Baulig  <martin@gnome.org>
9800
9801         * expression.cs (ParameterReference.ParameterReference): Added
9802         `Location loc' argument to the constructor.
9803
9804         * cs-parser.jay: Pass location to ParameterReference.
9805
9806 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9807
9808         * statement.cs (Try): Initialize the location.
9809
9810         * cs-parser.jay: pass location to Try.
9811
9812         * expression.cs (Unary.Reduce): Change the prototype to return
9813         whether a constant fold could be performed or not.  The result is
9814         returned in an out parameters.  In the case of Indirection and
9815         AddressOf, we want to perform the full tests.
9816
9817 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9818
9819         * statement.cs (Statement.Emit): Flag dead code.
9820
9821 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9822
9823         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9824
9825 2002-07-27  Martin Baulig  <martin@gnome.org>
9826
9827         * class.cs (MethodData.Define): Put back call to
9828         TypeManager.AddMethod(), accidentally commented this out.
9829
9830         * report.cs (Debug): New public method to print debugging information,
9831         this is `[Conditional ("DEBUG")]'.
9832
9833 2002-07-26  Martin Baulig  <martin@gnome.org>
9834
9835         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9836         (switch_statement): Push the current_block to the switch_stack and
9837         pop it again when we're done with the switch.
9838         (switch_section): The new block is a child of the current_block.
9839         Fixes bug #24007, added test-152.cs.
9840
9841 2002-07-27  Martin Baulig  <martin@gnome.org>
9842
9843         * expression.cs (Invocation.EmitArguments): When calling a varargs
9844         function with only its fixed arguments, we need to pass an empty
9845         array.
9846
9847 2002-07-27  Martin Baulig  <martin@gnome.org>
9848
9849         Mono 0.13 has been released.
9850
9851 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9852
9853         * driver.cs: Rename --resource to --linkres, because that is what
9854         we do currently, we dont support --resource yet.
9855
9856         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9857
9858 2002-07-25  Martin Baulig  <martin@gnome.org>
9859
9860         * class.cs (MethodData): New public class.  This is a `method builder'
9861         class for a method or one accessor of a Property/Indexer/Event.
9862         (MethodData.GetMethodFlags): Moved here from MemberBase.
9863         (MethodData.ApplyAttributes): Likewise.
9864         (MethodData.ApplyObsoleteAttribute): Likewise.
9865         (MethodData.ApplyConditionalAttribute): Likewise.
9866         (MethodData.ApplyDllImportAttribute): Likewise.
9867         (MethodData.CheckAbstractAndExternal): Likewise.
9868         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9869         (MethodData.Emit): Formerly known as Method.Emit().
9870         (MemberBase): Moved everything which was specific to a single
9871         accessor/method to MethodData.
9872         (Method): Create a new MethodData and call Define() and Emit() on it.
9873         (Property, Indexer, Event): Create a new MethodData objects for each
9874         accessor and call Define() and Emit() on them.
9875
9876 2002-07-25  Martin Baulig  <martin@gnome.org>
9877
9878         Made MethodCore derive from MemberBase to reuse the code from there.
9879         MemberBase now also checks for attributes.
9880
9881         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9882         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9883         as virtual.
9884         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9885         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9886         (MemberBase.ApplyAttributes): New virtual method; applies the
9887         attributes to a method or accessor.
9888         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9889         (MemberBase.ApplyConditionalAttribute): Likewise.
9890         (MemberBase.ApplyDllImportAttribute): Likewise.
9891         (MemberBase.CheckAbstractAndExternal): Likewise.
9892         (MethodCore.ParameterTypes): This is now a property instead of a
9893         method, it's initialized from DoDefineParameters().
9894         (MethodCore.ParameterInfo): Removed the set accessor.
9895         (MethodCore.DoDefineParameters): New protected virtual method to
9896         initialize ParameterTypes and ParameterInfo.
9897         (Method.GetReturnType): We can now simply return the MemberType.
9898         (Method.GetMethodFlags): Override the MemberBase version and add
9899         the conditional flags.
9900         (Method.CheckBase): Moved some code from Define() here, call
9901         DoDefineParameters() here.
9902         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9903         here to avoid some larger code duplication.
9904         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9905         ensure that abstract and external accessors don't declare a body.
9906
9907         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9908         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9909         lookup in the attribute's parent classes, so we need to abort as soon
9910         as we found the first match.
9911         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9912         the attribute has no arguments.
9913
9914         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9915         of a Method.
9916
9917 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9918
9919         * cs-parser.jay: reverted previous patch.
9920
9921 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9922
9923         * cs-parser.jay: fixed bug #22119.
9924
9925 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9926
9927         * attribute.cs: fixed compilation. The error was:
9928         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9929         be assigned to before control leaves the current method."
9930         [FIXME:  Filed as bug #28186: MCS must report this error.]
9931
9932 2002-07-25  Martin Baulig  <martin@gnome.org>
9933
9934         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9935         method to pull the condition name ouf of a Conditional attribute.
9936         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9937         the obsolete message and error flag out of an Obsolete attribute.
9938
9939         * class.cs (Method.GetMethodFlags): New public method to get the
9940         TypeManager.MethodFlags for this method.
9941         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9942         private methods.
9943         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9944         if we're overriding a virtual function, set the new private variable
9945         `parent_method'; call the new TypeManager.AddMethod().
9946
9947         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9948         the MethodBuilder and the Method in a PtrHashtable.
9949         (TypeManager.builder_to_method): Added for this purpose.
9950         (TypeManager.MethodFlags): Added IsObsoleteError.
9951         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9952         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9953         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9954         the message from the attribute.
9955
9956 2002-07-24  Martin Baulig  <martin@gnome.org>
9957
9958         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9959         preprocessor directives, ensure that the argument to #define/#undef is
9960         exactly one identifier and that it's actually an identifier.
9961
9962         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9963         did not work ....
9964
9965 2002-07-24  Martin Baulig  <martin@gnome.org>
9966
9967         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9968         initialize it to TypeManager.object_type in the constructor.
9969         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9970         of the `hm.get_current' method if we're using the collection pattern.
9971         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9972         for the explicit conversion to make it work when we're using the collection
9973         pattern and the `Current' property has a different return type than `object'.
9974         Fixes #27713.
9975
9976 2002-07-24  Martin Baulig  <martin@gnome.org>
9977
9978         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9979         does not match, but don't report any errors.  This method is called in
9980         order for all methods in a MethodGroupExpr until a matching method is
9981         found, so we don't want to bail out if the first method doesn't match.
9982         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9983         matches, report the 123.  Fixes #28070.
9984
9985 2002-07-24  Martin Baulig  <martin@gnome.org>
9986
9987         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9988         TypeManager.TypeToCoreType() to the top of the method so the
9989         following equality checks will work.  Fixes #28107.
9990
9991 2002-07-24  Martin Baulig  <martin@gnome.org>
9992
9993         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9994         operand is of type uint, and the other operand is of type sbyte,
9995         short or int, the operands are converted to type long." -
9996         Actually do what this comment already told us.  Fixes bug #28106,
9997         added test-150.cs.
9998
9999 2002-07-24  Martin Baulig  <martin@gnome.org>
10000
10001         * class.cs (MethodBase): New abstract class.  This is now a base
10002         class for Property, Indexer and Event to avoid some code duplication
10003         in their Define() and DefineMethods() methods.
10004         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10005         generic methods for Define() and DefineMethods().
10006         (FieldBase): Derive from MemberBase, not MemberCore.
10007         (Property): Derive from MemberBase, not MemberCore.
10008         (Property.DefineMethod): Moved all the code from this method to the
10009         new MethodBase.DefineAccessor(), just call it with appropriate
10010         argumetnts.
10011         (Property.Define): Call the new Property.DoDefine(), this does some
10012         sanity checks and we don't need to duplicate the code everywhere.
10013         (Event): Derive from MemberBase, not MemberCore.
10014         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10015         accessors, this will also make them work with interface events.
10016         (Indexer): Derive from MemberBase, not MemberCore.
10017         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10018         (Indexer.Define): Use the new MethodBase functions.
10019
10020         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10021         argument to the constructor.
10022         (Interface.FindMembers): Added support for interface events.
10023         (Interface.PopluateEvent): Implemented.
10024
10025         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10026
10027 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10028
10029         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10030         but this is required to check for a method name being the same as
10031         the containing class.  
10032
10033         Handle this now.
10034
10035 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10036
10037         * interface.cs: initialize variable.
10038
10039 2002-07-23  Martin Baulig  <martin@gnome.org>
10040
10041         Implemented the IndexerName attribute in interfaces.
10042
10043         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10044         name if this is an explicit interface implementation.
10045         (Indexer.InterfaceIndexerName): New public variable.  If we're
10046         implementing an interface indexer, this is the IndexerName in that
10047         interface.  Otherwise, it's the IndexerName.
10048         (Indexer.DefineMethod): If we're implementing interface indexer,
10049         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10050         and Pending.ImplementIndexer methods.
10051         (Indexer.Define): Also define the PropertyBuilder if we're
10052         implementing an interface indexer and this is neither an explicit
10053         interface implementation nor do the IndexerName match the one in
10054         the interface.
10055
10056         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10057         If a method is defined here, then we always need to create a proxy
10058         for it.  This is used when implementing interface indexers.
10059         (Pending.IsInterfaceIndexer): New public method.
10060         (Pending.ImplementIndexer): New public method.
10061         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10062         This is used when implementing interface indexers to define a proxy
10063         if necessary.
10064         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10065         define a proxy if necessary.
10066
10067         * interface.cs (Interface.IndexerName): New public variable.
10068         (Interface.PopulateIndexer): Set the IndexerName.
10069         (Interface.DefineIndexers): New private method.  Populate all the
10070         indexers and make sure their IndexerNames match.
10071
10072         * typemanager.cs (IndexerPropertyName): Added support for interface
10073         indexers.
10074
10075 2002-07-22  Martin Baulig  <martin@gnome.org>
10076
10077         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10078         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10079         ret if HasReturnLabel.
10080         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10081         variables.
10082
10083         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10084         and set the ec.LoopBeginTryCatchLevel.
10085         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10086         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10087         the current ec.TryCatchLevel, the branch goes out of an exception
10088         block.  In this case, we need to use Leave and not Br.
10089
10090 2002-07-22  Martin Baulig  <martin@gnome.org>
10091
10092         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10093         block unless the block does not always return or it is contained in
10094         another try { ... } catch { ... } block.  Fixes bug #26506.
10095         Added verify-1.cs to the test suite.
10096
10097 2002-07-22  Martin Baulig  <martin@gnome.org>
10098
10099         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10100         then we do not always return.  Fixes bug #24985.
10101
10102 2002-07-22  Martin Baulig  <martin@gnome.org>
10103
10104         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10105         lookup on a per-class level; ie. walk up the class hierarchy until we
10106         found at least one applicable method, then choose the best among them.
10107         Fixes bug #24463 and test-29.cs.
10108
10109 2002-07-22  Martin Baulig  <martin@gnome.org>
10110
10111         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10112         return types of the methods.  The return type is not part of the
10113         signature and we must not check it to make the `new' modifier work.
10114         Fixes bug #27999, also added test-147.cs.
10115         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10116
10117         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10118         on the method's return type.
10119
10120 2002-07-21  Martin Baulig  <martin@gnome.org>
10121
10122         * assign.cs: Make this work if the rightmost source is a constant and
10123         we need to do an implicit type conversion.  Also adding a few more tests
10124         to test-38.cs which should have caught this.
10125
10126         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10127         target in the makefile for this.  The makefile.gnu is primarily intended
10128         for end-users who don't want to debug the compiler.
10129
10130 2002-07-21  Martin Baulig  <martin@gnome.org>
10131
10132         * assign.cs: Improved the Assign class so it can now handle embedded
10133         assignments (X = Y = Z = something).  As a side-effect this'll now also
10134         consume less local variables.  test-38.cs now passes with MCS, added
10135         a few new test cases to that test.
10136
10137 2002-07-20  Martin Baulig  <martin@gnome.org>
10138
10139         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10140         instructions.  Fixes bug #27977, also added test-146.cs.
10141
10142 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10143
10144         * cs-tokenizer.cs: fixed getHex ().
10145
10146 2002-07-19  Martin Baulig  <martin@gnome.org>
10147
10148         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10149         not Type.GetType() to lookup the array type.  This is needed when
10150         we're constructing an array of a user-defined type.
10151         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10152         single-dimensional arrays, but also for single-dimensial arrays of
10153         type decimal.
10154
10155 2002-07-19  Martin Baulig  <martin@gnome.org>
10156
10157         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10158         this function is called, it's not allowed to share LocalBuilders
10159         among ILGenerators.
10160
10161 2002-07-19  Martin Baulig  <martin@gnome.org>
10162
10163         * expression.cs (Argument.Resolve): Report an error 118 when trying
10164         to pass a type as argument.
10165
10166 2002-07-18  Martin Baulig  <martin@gnome.org>
10167
10168         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10169         Conv_R_Un for the signed `long' type.
10170
10171 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10172
10173         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10174         `expr' for the temporary result, as that will fail if we do
10175         multiple resolves on the same expression.
10176
10177 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10178
10179         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10180         ec.TypeContainer for looking up aliases. 
10181
10182         * class.cs (TypeContainer): Remove LookupAlias from here.
10183
10184         * decl.cs (DeclSpace); Move here.
10185
10186 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10187
10188         * class.cs (FindMembers): Only call filter if the constructor
10189         bulider is not null.
10190
10191         Also handle delegates in `NestedTypes' now.  Now we will perform
10192         type lookups using the standard resolution process.  This also
10193         fixes a bug.
10194
10195         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10196         This uses Expressions (the limited kind that can be parsed by the
10197         tree) instead of strings.
10198
10199         * expression.cs (ComposedCast.ToString): Implement, used to flag
10200         errors since now we have to render expressions.
10201
10202         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10203         FormArrayType. 
10204
10205         * ecore.cs (SimpleName.ToString): ditto.
10206
10207         * cs-parser.jay: Instead of using strings to assemble types, use
10208         Expressions to assemble the type (using SimpleName, ComposedCast,
10209         MemberAccess).  This should fix the type lookups in declarations,
10210         because we were using a different code path for this.
10211
10212         * statement.cs (Block.Resolve): Continue processing statements
10213         even when there is an error.
10214
10215 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10216
10217         * class.cs (Event.Define): Also remove the `remove' method from
10218         the list of pending items.
10219
10220         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10221         generate more compact code. 
10222
10223 2002-07-17  Martin Baulig  <martin@gnome.org>
10224
10225         * const.cs (Const.LookupConstantValue): Add support for constant
10226         `unchecked' and `checked' expressions.
10227         Also adding test case test-140.cs for this.
10228
10229 2002-07-17  Martin Baulig  <martin@gnome.org>
10230
10231         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10232         check whether mi.ReturnType implements the IEnumerator interface; the
10233         `==' and the IsAssignableFrom() will fail in this situation.
10234
10235 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10236
10237         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10238         here too.
10239
10240 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10241
10242         * expression.cs: fixed bug #27811.
10243
10244 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10245
10246         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10247         Molaro: when we are a ref, the value already contains a pointer
10248         value, do not take the address of it.
10249
10250 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10251         * removed mb-parser.jay and mb-tokenizer.cs
10252
10253 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10254
10255         * expression.cs: check against the building corlib void type.
10256
10257 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10258
10259         * ecore.cs: fix for valuetype static readonly fields: when 
10260         initializing them, we need their address, not the address of a copy.
10261
10262 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10263
10264         * typemanager.cs: register also enum_type in corlib.
10265
10266 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10267
10268         * class.cs: allow calling this (but not base) initializers in structs.
10269
10270 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10271
10272         * ecore.cs: make sure we compare against the building base types
10273         in GetTypeSize ().
10274
10275 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10276
10277         * typemanager.cs: fix TypeToCoreType() to handle void and object
10278         (corlib gets no more typerefs after this change).
10279
10280 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10281
10282         * expression.cs (ArrayCreation.EmitArrayArguments): use
10283         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10284
10285         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10286         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10287         array indexes, the runtime actually forbids them.
10288
10289         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10290         for array arguments here.
10291
10292         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10293         instead of the default for ValueTypes.
10294
10295         (New.DoEmit): Use IsValueType instead of
10296         IsSubclassOf (value_type)
10297         (New.DoResolve): ditto.
10298         (Invocation.EmitCall): ditto.
10299
10300         * assign.cs (Assign): ditto.
10301
10302         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10303         Statements *are* currently doing part of their resolution during
10304         Emit.  
10305
10306         Expressions do always resolve during resolve, but statements are
10307         only required to propagate resolution to their children.
10308
10309 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10310
10311         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10312
10313         (LoadAssembly): Do not add the dll if it is already specified
10314
10315         (MainDriver): Add the System directory to the link path at the end,
10316         after all the other -L arguments. 
10317
10318         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10319         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10320         ldelem.u1) and using the opposite for sbytes.
10321
10322         This fixes Digger, and we can finally run it.
10323
10324         * driver.cs (UnixParseOption): Move the option parsing here.  
10325         (CSCParseOption): Implement CSC-like parsing of options.
10326
10327         We now support both modes of operation, the old Unix way, and the
10328         new CSC-like way.  This should help those who wanted to make cross
10329         platform makefiles.
10330
10331         The only thing broken is that /r:, /reference: and /lib: are not
10332         implemented, because I want to make those have the same semantics
10333         as the CSC compiler has, and kill once and for all the confussion
10334         around this.   Will be doing this tomorrow.
10335
10336         * statement.cs (Unsafe.Resolve): The state is checked during
10337         resolve, not emit, so we have to set the flags for IsUnsfe here.
10338
10339 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10340
10341         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10342         not catch the Error_ObjectRefRequired in SimpleName (as it is
10343         possible to have a class/instance variable name that later gets
10344         deambiguated), we have to check this here.      
10345
10346 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10347
10348         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10349         make static and put into Expression.
10350
10351         (Event.Define): Register the private field of the event with the 
10352         TypeManager so that GetFieldFromEvent can get at it.
10353
10354         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10355         keep track of the private field associated with an event which
10356         has no accessors.
10357
10358         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10359         private field.
10360
10361         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10362
10363 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10364
10365         * expression.cs (Binary.EmitBranchable): this routine emits the
10366         Binary expression in a branchable context.  This basically means:
10367         we need to branch somewhere, not just get the value on the stack.
10368
10369         This works together with Statement.EmitBoolExpression.
10370
10371         * statement.cs (Statement.EmitBoolExpression): Use
10372         EmitBranchable. 
10373
10374 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10375
10376         * statement.cs (For): Reduce the number of jumps in loops.
10377
10378         (For): Implement loop inversion for the For statement.
10379
10380         (Break): We can be breaking out of a Try/Catch controlled section
10381         (foreach might have an implicit try/catch clause), so we need to
10382         use Leave instead of Br.
10383
10384         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10385         now).  If the instace expression supports IMemoryLocation, we use
10386         the AddressOf method from the IMemoryLocation to extract the
10387         address instead of emitting the instance.
10388
10389         This showed up with `This', as we were emitting the instance
10390         always (Emit) instead of the Address of This.  Particularly
10391         interesting when This is a value type, as we dont want the Emit
10392         effect (which was to load the object).
10393
10394 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10395
10396         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10397
10398         * statement.cs (Checked): Set the CheckedState during the resolve
10399         process too, as the ConvCast operations track the checked state on
10400         the resolve process, and not emit.
10401
10402         * cs-parser.jay (namespace_member_declaration): Flag that we have
10403         found a declaration when we do.  This is used to flag error 1529
10404
10405         * driver.cs: Report ok when we display the help only.
10406
10407 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10408
10409         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10410
10411 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10412
10413         * cs-tokenizer.cs (define): We also have to track locally the
10414         defines.  AllDefines is just used for the Conditional Attribute,
10415         but we also need the local defines for the current source code. 
10416
10417 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10418
10419         * statement.cs (While, For, Do): These loops can exit through a
10420         Break statement, use this information to tell whether the
10421         statement is the last piece of code.
10422
10423         (Break): Flag that we break.
10424
10425         * codegen.cs (EmitContexts): New `Breaks' state variable.
10426
10427 2002-07-03  Martin Baulig  <martin@gnome.org>
10428
10429         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10430         modifiers in method declarations in structs.  Otherwise, you won't
10431         be able to override things like Object.Equals().
10432
10433 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10434
10435         * class.cs (Method, Property, Indexer): Do not allow the public
10436         modifier to be used in explicit interface implementations.
10437
10438         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10439         override modifiers in method declarations in structs
10440
10441 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10442
10443         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10444         integer or real overflow, report an error
10445
10446 2002-07-02  Martin Baulig  <martin@gnome.org>
10447
10448         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10449         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10450         to tell the runtime about our newly created System.Object and
10451         System.ValueType types.
10452
10453 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10454
10455         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10456         struct instead of Ldarg/Starg.
10457
10458 2002-07-02  Martin Baulig  <martin@gnome.org>
10459
10460         * expression.cs (Indirection.Indirection): Call
10461         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10462
10463 2002-07-02  Martin Baulig  <martin@gnome.org>
10464
10465         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10466         ValueType, call TypeManager.TypeToCoreType() on it.
10467         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10468         the OpCodes.Newarr argument.
10469
10470 2002-07-02  Martin Baulig  <martin@gnome.org>
10471
10472         * expression.cs (Invocation.EmitCall): When compiling corlib,
10473         replace all calls to the system's System.Array type to calls to
10474         the newly created one.
10475
10476         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10477         System.Array methods.
10478         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10479         from the system's System.Array type which must be replaced.
10480
10481 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10482
10483         * typemanager.cs: load unverifiable_code_ctor so we can build
10484         corlib using the correct type. Avoid using GetTypeCode() with
10485         TypeBuilders.
10486         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10487         TypeManager.object_type to allow building corlib.
10488
10489 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10490
10491         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10492
10493 2002-07-01  Martin Baulig  <martin@gnome.org>
10494
10495         * class.cs: Make the last change actually work, we need to check
10496         whether `ifaces != null' to avoid a crash.
10497
10498 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10499
10500         * class.cs: when we build structs without fields that implement
10501         interfaces, we need to add the interfaces separately, since there is
10502         no API to both set the size and add the interfaces at type creation
10503         time.
10504
10505 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10506
10507         * expression.cs: the dimension arguments to the array constructors
10508         need to be converted if they are a long.
10509
10510 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10511
10512         * class.cs: don't emit ldarg.0 if there is no parent constructor
10513         (fixes showstopper for corlib).
10514
10515 2002-06-29  Martin Baulig  <martin@gnome.org>
10516
10517         MCS now compiles corlib on GNU/Linux :-)
10518
10519         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10520         ie. check for MethodImplOptions.InternalCall.
10521
10522         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10523         and TypeManager.attribute_type are null, so we must explicitly check
10524         whether parent is not null to find out whether it's an attribute type.
10525         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10526         and SetBuilder, not only if the property is neither abstract nor external.
10527         This is necessary to set the MethodImplOptions on the accessor methods.
10528         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10529         SetBuilder, see Property.Emit().
10530
10531         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10532         populate "System.Object", "System.ValueType" and "System.Attribute" since
10533         they've already been populated from BootCorlib_PopulateCoreTypes().
10534
10535 2002-06-29  Martin Baulig  <martin@gnome.org>
10536
10537         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10538         is the NullLiteral, we also need to make sure that target_type is not
10539         an enum type.   
10540
10541 2002-06-29  Martin Baulig  <martin@gnome.org>
10542
10543         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10544         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10545         before calling BootstrapCorlib_ResolveDelegate ().
10546
10547 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10548
10549         * statement.cs: fixed build-breaker. All tests passed ok.
10550
10551 2002-06-27  Martin Baulig  <martin@gnome.org>
10552
10553         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10554         for System.Decimal when compiling corlib.
10555
10556 2002-06-27  Martin Baulig  <martin@gnome.org>
10557
10558         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10559         switch blocks which contain nothing but a default clause.
10560
10561 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10562
10563        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10564
10565 2002-06-27  Martin Baulig  <martin@gnome.org>
10566
10567         * ecore.cs (PropertyExpr.PropertyExpr): Call
10568         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10569
10570         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10571         is already a TypeBuilder.
10572
10573 2002-06-27  Martin Baulig  <martin@gnome.org>
10574
10575         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10576         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10577         the "from an array-type to System.Array" case.  This makes it work
10578         when compiling corlib.
10579
10580 2002-06-27  Martin Baulig  <martin@gnome.org>
10581
10582         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10583         non-static PropertyExpr, set its InstanceExpression.  This makes
10584         the `ICollection.Count' property work in System/Array.cs.
10585
10586 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10587
10588         * driver.cs: Made error handling more consistent.  Errors now
10589         tracked by Report class, so many methods which used to return int
10590         now return void.  Main() now prints success/failure and 
10591         errors/warnings message.
10592
10593         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10594         the magic number return values (123 and 124).  Now, if the
10595         expected error occurs, the compiler exits with success (exit value
10596         0).  If the compilation completes without seeing that particular
10597         error, the compiler exits with failure (exit value 1).  The
10598         makefile in mcs/errors has been changed to handle the new behaviour.
10599
10600         * report.cs: Made 'expected error' number a property and renamed
10601         it from 'Probe' to 'ExpectedError'.
10602
10603         * genericparser.cs: Removed error handling support, since it is
10604         now all done by Report class.
10605
10606         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10607         class, so parse() no longer returns an int.
10608
10609         * namespace.cs: Use Report.Error instead of GenericParser.error
10610
10611 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10612
10613         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10614         TypeContainer.AddOperator): At the front of the list put the
10615         explicit implementations, so they get resolved/defined first. 
10616
10617 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10618
10619         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10620         interface type is implemented by this TypeContainer.  Used during
10621         explicit interface implementation.
10622
10623         (Property.Define, Indexer.Define, Method.Define): Validate that
10624         the given interface in the explicit implementation is one of the
10625         base classes for the containing type.
10626
10627         Also if we are explicitly implementing an interface, but there is
10628         no match in the pending implementation table, report an error.
10629
10630         (Property.Define): Only define the property if we are
10631         not explicitly implementing a property from an interface.  Use the
10632         correct name also for those properties (the same CSC uses,
10633         although that is really not needed).
10634
10635         (Property.Emit): Do not emit attributes for explicitly implemented
10636         properties, as there is no TypeBuilder.
10637
10638         (Indexer.Emit): ditto.
10639
10640         Hiding then means that we do not really *implement* a pending
10641         implementation, which makes code fail.
10642
10643 2002-06-22  Martin Baulig  <martin@gnome.org>
10644
10645         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10646         the return value of Object.GetType().  [FIXME: we need to do this whenever
10647         we get a type back from the reflection library].
10648
10649 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10650
10651         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10652
10653 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10654
10655         * attribute.cs: Return null if we can not look up the type.
10656
10657         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10658         the interface types found.
10659
10660         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10661         interface types found.
10662
10663         * typemanager.cs (GetInterfaces): Make this routine returns alll
10664         the interfaces and work around the lame differences between
10665         System.Type and System.Reflection.Emit.TypeBuilder in the results
10666         result for GetInterfaces.
10667
10668         (ExpandInterfaces): Given an array of interface types, expand and
10669         eliminate repeated ocurrences of an interface.  This expands in
10670         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10671         be IA, IB, IC.
10672
10673 2002-06-21  Martin Baulig  <martin@gnome.org>
10674
10675         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10676         on System.Enum.
10677
10678 2002-06-21  Martin Baulig  <martin@gnome.org>
10679
10680         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10681         and called with one of the core types, return the corresponding typebuilder for
10682         that type.
10683
10684         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10685         element type.
10686
10687 2002-06-21  Martin Baulig  <martin@gnome.org>
10688
10689         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10690         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10691         (Expression.ConvertReferenceExplicit): Likewise.
10692
10693         * expression.cs (ElementAccess.DoResolve): Likewise.
10694         (ElementAccess.DoResolveLValue): Likewise.
10695
10696 2002-06-10  Martin Baulig  <martin@gnome.org>
10697
10698         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10699         add the "value" parameter to the parameter list.
10700
10701         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10702         to our caller.
10703
10704 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10705
10706         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10707         the argument to an int, uint, long or ulong, per the spec.  Also
10708         catch negative constants in array creation.
10709
10710 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10711
10712         * class.cs: do not allow the same interface to appear twice in
10713         the definition list.
10714
10715 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10716
10717         * ecore.cs: don't use ldlen with System.Array.
10718
10719 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10720
10721         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10722
10723 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10724
10725         * modifiers.cs: produce correct field attributes for protected
10726         internal. Easy fix so miguel can work on ther harder stuff:-)
10727
10728 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10729
10730         * pending.cs: New file.  Move the code from class.cs here.
10731         Support clearning the pending flag for all methods (when not doing
10732         explicit interface implementation).
10733
10734 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10735
10736         * rootcontext.cs: added a couple more types needed to bootstrap.
10737
10738 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10739
10740         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10741         constructor in the type, instead of any constructor in the type
10742         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10743         a bug in the Mono runtime when applying the params attribute). 
10744
10745 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10746         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10747
10748 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10749
10750         * expression.cs (Unary.ResolveOperator): Use TypeManager
10751         to resolve the type.
10752
10753 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10754
10755         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10756         attached.
10757
10758         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10759         with each member too.
10760
10761         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10762         field builders too - this takes care of the enum member case.
10763
10764 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10765
10766         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10767         address-of operator on both value types and pointers.
10768
10769 2002-06-10  Martin Baulig  <martin@gnome.org>
10770
10771         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10772         PropertyBuilder to the `property_builders' list.
10773
10774         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10775         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10776         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10777         find any indexers which are inherited from an interface.
10778
10779 2002-06-09  Martin Baulig  <martin@gnome.org>
10780
10781         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10782         the same type as the constant if necessary.  There's also a test-130.cs
10783         for this.
10784
10785         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10786
10787         * typemanager.cs (TypeManager.ChangeType): Previously known as
10788         Enum.ChangeEnumType().
10789
10790 2002-06-09  Martin Baulig  <martin@gnome.org>
10791
10792         * expression.cs (Cast.TryReduce): Added support for consts.
10793
10794 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10795
10796         * class.cs (Accessor): Hold attributes information so we can pass
10797         it along.
10798
10799         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10800         Modify to pass in attributes attached to the methods.
10801
10802         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10803
10804         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10805         to handle the Accessor kind :-)
10806
10807         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10808
10809 2002-06-08  Martin Baulig  <martin@gnome.org>
10810
10811         * expression.cs (Unary.TryReduceNegative): Added support for
10812         ULongConstants.
10813
10814 2002-06-08  Martin Baulig  <martin@gnome.org>
10815
10816         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10817         name can't be found in the `defined_names' - the caller will do a
10818         MemberLookup in this case and thus find methods in System.Enum
10819         such as Enum.IsDefined().
10820
10821 2002-06-08  Martin Baulig  <martin@gnome.org>
10822
10823         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10824         Convert.ChangeType() which works with TypeBuilder created types.
10825         (Enum.LookupEnumValue, Enum.Define): Use it here.
10826
10827         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10828         `TypeBuilder.BaseType != null' check.
10829         (TypeContainer.FindMembers): Only lookup parent members if we
10830         actually have a parent.
10831         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10832         (ConstructorInitializer.Resolve): Likewise.
10833
10834         * interface.cs (Interface.FindMembers): Added
10835         `TypeBuilder.BaseType != null' check.
10836
10837         * rootcontext.cs (RootContext.ResolveCore): Added
10838         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10839         classes_second_stage.
10840
10841         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10842         debug_type and trace_type when compiling with --nostdlib.       
10843
10844 2002-06-07  Martin Baulig  <martin@gnome.org>
10845
10846         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10847         (AddField): Set it to true when adding a non-static field.
10848         (DefineType): Use `have_nonstatic_fields' to find out whether we
10849         have non-static fields, not `Fields != null'.
10850
10851 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10852
10853         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10854         dereferencing a null on the static-field code path)
10855
10856 2002-05-30  Martin Baulig  <martin@gnome.org>
10857
10858         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10859         to take command line arguments.  Use reflection to call the new
10860         custom `Initialize' function on the symbol writer and pass it the
10861         command line arguments.
10862
10863         * driver.cs (--debug-args): New command line argument to pass command
10864         line arguments to the symbol writer.
10865
10866 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10867
10868         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10869         the target type for indexers and properties.  Thanks to Joe for
10870         catching this.
10871
10872 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10873
10874         * typemanager.cs (MethodFlags): returns the method flags
10875         (Obsolete/ShouldIgnore) that control warning emission and whether
10876         the invocation should be made, or ignored. 
10877
10878         * expression.cs (Invocation.Emit): Remove previous hack, we should
10879         not do this on matching a base type, we should do this based on an attribute
10880
10881         Only emit calls to System.Diagnostics.Debug and
10882         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10883         on the command line.
10884
10885         * rootcontext.cs: Global settings for tracing and debugging.
10886
10887         * cs-tokenizer.cs (define): New utility function to track
10888         defines.   Set the global settings for TRACE and DEBUG if found.
10889
10890 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10891
10892         * interface.cs (Populate*): Pass in the TypeContainer as well as
10893         the DeclSpace as parameters so that we can create EmitContexts and
10894         then use that to apply attributes etc.
10895
10896         (PopulateMethod, PopulateEvent, PopulateProperty)
10897         (PopulateIndexer): Apply attributes everywhere.
10898
10899         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10900         etc.
10901
10902         (ApplyAttributes): Update accordingly.
10903
10904         We now apply interface attributes for all members too.
10905
10906 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10907
10908         * class.cs (Indexer.Define); Correctly check if we are explicit
10909         implementation (instead of checking the Name for a ".", we
10910         directly look up if the InterfaceType was specified).
10911
10912         Delay the creation of the PropertyBuilder.
10913
10914         Only create the PropertyBuilder if we are not an explicit
10915         interface implementation.   This means that explicit interface
10916         implementation members do not participate in regular function
10917         lookups, and hence fixes another major ambiguity problem in
10918         overload resolution (that was the visible effect).
10919
10920         (DefineMethod): Return whether we are doing an interface
10921         implementation. 
10922
10923         * typemanager.cs: Temporary hack until we get attributes in
10924         interfaces (Ravi is working on that) and we get IndexerName
10925         support in interfaces.
10926
10927         * interface.cs: Register the indexers as properties.
10928
10929         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10930         warning, I have verified that this is a bug in the .NET runtime
10931         (JavaScript suffers of the same problem).
10932
10933         * typemanager.cs (MemberLookup): When looking up members for
10934         interfaces, the parent of an interface is the implicit
10935         System.Object (so we succeed in searches of Object methods in an
10936         interface method invocation.  Example:  IEnumerable x;  x.ToString
10937         ()) 
10938
10939 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10940
10941         * class.cs (Event): Events should also register if they do
10942         implement the methods that an interface requires.
10943
10944         * typemanager.cs (MemberLookup); use the new GetInterfaces
10945         method. 
10946
10947         (GetInterfaces): The code used to lookup interfaces for a type is
10948         used in more than one place, factor it here. 
10949
10950         * driver.cs: Track the errors at the bottom of the file, we kept
10951         on going.
10952
10953         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10954         instance if the method we are calling is static!
10955
10956 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10957
10958         * attribute.cs (ApplyAttributes): Make this function filter out
10959         the IndexerName attribute (as that attribute in reality is never
10960         applied) and return the string constant for the IndexerName
10961         attribute. 
10962
10963         * class.cs (TypeContainer.Emit): Validate that all the indexers
10964         have the same IndexerName attribute, and if so, set the
10965         DefaultName attribute on the class. 
10966
10967         * typemanager.cs: The return value might contain other stuff (not
10968         only methods).  For instance, consider a method with an "Item"
10969         property and an Item method.
10970
10971         * class.cs: If there is a problem with the parameter types,
10972         return. 
10973
10974 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10975
10976         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10977         looks at user defined conversion after making a call to 
10978         StandardConversionExists - we need this for overload resolution.
10979
10980         * expression.cs : Update accordingly the various method calls.
10981
10982         This fixes 2 bugs filed against implicit user defined conversions 
10983
10984 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10985
10986         * statement.cs: Track the result of the assignment.
10987
10988 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10989
10990         * expression.cs (MemberAccess): Improved error reporting for
10991         inaccessible members.
10992
10993 2002-05-22  Martin Baulig  <martin@gnome.org>
10994
10995         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10996         itself with debugging support.
10997
10998 2002-05-22  Martin Baulig  <martin@gnome.org>
10999
11000         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11001         Removed, this isn't needed anymore.
11002
11003 2002-05-20  Martin Baulig  <martin@gnome.org>
11004
11005         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11006         be underlying type for an enum.
11007
11008 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11009
11010         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11011         that splits out the loading of just the core types.
11012
11013         * rootcontext.cs (ResolveCore): Split the struct resolution in
11014         two, so we can load the enumeration underlying types before any
11015         enums are used.
11016
11017         * expression.cs (Is): Bandaid until we fix properly Switch (see
11018         bug #24985 for details).
11019
11020         * typemanager.cs (ImplementsInterface): The hashtable will contain
11021         a null if there are no interfaces implemented.
11022
11023 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11024
11025         * cs-parser.jay (indexer_declarator): It is fine to have array
11026         parameters
11027
11028 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11029
11030         * typemanager.cs: (RegisterBuilder): New function used to register
11031         TypeBuilders that implement interfaces.  Since
11032         TypeBuilder.GetInterfaces (as usual) does not work with lame
11033         Reflection.Emit. 
11034         (AddUserType): register interfaces.
11035
11036         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11037         dealing with TypeBuilder.  Also, arrays are showing up as
11038         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11039         methods can not be invoked on them!
11040
11041         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11042         (ImplicitReferenceConversionExists): Split out from
11043         StandardConversionExists. 
11044
11045         * expression.cs (As): We were only implementing one of the three
11046         cases for the as operator.  We now implement them all.
11047         (Is): Implement the various other cases for Is as well.
11048
11049         * typemanager.cs (CACHE): New define used to control if we want or
11050         not the FindMembers cache.  Seems to have a negative impact on
11051         performance currently
11052
11053         (MemberLookup): Nested types have full acess to
11054         enclosing type members
11055
11056         Remove code that coped with instance/static returns for events, we
11057         now catch this in RealFindMembers.
11058
11059         (RealFindMembers): only perform static lookup if the instance
11060         lookup did not return a type or an event.  
11061
11062 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11063
11064         * assign.cs (CompoundAssign): We pass more semantic information
11065         now to Compound Assignments than we did before: now we have all
11066         the information at hand, and now we resolve the target *before* we
11067         do the expression expansion, which allows the "CacheValue" method
11068         to have the effect we intended (before, a [x] += 1 would generate
11069         two differen ArrayAccess expressions from the ElementAccess,
11070         during the resolution process).
11071
11072         (CompoundAssign.DoResolve): Resolve target and original_source here.
11073
11074 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11075
11076         * expression.cs (ArrayAccess): dropped debugging information. 
11077
11078         * typemanager.cs: Small bug fix: I was always returning i_members,
11079         instead of one of i_members or s_members (depending on which had
11080         the content).
11081
11082         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11083         method is invoked before any code generation takes place, and it
11084         is a mechanism to inform that the expression will be invoked more
11085         than once, and that the method should use temporary values to
11086         avoid having side effects
11087
11088         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11089
11090         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11091         implementation.
11092
11093         * expression.cs (Indirection, ArrayAccess): Add support for
11094         CacheTemporaries in these two bad boys. 
11095
11096         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11097         ldobj or ldind_ref.  
11098         (StoreFromPtr): Handle stobj as well.
11099
11100         * expression.cs (UnaryMutator): Share more code.
11101
11102         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11103         down: I was not tracking the Filter function as well, which
11104         was affecting the results of the cache.
11105
11106 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11107
11108         * attribute.cs: Remove the hack to handle the CharSet property on
11109         StructLayouts. 
11110
11111 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11112
11113         * attribute.cs (DoResolve): More uglyness, we now only try to
11114         resolve the attribute partially, to extract the CharSet
11115         information (only if we are a StructLayout attribute).  Otherwise 
11116
11117         (GetExtraTypeInfo): Add some code to conditionally kill in the
11118         future this.   I am more and more convinced that the .NET
11119         framework has special code to handle the attribute setting on
11120         certain elements.
11121
11122         * expression.cs (IsParamsMethodApplicable): Revert my previous
11123         foreach change here, it was wrong.
11124
11125 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11126
11127         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11128         (pp_expr): do not abort on unknown input, just return.
11129         (eval): abort if there are pending chars.
11130
11131         * attribute.cs (Attribute.Resolve): Positional parameters are
11132         optional.  Deal with that case.
11133
11134         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11135         the Ansi/Unicode/Auto information for the type.
11136
11137         (TypeContainer.DefineType): instantiate the EmitContext here, as
11138         we will be using it during the type definition (to resolve
11139         attributes) and during the emit phase.
11140
11141         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11142         to pull type information out of the attributes
11143
11144         (Attribute.Resolve): track the constructor builder, and allow for
11145         multiple invocations (structs and classes will use this).
11146
11147         * ecore.cs (MemberLookupFinal): new version with all the
11148         parameters customizable.
11149
11150         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11151         constructors.  Return if the result value is null (as the error
11152         would have been flagged already by MemberLookupFinal)
11153
11154         Do not allow instances of abstract classes or interfaces to be
11155         created.
11156
11157         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11158         We have to compare the assembly property here when dealing with
11159         FamANDAssem and Assembly access modifiers, because we might be
11160         creating an assembly from *modules* (that means that we are not
11161         getting TypeBuilders for types defined in other modules that are
11162         part of this assembly).
11163
11164         (Method.Emit): If the method is marked abstract and has a body,
11165         emit an error. 
11166
11167         (TypeContainer.DefineMembers): If both the defined member and the
11168         parent name match are methods, then do not emit any warnings: let
11169         the Method.Define routine take care of flagging warnings.  But if
11170         there is a mismatch (method overrides something else, or method is
11171         overriwritten by something, then emit warning).
11172
11173         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11174         set to null, this means `do not check for the return type on the
11175         signature'. 
11176
11177         (Method.Define): set the return type for the method signature to
11178         null, so that we get methods with the same name and parameters and
11179         different return types.  This is used to flag warning 114 (you are
11180         hiding a method, and you probably want to use the new/override
11181         keywords instead).
11182
11183         * typemanager.cs (MemberLookup): Implemented proper access
11184         control, closing a long standing set of bug reports.  The problem
11185         was that the Framework only has two bits: Public and NonPublic,
11186         and NonPublic includes private and protected methods, but we need
11187         to enforce the FamANDAssem, FamOrAssem and Family. 
11188
11189 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11190
11191         * statement.cs (GotoCase): Return true: Ammounts to giving up
11192         knowledge on whether we return or not, and letting the other case
11193         be responsible for it.
11194
11195 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11196
11197         * driver.cs: Do not load directories for each file processed, only
11198         do it if there is a pattern.
11199
11200         * ecore.cs: Report readonly assigns here as well, as we might have
11201         been resolved only by MemberAccess.
11202
11203         (SimpleName.SimpleNameResolve): Also be useful for LValue
11204         resolution.   We need this to propagate assign to local readonly variables
11205
11206         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11207         do not want to reuse potential criteria memory.
11208
11209         * class.cs (MyEventBuilder): Set reflected_type;
11210
11211         * ecore.cs (Constantify): Added support for constifying bools.
11212
11213         (RootContext.LookupType): Added a cache for values looked up in
11214         the declaration space.
11215
11216         * typemanager.cs (FindMembers): Now is a front-end to
11217         RealFindMembers, and provides a two-level hashtable-based cache to
11218         the request.  
11219
11220         15% performance improvement: from 22.5 to 19.2 seconds.
11221
11222         * expression.cs (IsParamsMethodApplicable): use foreach.
11223         (Invocation.DoResolve): ditto.
11224         (New.DoResolve): ditto.
11225         (ArrayCreation.DoResolve): ditto.
11226
11227         * ecore.cs (FindMostEncompassingType): use foreach.
11228
11229         * delegate.cs (NewDelegate.DoResolve): Use foreach
11230
11231         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11232         (RemoveMethods): use foreach.
11233
11234         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11235         nested foreach statements instead of for, and also break out of
11236         the inner loop once a match is found.
11237
11238         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11239
11240 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11241
11242         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11243         we actually unwrap the expression to allow for extra information
11244         to be extracted. 
11245
11246         * expression.cs: Use Shr_Un on unsigned operations. 
11247
11248 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11249
11250         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11251         applicable operators was not being considered correctly. This closes
11252         the bug Miguel reported.
11253
11254 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11255
11256         * attribute.cs: check that the type derives from System.Attribute
11257         and report the correct error in that case (moved the duplicate code to
11258         its own method, too).
11259
11260 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11261
11262         * attribute.cs: lookup attribute type name as the spec says: first the
11263         bare attribute name and then name + "Attribute" (nant compiles with
11264         mcs after this fix).
11265
11266 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11267
11268         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11269         Because of the way we parse things, we should try to see if a
11270         UIntConstant can fit in an integer.
11271
11272 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11273
11274         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11275         when we are in an explicit context.
11276
11277         (ConvertReferenceExplicit): When converting from Iface type S to Class
11278         T make sure the rules are implemented as an OR.
11279
11280         * parameter.cs (ParameterType): Make it a property for now although the
11281         purpose really isn't anything immediate.
11282
11283         * expression.cs (Is*Applicable): Do better checking on the parameter type
11284         of a ref/out parameter. The ones from the system assemblies are already 
11285         marked with the correct type so we don't need to do any correction.
11286
11287         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11288         the object type is standard too so include that.
11289
11290 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11291
11292         * ecore.cs (StandardConversionExists): Augment with missing code:
11293         deal with IntConstant, LongConstants and Enumerations.
11294
11295         * assign.cs: Report the error, instead of failing silently
11296
11297         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11298         typecontainer that they are declared, because the
11299         typecontainer/namespace will have the list of using clauses that
11300         need to be applied.
11301
11302         Assembly Attributes were escaping the normal registration
11303         mechanism. 
11304
11305         (EmitCode): Apply attributes within an EmitContext that represents
11306         the container they were declared on.
11307
11308         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11309
11310 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11311
11312         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11313         Revamp completely - make much cleaner as we now operate only
11314         on a set of Types.
11315
11316         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11317         to implement the logic detailed in the spec more correctly.
11318
11319         (UserDefinedConversion): Update accordingly.
11320
11321 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11322
11323         * statement.cs: Return flow analysis information up.
11324
11325         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11326         and the default.
11327
11328         (token): Do not consume an extra character before calling
11329         decimal_digits.
11330
11331 2002-05-06  Piers Haken <piersh@friskit.com>
11332
11333         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11334
11335 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11336
11337         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11338         EmitContext during the instance constructor initializer
11339         resolution, to stop access to instance variables.
11340
11341         This is mandated by the spec, last paragraph of the `constructor
11342         initializers' section. 
11343
11344 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11345
11346         * cs-parser.jay, class.cs (Accessor): new class used to represent
11347         an accessor (get or set).  In the past we used `null' to represent
11348         a missing accessor.  But this is ambiguous because there was no
11349         way to tell in abstract indexers/properties if one of them was
11350         specified.
11351
11352         Now there is a way of addressing that.
11353
11354         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11355         instead of FindMembers.
11356
11357         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11358         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11359
11360         * attribute.cs: Treat indexers and properties as the same in terms
11361         of applying attributes
11362
11363         * ecore.cs (FindMostEncompassedType): Use statically initialized
11364         EmptyExpressions()s like we do elsewhere to avoid creating useless
11365         objects (and we take this out of the tight loop).
11366
11367         (GetConversionOperators): Move the code to extract the actual
11368         operators to a separate routine to clean things up.
11369
11370 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11371
11372         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11373         events are always registered FieldBuilders.
11374
11375         * class.cs (FieldBase): New class shared by Fields 
11376
11377         * delegate.cs: If we are a toplevel delegate, use our full name.
11378         If we are a nested delegate, then only use our tail name.
11379
11380 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11381
11382         * expression.cs (IsApplicable): Ensure that we add the "&" to
11383         ref/out types before comparing it with the type of the argument.
11384
11385         (IsParamsMethodApplicable): Ditto.
11386
11387         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11388         silly me ;-)
11389
11390         * delegate.cs : Handle the case when we have more than one applicable
11391         method. Flag an error only when we finish checking all.
11392
11393 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11394
11395         * expression.cs: Add support for boolean static initializers.
11396
11397 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11398
11399         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11400
11401         * parameter.cs (ComputeParameterTypes,
11402         ComputeAndDefineParameterTypes): Better error handling: now we
11403         clear the `types' cache if we fail during any of the type lookups.
11404         We also return the status code correctly to our caller
11405
11406         * delegate.cs: If we fail to define a delegate, abort the extra
11407         steps. 
11408
11409         * expression.cs (Binary.ResolveOperator): for
11410         operator==(object,object) and operator !=(object, object) we also
11411         have to verify that there is an implicit conversion from one to
11412         the other.
11413
11414         (ArrayAccess.DoResolve): Array Access can operate on
11415         non-variables. 
11416
11417 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11418
11419         * assign.cs (CompoundAssign): A new class used as a "flag" that
11420         the assignment actually is happening as part of a compound
11421         assignment operator.
11422
11423         During compound assignment, a few new rules exist to enable things
11424         like:
11425
11426         byte b |= 1 + 2
11427
11428         From the spec:
11429
11430         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11431         to the type of x) if y is implicitly convertible to the type of x,
11432         and the operator is a builtin operator and the return type of the
11433         operator is explicitly convertible to the type of x. 
11434
11435         * rootcontext.cs: Reset warning level to 2.  4 catches various
11436         "interesting" features in mcs, we must clean this up at some
11437         point, but currently am trying to kill other bugs ;-)
11438
11439         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11440         in container classes as well.  
11441
11442         * expression.cs (Binary.ResolveOperator): Handle string case
11443         before anything else (as operator overloading does emit an error
11444         before doing anything else).
11445
11446         This code could go away when we move to a table driven model, but
11447         i could not come up with a good plan last night.
11448
11449 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11450
11451         * typemanager.cs (CSharpName): reimplementation using regex.
11452         * class.cs: added null check for fields in Emit
11453         * rootcontext.cs: set warninglevel to 4
11454
11455 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11456
11457         * typemanager.cs (CSharpName): reimplemented with Lupus
11458         suggestion.
11459
11460 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11461
11462         * statement.cs (If): correclty implement Resolve, because we were
11463         not catching sem errors in there.  The same process is needed
11464         everywhere else. 
11465         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11466
11467
11468         (Statement.Warning_DeadCodeFound): Factorize code.
11469         (While): Report dead code here too.
11470
11471         (Statement): Added Resolve virtual method to allow
11472         for resolution split from the emit code.
11473
11474 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11475
11476         * statement.cs (EmitBoolExpression): No longer try to resolve the
11477         expression here.    
11478         (MakeBoolean): New utility function that resolve, implicitly
11479         converts to boolean and tags the expression. 
11480
11481
11482         (If, Do): Implement dead code elimination.
11483         (While): Implement loop inversion
11484
11485         (Do, While, For, If): Resolve the expression prior to calling our
11486         code generation.
11487
11488 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11489
11490         * class.cs:
11491           - added method Report28 (warning: program has more than one entry point)
11492           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11493           - modified method Method.Define, the part at the end of the method
11494
11495         * rootcontext.cs: added static public Location EntryPointLocation;
11496           
11497         * ../errors/cs0028.cs : Add test case for the above warning.              
11498
11499         * typemanager.cs:
11500           - modified method CSharpName to allow arrays of primitive type to
11501             be printed nicely (e.g. instead of System.Int32[][] it now prints
11502             int[][])
11503           - added method CSharpSignature: returns the signature of a method
11504             in string format to be used in reporting errors, warnings, etc.
11505
11506         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11507         with String.Empty.
11508
11509 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11510
11511         * delegate.cs (Define): Fix extremely silly bug where I was
11512         setting the type of the 'object' parameter of the BeginInvoke
11513         method to System.IAsyncResult instead of System.Object ;-)
11514
11515 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11516
11517         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11518         here. 
11519
11520         (Constructor.Emit): return if we fail to initialize the
11521         constructor.  Another door closed!  
11522
11523         * expression.cs (New.DoResolve): Improve error message (from -6 to
11524         1501).  Use DeclaredOnly lookup to find the exact constructor.
11525
11526         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11527         loop.  This is useful.
11528
11529         * cs-parser.jay: Adjust the default parameters so that destructors
11530         have the proper signature.
11531
11532 2002-04-26  Martin Baulig  <martin@gnome.org>
11533
11534         * driver.cs (LoadAssembly): If `assembly' contains any characters
11535         which are only valid in path names and not in assembly names
11536         (currently slash, backslash and point), use Assembly.LoadFrom ()
11537         instead of Assembly.Load () on the `assembly' (before iteration
11538         over the link_paths).
11539
11540 2002-04-26  Martin Baulig  <martin@gnome.org>
11541
11542         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11543
11544 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11545
11546         * class.cs (Property): use the new typemanager.MemberLookup
11547
11548         (TypeContainer.MemberLookup): Implement using the
11549         TypeManager.MemberLookup now. 
11550
11551         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11552         and return MemberInfos, so that these can be used without an
11553         EmitContext (what we had before).
11554
11555 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11556
11557         * expression.cs: Fix the case where the argument to params if the
11558         type of the params.  I omitted handling this before.   Fixed
11559
11560 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11561
11562         * driver.cs: Call BootCorlib_PopulateCoreType
11563
11564         * class.cs (Property.CheckBase): Check for properties only, not
11565         for all members. 
11566
11567         * interface.cs: Temporary hack: try/catch around the
11568         CustomAttributeBuilder, because I am getting an exception that I
11569         do not understand.
11570
11571         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11572         types whose definitions are required to be there (attributes are
11573         defined before standard types).
11574
11575         Compute definitions as we boot the various types, as they are used
11576         immediately (value_type class will need object_type, but if we do
11577         not initialize object_type, we will pass a null, which will let
11578         the runtime pick the System.Object from the existing corlib, which
11579         is not what we want).
11580
11581 2002-04-22  Patrik Torstensson <totte@labs2.com>
11582
11583         * cs-tokenizer.cs: fixed a number of trim() issues.
11584
11585 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11586
11587         * expression.cs (Argument.Type): Ensure that we return the correct
11588         type when we have out or ref parameters [in which case we 
11589         append a "&"].
11590
11591 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11592
11593         * class.cs (Property, Indexer): Allow extern modifier in there. 
11594
11595         * typemanager.cs (InitBaseTypes): Initializes object_type and
11596         value_type, since those will be used early on during the bootstrap
11597         process to compile corlib.
11598
11599         (InitCoreTypes): Move code from here to InitBaseTypes.
11600
11601 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11602
11603         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11604         single-dimension arrays as using the ldlen opcode.  
11605
11606         Daniel Lewis discovered this optimization.  
11607
11608         * typemanager.cs: Add signature for System.Array::get_Length
11609
11610 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11611
11612         * statement.cs: report the error when the foreach does not apply to an
11613         array nor a collection.
11614
11615 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11616
11617         * expression.cs: Add implicit conversions to the operator ~.
11618
11619         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11620
11621         * typemanager.cs: Locate the decimal constructor.
11622
11623 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11624
11625         * attribute.cs: use the new property of TypeOf.
11626         * expression.cs: added 'get' property around typearg.
11627
11628         These changes fix a build breaker reported by NickD. Is this the
11629         correct way to fix?  If not, please, revert my changes and make it
11630         work :-).
11631
11632 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11633
11634         * attribute.cs: Add support for typeof in attribute invocations.
11635         I am not sure that this is right though.
11636
11637 2002-04-14  Duncan Mak  <duncan@ximian.com>
11638
11639         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11640         Binary.Operator.Division case.
11641
11642 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11643
11644         * class.cs (DefineType): Ensure that we do a proper check on
11645         attribute types and also register it with the TypeManager.
11646
11647         (TypeContainer.Targets): The default for attribute types is
11648         AttributeTargets.All.
11649
11650         * attribute.cs (ApplyAttributes): Registering the attribute type
11651         is done elsewhere, not when we discover we have a Usage attribute.
11652
11653 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11654
11655         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11656         and get rid of is_delegate parameter.
11657
11658         * everywhere : update.
11659
11660 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11661
11662         * cs-parser.jay (compilation_unit): Revamp completely to use
11663         some new ideas that I got from Rhys' grammar to solve the problems
11664         with assembly level attributes.
11665
11666         (outer_declaration): New grammar production.
11667
11668         (attribute_sections): Add.
11669
11670         (opt_attributes): Base on attribute_sections
11671
11672         (namespace_declaration): Allow opt_attributes to tackle the case
11673         when we have assembly level attributes - we are clever in this
11674         regard now ;-)
11675
11676         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11677         attributes in the non-global context.
11678
11679         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11680         instead of SetGlobalAttributes.
11681
11682         * class.cs, rootcontext.cs : Ensure we define and generate 
11683         attribute types before anything else.
11684
11685         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11686         and flag the new error -20 for the case when the attribute type
11687         does not have valid targets specified. csc does not catch this.
11688
11689         * ../errors/errors.txt : update for error # -20
11690
11691 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11692
11693         * support.cs (InternalParameters.ParameterModifier): Do some null
11694         checking and return sane values.
11695
11696         * class.cs (Method.Define): If we are a PInvoke method, ensure
11697         that we are static and extern. Report error # 601
11698
11699         * ../errors/cs0601.cs : Add test case for the above error.
11700
11701 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11702
11703         * rootcontext.cs (attribute_types): We need to keep type of
11704         all attribute types separately and emit code for them first.
11705
11706         (RegisterAttribute) : Implement.
11707
11708         * class.cs (DefineType): Check if the current Type is a custom
11709         attribute type and register it accordingly.
11710
11711         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11712         adding the first attribute twice and rename to
11713
11714         (SetGlobalAttributes): this.
11715
11716         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11717         lookups.
11718
11719         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11720         if we are processing global arguments. Hmm, I am unsure of this.
11721
11722 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11723
11724         * expression.cs: added static array of strings to avoid calling
11725         Enum.ToString () for Operator in Binary. Significant recover of
11726         performance.
11727
11728 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11729
11730         * class.cs (FindMembers): Allow the Builders of the various
11731         members to be null.  If they are skip them.  This only happens
11732         during the PInvoke declaration.
11733
11734 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11735
11736         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11737         failure, so we do not keep going afterwards.
11738
11739         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11740         wanted to pass `false' as the `is_delegate' argument.  If this is
11741         the case, why not use delegate_type == null to mean `is_delegate =
11742         false' and anything else as is_delegate = true.
11743
11744 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11745
11746         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11747         code for the section, not the beginning of the tests.
11748
11749 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11750
11751         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11752
11753         * expression.cs (Binary): same.  Warn about errors where we have
11754         Enum/Enum in operator + as well.
11755
11756 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11757
11758         * statement.cs:
11759                 - added support for switch(bool)
11760                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11761                 - add TableSwitchEmit() to handle table-based switch statements
11762
11763 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11764
11765         * expression.cs (Invocation.OverloadResolve): Factor out code which
11766         does parameter compatibility checking with arguments so that we can 
11767         re-use the code even from Delegate.VerifyApplicability
11768
11769         (VerifyArgumentsCompat): Move above code here.
11770
11771         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11772         and instead make a call to the above method.
11773
11774 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11775
11776         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11777         We use it to keep track of classes which are attribute types.
11778
11779 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11780
11781         * delegate.cs (Delegate.Define): Correctly define the types in the
11782         presence of fixed and array parameters.
11783
11784         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11785         doing FindMembers.
11786
11787         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11788         include NonPublic after the first iteration.
11789
11790         * class.cs (Indexer.CheckBase): Only check if both parents are
11791         non-null. 
11792
11793         * cs-parser.jay (accessor_body): If empty, set to null.
11794
11795         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11796         same code path here to resolve constants names that we did have in
11797         MemberAccess.DoResolve.  There is too much code duplicated here.
11798
11799 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11800
11801         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11802
11803         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11804         to MakeUnionSet.
11805
11806         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11807         tokens, numbers and strings.
11808
11809         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11810         parenthesis.
11811
11812         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11813         asyncronous parameters and the regular parameters.  
11814
11815         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11816         specify the target directory.
11817
11818         * expression.cs: (This.DoResolve): Simplify
11819         (As.Emit): Optimize, do not generate IsInst if the expression is
11820         always of the given type.
11821
11822         (Is.DoResolve): Bug fix, we were reporting both always/never for
11823         the is expression.
11824
11825         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11826         creating too many unnecessary arrays.
11827
11828 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11829
11830         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11831         fields instead of rolling our own initializer.   Takes care of all
11832         implicit conversions, and drops unnecessary static checks/argument.
11833
11834 2002-03-31  Dick Porter  <dick@ximian.com>
11835
11836         * driver.cs: use the GetDirectories() return values properly, and
11837         use "/" as path separator.
11838
11839 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11840
11841         * expression.cs (Unary): Optimize - - expr into expr.
11842         (Binary): Optimize a + (-b) into a -b.
11843
11844         * codegen.cs (CodeGen): Made all methods static.
11845
11846 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11847
11848         * rootcontext.cs: 
11849
11850         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11851         TypeBuilder property.
11852
11853         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11854         instead. 
11855
11856         * tree.cs: Removed the various RecordXXXX, and replaced with a
11857         single RecordDecl.  Removed all the accessor methods, and just
11858         left a single access point Type 
11859
11860         * enum.cs: Rename DefineEnum to DefineType.
11861
11862         * decl.cs: New abstract method `DefineType' used to unify the
11863         Defines for Enumerations, Interfaces, TypeContainers and
11864         Delegates.
11865
11866         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11867         LookupBaseClasses method that used to live in class.cs and
11868         interface.cs here, and renamed to FindType.
11869
11870         * delegate.cs: Implement DefineType.  Take advantage of the
11871         refactored pattern for locating the parent builder without taking
11872         the parent_builder argument (which we know does not work if we are
11873         nested, and triggering a toplevel definition).
11874
11875 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11876
11877         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11878         accessibility of a member has changed during override and report
11879         an error if so.
11880
11881         * class.cs (Method.Define, Property.Define): Only complain on
11882         overrides if the method is private, any other accessibility is
11883         fine (and since we just checked the permission is the same, we are
11884         good to go).
11885
11886         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11887         and elif are processed always.  The other pre-processing
11888         directives are only processed if we are "taking" the path
11889
11890 2002-03-29  Martin Baulig  <martin@gnome.org>
11891
11892         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11893         current location is not Null.
11894
11895         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11896         a separate method so we can profile it.
11897
11898         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11899         `span.Seconds' are just seconds, but no minutes or hours.
11900         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11901
11902 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11903
11904         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11905         Remove the gratuitous set of Final:
11906
11907                                 // If an interface implementation, then we can set Final.
11908                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11909                                     implementing.DeclaringType.IsInterface)
11910                                         flags |= MethodAttributes.Final;
11911
11912         I do not know what I was smoking when I used that.
11913
11914
11915         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11916         step into fixing the name resolution issues for delegates and
11917         unifying the toplevel name resolution.
11918
11919 2002-03-28  Martin Baulig  <martin@gnome.org>
11920
11921         * class.cs (Method.Emit): If we have a symbol writer, call its
11922         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11923         tell it about the current method.
11924
11925         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11926         writer that we're going to emit the first byte of IL code for a new
11927         statement (a new source line).
11928         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11929         EmitContext.Mark() before emitting any code.
11930
11931         * location.cs (SymbolDocument): Return null when we're Null.
11932
11933         * statement.cs (Statement): Moved the `Location loc' variable here.
11934         (Statement.EmitBoolExpression): If we have a symbol writer, call
11935         ec.Mark() before emitting any code to tell it that we're at the
11936         beginning of a new statement.
11937         (StatementExpression): Added `Location' argument to the constructor.
11938         (Block): Added public readonly variable `StartLocation' and public
11939         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11940         (Block): Added constructor which takes a start and end location.
11941         (Block.SetEndLocation): New method. This sets the end location.
11942         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11943         local variables we create.
11944         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11945         each statement and do also mark the begin and end of the block.
11946
11947         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11948         tell it the current lexer.Location, use Location.Null for the end of the
11949         block.
11950         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11951         current block, set its end location using SetEndLocation().
11952         (statement_expression): StatementExpression constructor now takes the
11953         lexer.Location as additional argument.
11954         (for_statement, declare_local_variables): Likewise.
11955         (declare_local_variables): When creating a new implicit block, use the
11956         new Block constructor and pass it the lexer.Location.
11957
11958 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11959
11960         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11961         members also on the parent interfaces recursively.
11962
11963 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11964
11965         * report.cs: Use new formats, since Gonzalo finished the missing
11966         bits. 
11967
11968         * expression.cs (Binary.ResolveOperator): added missing operator|
11969         operator& and operator^ for bool/bool.
11970
11971         * cs-parser.jay: CheckDef now takes a Location argument that is
11972         used to report errors more precisly (instead of reporting the end
11973         of a definition, we try to track something which is a lot closer
11974         to the source of the problem).
11975
11976         * cs-tokenizer.cs: Track global token use, so we can properly flag
11977         the use of #define/#undef after the first token has been seen.
11978
11979         Also, rename the reportXXXX to Error_DescriptiveName
11980
11981         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11982         TypeContainer, so that Enum and Interface can use this too.
11983
11984         * class.cs (TypeContainer.LookupInterfaceOrClass,
11985         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11986         `builder' argument.  Typically this was used to pass the parent
11987         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11988         the definition).  
11989
11990         The problem is that a nested class could trigger the definition of
11991         a toplevel class, and the builder would be obviously wrong in that
11992         case. 
11993
11994         So we drop this argument, and we compute dynamically the
11995         TypeBuilder/ModuleBuilder (the correct information was available
11996         to us anyways from DeclSpace.Parent)
11997
11998         * interface.cs (Interface.DefineInterface): Drop builder
11999         parameter cleanup like class.cs
12000
12001         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12002         like class.cs
12003
12004         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12005         values. 
12006
12007         (Try.Emit): Propagate the returns value from the statement.
12008
12009         (Return.Emit): Even if we are leavning 
12010
12011         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12012
12013         * modifiers.cs: Fix the computation of MethodAttributes flags.
12014
12015 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12016
12017         * driver.cs: allow compilation of files that start with '/'.
12018         Add a default case when checking the argument of --target.
12019
12020 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12021
12022         * interface.cs: Implement the same search algorithm for types in
12023         the interface code.
12024
12025         * delegate.cs: Do not allow multiple definition.
12026
12027         * Recovered ChangeLog that got accidentally amputated
12028
12029         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12030
12031         * rootcontext.cs: Load manually enum to allow core classes to
12032         contain enumerations.
12033
12034         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12035         Update to new static methods in TypeManager.
12036
12037         * typemanager.cs (GetMethod, GetConstructor): Use our
12038         implementation of FindMembers to find the members, since during
12039         corlib compilation, the types are TypeBuilders and GetMethod and
12040         GetConstructor do not work.
12041
12042         Make all methods in TypeManager static.
12043
12044         (InitCodeHelpers): Split the functionality from
12045         the InitCodeTypes function.
12046
12047         * driver.cs: Call InitCodeHelpers after we have populated the
12048         types. 
12049
12050         * cs-parser.jay (delegate_declaration): we did not used to compute
12051         the delegate name correctly for void delegates.
12052
12053 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12054
12055         * rootcontext.cs (RootContext): Init the interface_resolve_order
12056         and type_container_resolve_order always.
12057
12058         (ResolveCore, BootstrapCorlib_ResolveClass,
12059         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12060         compiler when compiling with --nostdlib
12061
12062         * class.cs (TypeContainer.DefineType): Check that our parent is
12063         not null.  This test is most important when we are bootstraping
12064         the core types.
12065
12066         * codegen.cs: Split out the symbol writing code.
12067
12068 2002-03-25  Martin Baulig  <martin@gnome.org>
12069
12070         * driver.cs (-g): Made -g an alias for --debug.
12071
12072 2002-03-24  Martin Baulig  <martin@gnome.org>
12073
12074         * codegen.cs (SymbolWriter): New public variable. Returns the
12075         current symbol writer.
12076         (CodeGen): Added `bool want_debugging_support' argument to the
12077          constructor. If true, tell the ModuleBuild that we want debugging
12078         support and ask it for the ISymbolWriter.
12079         (Save): If we have a symbol writer, call it's Close() method after
12080         saving the assembly.
12081
12082         * driver.c (--debug): New command line argument to create a
12083         debugger information file.
12084
12085         * location.cs (SymbolDocument): New public property. Returns an
12086         ISymbolDocumentWriter object for the current source file or null
12087         if we don't have a symbol writer.
12088
12089 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12090
12091         * driver.cs (LoadAssembly): Correctly return when all the paths
12092         have been tried and not before.
12093
12094         * statement.cs (Switch.Emit): return the actual coverage for this
12095         statement (returns/not-returns)
12096
12097         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12098         switch of the statement if we are the last switch section.  That
12099         kills two problems: try/catch problems (we used to emit an empty
12100         nop at the end) and switch statements where all branches would
12101         return. 
12102
12103 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12104
12105         * driver.cs: Add default assemblies (the equivalent to the
12106         Microsoft CSC.RSP file)
12107
12108         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12109         also update tokens_seen and set it to false.
12110
12111         * driver.cs: Implement --recurse for Mike.
12112
12113         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12114         correctly splitting out the paths.
12115
12116 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12117
12118         * interface.cs (Interface.PopulateProperty): Instead of using
12119         `parent' as the declaration space for the set parameters, use
12120         `this' 
12121
12122         * support.cs (InternalParameters): InternalParameters constructor
12123         takes a DeclSpace instead of a TypeContainer.
12124
12125         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12126         types are being initialized, load the address of it before calling
12127         the function.  
12128
12129         (New): Provide a mechanism to disable the generation of local
12130         value type temporaries when the caller will be providing us with
12131         an address to store it.
12132
12133         (ArrayCreation.EmitDynamicInitializers): Use it.
12134
12135 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12136
12137         * expression.cs (Invocation.EmitArguments): Only probe for array
12138         property if there is more than one argument.  Sorry about that.
12139
12140         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12141         empty param arrays.
12142
12143         * class.cs (Method.LabelParameters): Fix incorrect code path that
12144         prevented the `ParamArrayAttribute' from being applied to the
12145         params attribute.
12146
12147 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12148
12149         * support.cs (ReflectionParameters): Correctly compute whether the
12150         last argument is a params array.  Fixes the problem with
12151         string.Split ('a')
12152
12153         * typemanager.cs: Make the assemblies array always be non-null
12154         (empty, but non-null)
12155
12156         * tree.cs (RecordDecl): New function that abstracts the recording
12157         of names.  This reports error 101, and provides a pointer to the
12158         previous declaration.  Fixes a crash in the compiler.
12159
12160         * cs-parser.jay (constructor_declaration): Update to new grammar,
12161         and provide a constructor_body that can be empty.
12162
12163 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12164
12165         * driver.cs: Add support for --resources.
12166
12167         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12168         Make all types for the various array helper methods be integer.
12169
12170         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12171         CheckState to ConvCast.
12172
12173         (ConvCast): Now it takes a `checked' state argument, to avoid
12174         depending on the emit context for the conversion, and just using
12175         the resolve time setting.
12176
12177         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12178         instead of Invocation.EmitArguments.  We do not emit the original
12179         arguments, instead we emit those which have been converted to
12180         unsigned int expressions.
12181
12182         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12183
12184         * codegen.cs: ditto.
12185
12186         * expression.cs (LocalVariableReference): Drop the use of the
12187         Store function that depended on the variable index.
12188
12189         * statement.cs (VariableInfo): Drop the `Idx' property from this
12190         class, as this is not taking into account the indexes for
12191         temporaries tat we generate during the execution, getting the
12192         indexes wrong.
12193
12194         * class.cs: First emit class initializers, then call the parent
12195         constructor. 
12196
12197         * expression.cs (Binary): Fix opcode emision.
12198         (UnaryMutator.EmitCode): Support checked code generation
12199
12200         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12201         matches for events for both the Static and Instance scans,
12202         pointing to the same element.   Fix that.
12203
12204 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12205
12206         * rootcontext.cs (ResolveTree): Always set the
12207         interface_resolve_order, because nested interfaces will be calling
12208         into us.
12209
12210         * class.cs (GetInterfaceOrClass): Track the same resolution
12211         process used by TypeManager.LookupType.  This fixes the nested
12212         type lookups in class declarations (separate path from
12213         LookupType). 
12214
12215         (TypeContainer.DefineType): Also define nested interfaces.
12216         (TypeContainer.RegisterOrder): New public function used to
12217         register the order in which child interfaces need to be closed.
12218
12219         Nested interfaces need to be closed after their parents have been
12220         created. 
12221
12222         * interface.cs (InterfaceAttr): Put all the logic for computing
12223         the interface attribute here. 
12224
12225         (DefineInterface): Register our interface order with the
12226         RootContext or with the TypeContainer depending on the case.
12227
12228 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12229
12230         * cs-parser.jay: rework foreach statement to work with the new
12231         changes to the policy on SimpleNames.
12232
12233         * report.cs: support Stacktrace on warnings as well.
12234
12235         * makefile: drop --unsafe and /unsafe from the compile.
12236
12237 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12238
12239         * ecore.cs (StandardConversionExists): Modify to take an Expression
12240         as the first parameter. Ensure we do null -> reference type conversion
12241         checking.
12242
12243         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12244         temporary Expression objects.
12245
12246 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12247
12248         * interface.cs: workaround bug in method overloading resolution
12249         (there is already a bugzilla bug for it).
12250
12251 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12252
12253         We could also solve this problem by having a separate path for
12254         performing type lookups, instead of DoResolve, we could have a
12255         ResolveType entry point, and only participating pieces of the
12256         production (simplename, deref, array) would implement this. 
12257
12258         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12259         signal SimpleName to only resolve type names and not attempt to
12260         resolve anything else.
12261
12262         * expression.cs (Cast): Set the flag.
12263
12264         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12265
12266         * class.cs: Only report 108 if there is no `new' modifier.
12267
12268         * cs-parser.jay: rework foreach statement to work with the new
12269         changes to the policy on SimpleNames.
12270
12271         * report.cs: support Stacktrace on warnings as well.
12272
12273         * makefile: drop --unsafe and /unsafe from the compile.
12274
12275 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12276
12277         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12278         lookups here, instead of doing that at parse time.  This means
12279         that our grammar will not introduce `LocalVariableReferences' as
12280         expressions at this point.  That solves the problem of code like
12281         this:
12282
12283         class X {
12284            static void Main ()
12285            { int X = 1;
12286             { X x = null }}}
12287
12288         This is only half the fix.  The full fix requires parameters to
12289         also be handled in this way.
12290
12291         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12292         makes the use more obvious of the DeclSpace.  The
12293         ec.TypeContainer.TypeBuilder is now only used to pull the
12294         TypeBuilder for it.
12295
12296         My theory is that I can get rid of the TypeBuilder completely from
12297         the EmitContext, and have typecasts where it is used (from
12298         DeclSpace to where it matters).  
12299
12300         The only pending problem is that the code that implements Aliases
12301         is on TypeContainer, and probably should go in DeclSpace.
12302
12303         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12304         lookups here, instead of doing that at parse time.  This means
12305         that our grammar will not introduce `LocalVariableReferences' as
12306         expressions at this point.  That solves the problem of code like
12307         this:
12308
12309         class X {
12310            static void Main ()
12311            { int X = 1;
12312             { X x = null }}}
12313
12314         This is only half the fix.  The full fix requires parameters to
12315         also be handled in this way.
12316
12317         * class.cs (Property.DefineMethod): When implementing an interface
12318         method, set newslot, when implementing an abstract method, do not
12319         set the flag (before we tried never setting it, or always setting
12320         it, which is the difference).
12321         (Indexer.DefineMethod): same.
12322         (Method.DefineMethod): same.
12323
12324         * ecore.cs: Only set the status used flag if we get back a Field.
12325
12326         * attribute.cs: Temporary hack, so Paolo can keep working.
12327
12328 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12329
12330         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12331         the unmanaged type in the case we have a MarshalAs attribute.
12332
12333         (Resolve): Handle the case when we are parsing the special MarshalAs
12334         attribute [we need to store the unmanaged type to use later]
12335
12336         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12337         MarshalAs Attribute.
12338
12339         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12340         on parameters and accordingly set the marshalling info.
12341
12342 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12343
12344         * class.cs: Optimizing slightly by removing redundant code after
12345         we switched to the `NoTypes' return value.
12346         (Property.DefineMethod): use NoTypes here too.
12347
12348         This fixes the bug I introduced in my last batch of changes.
12349
12350 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12351
12352         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12353
12354         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12355         Enums since those are types too. 
12356
12357         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12358
12359         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12360         thanks to a call during the lookup process.
12361
12362 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12363
12364         * statement.cs (Foreach): Lots of work to accomodate a particular
12365         kind of foreach statement that I had not kept in mind.  It is
12366         possible to have foreachs on classes that provide a GetEnumerator
12367         method that return objects that implement the "pattern" for using
12368         a foreach, there is no need to support GetEnumerator
12369         specifically. 
12370
12371         This is needed to compile nant.
12372
12373         * decl.cs: Only report 114 if the member is not `Finalize' and if
12374         the warning level is at least 2.
12375
12376         * class.cs: Moved the compare function from Method to
12377         MethodSignature. 
12378
12379         (MethodSignature.InheritableMemberSignatureCompare): Add new
12380         filter function that is used to extract inheritable methods from a
12381         class. 
12382
12383         (Method.Define): Use the new `inheritable_method_signature_filter'
12384         delegate
12385
12386         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12387         command. 
12388
12389 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12390
12391         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12392
12393         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12394
12395         * expression.cs: Pass location information to
12396         ConvertImplicitStandard. 
12397
12398         * class.cs: Added debugging code to track return values from
12399         interfaces. 
12400
12401 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12402
12403         * expression.cs (Is.DoResolve): If either side of the `is' is an
12404         interface, do not flag the warning.
12405
12406         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12407         for interfaces
12408
12409         * report.cs: Allow for --fatal to be used with --probe.
12410
12411         * typemanager.cs (NoTypes): Move the definition for the empty Type
12412         array here. 
12413
12414         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12415         properties. 
12416         (TypeContainer.DefineProxy): New function used to proxy to parent
12417         implementations when implementing interfaces.
12418         (TypeContainer.ParentImplements): used to lookup if our parent
12419         implements a public function that is required by an interface.
12420         (TypeContainer.VerifyPendingMethods): Hook this up.
12421
12422         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12423         `modules' and `assemblies' arraylists into arrays.  We only grow
12424         these are the very early start up of the program, so this improves
12425         the speedof LookupType (nicely measured).
12426
12427         * expression.cs (MakeByteBlob): Replaced unsafe code with
12428         BitConverter, as suggested by Paolo.
12429
12430         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12431         folding of string concatenation, but if either side is a string,
12432         and the other is not, then return null, and let the runtime use
12433         the concatenation on the string plus the object (using
12434         `Object.ToString'). 
12435
12436 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12437
12438         Constant Folding has been implemented now.
12439
12440         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12441         the error instead on types that are not supported in one's
12442         complement. 
12443
12444         * constant.cs (Constant and all children): New set of functions to
12445         perform implict and explicit conversions.
12446
12447         * ecore.cs (EnumConstant): Implement the new functions to perform
12448         conversion by proxying to the child expression.
12449
12450         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12451         own separate setting that can not be turned off from the command
12452         line using --unchecked or --checked and is only controlled using
12453         the checked/unchecked statements and expressions.  This setting is
12454         used by the constant folder to flag errors.
12455
12456         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12457         ConstantCheckState as well.   
12458
12459         During Resolve, they also have to flag the state, because the
12460         constant folder runs completely in the Resolve phase.
12461
12462         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12463         well.
12464
12465 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12466
12467         * cfold.cs: New file, this file contains the constant folder.
12468
12469         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12470         argument to track whether we are using the resulting address to
12471         load or store a value and provide better error messages. 
12472
12473         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12474         new AddressOf arguments.
12475
12476         * statement.cs (Foreach.EmitCollectionForeach): Update
12477
12478         * expression.cs (Argument.Emit): Call AddressOf with proper
12479         arguments to track usage.
12480
12481         (New.DoEmit): Call AddressOf with new arguments.
12482
12483         (Unary.Emit): Adjust AddressOf call.
12484
12485 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12486
12487         * cs-parser.jay (member_access): Change the case for pre-defined types
12488         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12489         this suggestion.
12490
12491         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12492         a method body.
12493
12494         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12495         essentially like methods and apply attributes like MethodImplOptions to them too.
12496
12497         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12498         not being null.
12499
12500         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12501         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12502         is the DeclSpace.
12503
12504         * Update code everywhere accordingly.
12505
12506         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12507
12508         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12509
12510 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12511
12512         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12513         try performing lookups against those instead of jumping straight into using
12514         the 'using' clauses.
12515
12516         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12517
12518         (LookupType): Perform lookups in implicit parents too.
12519
12520         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12521         sequence as RootContext.LookupType. 
12522
12523         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12524         the various cases of namespace lookups into this method.
12525
12526 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12527
12528         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12529         in positional arguments)
12530
12531         * class.cs (Operator): Update the AllowedModifiers to contain
12532         extern. 
12533
12534         * cs-parser.jay: Update operator declaration to allow for the
12535         operator body to be empty.
12536
12537         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12538         values. 
12539
12540 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12541
12542         * class.cs (Method.Emit): Label parameters.
12543
12544         * driver.cs: Return 1 or 0 as the program exit code.
12545
12546 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12547
12548         * expression.cs: Special case the `null' object when trying to
12549         auto-compute the type, as anything can be explicitly converted to
12550         that. 
12551
12552         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12553         spotting this Paolo.
12554
12555         (Expression.ImplicitNumericConversion): Perform comparissions of
12556         the type using the underlying type in the case of an enumeration
12557         rather than using the enumeration type for the compare.
12558
12559         Cope with the underlying == type case, which is not possible to
12560         catch before. 
12561
12562         (Expression.ConvertNumericExplicit): Perform comparissions of
12563         the type using the underlying type in the case of an enumeration
12564         rather than using the enumeration type for the compare.
12565
12566         * driver.cs: If the user does not supply an extension, assume .exe
12567
12568         * cs-parser.jay (if_statement): Rewrote so that we can track the
12569         location for the if statement.
12570
12571         * expression.cs (Binary.ConstantFold): Only concat strings when
12572         the operation is "+", not everything ;-)
12573
12574         * statement.cs (Statement.EmitBoolExpression): Take a location
12575         argument. 
12576         (If, While, Do): Track location.
12577
12578         * expression.cs (Binary.ResolveOperator): In the object + string
12579         case, I was missing a call to ConvertImplicit
12580
12581 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12582
12583         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12584         Location arguments. Ensure we use RootContext.LookupType to do our work
12585         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12586
12587         * interface.cs (PopulateMethod): Handle the type of the parameter being
12588         null gracefully.
12589
12590         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12591         have a params method with no fixed arguments and a call is made with no
12592         arguments.
12593
12594 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12595
12596         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12597         the verbatim-string-literal
12598
12599         * support.cs (InternalParameters.ParameterModifier): handle null
12600         fixed parameters.
12601         (InternalParameters.ParameterType): ditto.
12602
12603         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12604         duplicating the name of the variable parameter.
12605         (GetParameterByName): Fix bug where we were not looking up array
12606         paramters if they were the only present (thanks Paolo!).
12607         (GetParameterInfo): We only have an empty set of types if both
12608         fixed and array are set to null.
12609         (GetParameterInfo-idx): Handle FixedParameter == null
12610
12611         * cs-parser.jay: Handle the case where there is no catch
12612         statements (missing null test).
12613
12614 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12615
12616         * driver.cs (MainDriver): Be conservative on our command line
12617         handling.
12618
12619         Catch DirectoryNotFoundException when calling GetFiles.
12620
12621         (SplitPathAndPattern): Used to split the input specification into
12622         a path and a pattern that we can feed to Directory.GetFiles.
12623
12624 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12625
12626         * statement.cs (Fixed): Implement the last case of the Fixed
12627         statement (string handling).
12628
12629         * expression.cs (StringPtr): New class used to return a char * to
12630         a string;  Used by the Fixed statement.
12631
12632         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12633
12634         * expression.cs (Binary.ResolveOperator): Remove redundant
12635         MemberLookup pn parent type.
12636         Optimize union call, we do not need a union if the types are the same.
12637         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12638         type.
12639
12640         Specialize the use of MemberLookup everywhere, instead of using
12641         the default settings. 
12642
12643         (StackAlloc): Implement stackalloc keyword.
12644
12645         * cs-parser.jay: Add rule to parse stackalloc.
12646
12647         * driver.cs: Handle /h, /help, /?
12648
12649         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12650         before we supported unsafe code.
12651
12652         * makefile: add --unsafe to the self compilation of mcs.
12653
12654 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12655
12656         * expression.cs (PointerArithmetic): New class that is used to
12657         perform pointer arithmetic.
12658         (Binary.Resolve): Handle pointer arithmetic
12659         Handle pointer comparission.
12660         (ArrayPtr): Utility expression class that is used to take the
12661         address of an array.
12662
12663         (ElementAccess): Implement array access for pointers
12664
12665         * statement.cs (Fixed): Implement fixed statement for arrays, we
12666         are missing one more case before we are done.
12667
12668         * expression.cs (Indirection): Implement EmitAssign and set the
12669         ExprClass to Variable.  This allows pointer dereferences to be
12670         treated as variables, and to have values assigned to them.
12671
12672         * ecore.cs (Expression.StoreFromPtr): New utility function to
12673         store values dereferencing.
12674
12675 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12676
12677         * expression.cs (Binary.ResolveOperator): Ensure that we are
12678         not trying to operate on a void type - this fixes the reported
12679         bug.
12680
12681         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12682         the parent implementation is sealed.
12683
12684         * ../errors/cs0239.cs : Add.
12685
12686         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12687
12688         * typemanager.cs (unverifiable_code_type): Corresponds to 
12689         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12690         which have unsafe code in them.
12691
12692         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12693         unsafe context.
12694
12695 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12696
12697         * cs-tokenizer.cs: Add support for @"litreal strings"
12698
12699         Make tokenizer accept pre-processor directives
12700         on any column (remove the old C-like limitation). 
12701
12702         * rootcontext.cs (EmitCode): Emit any global attributes.
12703         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12704
12705         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12706
12707         * cs-parser.jay: Add support for global attributes.  
12708
12709 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12710
12711         * expression.cs (Indirection): New helper class.  Unary will
12712         create Indirection classes to be able to implement the
12713         IMemoryLocation interface on it.
12714
12715 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12716
12717         * cs-parser.jay (fixed_statement): reference the right statement.
12718
12719         * statement.cs (Fixed.Emit): Finish implementing the fixed
12720         statement for the &x case.
12721
12722 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12723
12724         * class.cs (Property.Define, Method.Define): Remove newslot when
12725         `implementing'.  
12726
12727         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12728         wrong.  NewSlot should only be used if the `new' keyword is present.
12729
12730         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12731         locating our system dir.  Sorry about this.
12732
12733 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12734
12735         * driver.cs (GetSystemDir): Compute correctly the location of our
12736         system assemblies.  I was using the compiler directory instead of
12737         the library directory.
12738
12739 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12740
12741         * expression.cs (BetterFunction): Put back in what Miguel commented out
12742         since it is the correct fix. The problem is elsewhere ;-)
12743
12744         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12745         parameters of the parms method are themselves compatible or not !
12746
12747         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12748         to check that a class implements an interface before saying that an implicit
12749         conversion was allowed. Use ImplementsInterface to do the checking.
12750
12751 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12752
12753         * class.cs (Method.Define): Track whether we are an explicit
12754         implementation or not.  And only call DefineMethodOverride if we
12755         are an explicit implementation.
12756
12757         (Property.DefineMethod): Ditto.
12758
12759 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12760
12761         * expression.cs (BetterFunction): Catch hideous bug which was
12762          preventing us from detecting ambiguous calls due to implicit casts i.e
12763         cs0121.
12764
12765 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12766
12767         * support.cs (Pair): Remove un-needed method.  I figured why I was
12768         getting the error in cs-parser.jay, the variable in a foreach loop
12769         is readonly, and the compiler does not really treat this as a variable.
12770
12771         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12772         instead of EQUALS in grammar.  
12773
12774         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12775
12776         * expression.cs (Unary.DoResolve): Check whether the argument is
12777         managed or not.
12778
12779 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12780
12781         * support.cs: Api for Pair to set a value.  Despite the fact that
12782         the variables are public the MS C# compiler refuses to compile
12783         code that accesses the field if the variable is part of a foreach
12784         statement. 
12785
12786         * statement.cs (Fixed): Begin implementation of the fixed
12787         statement.
12788
12789         (Block.AddVariable): Return the VariableInfo on success and null
12790         on failure instead of true/false. 
12791
12792         * cs-parser.jay (foreach): Catch errors on variables already
12793         defined (we were ignoring this value before) and properly unwind
12794         the block hierarchy
12795
12796         (fixed_statement): grammar for the fixed statement.
12797
12798 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12799
12800         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12801         pointer types to be incretemented.
12802
12803         (SizeOf): Implement.
12804
12805         * cs-parser.jay (pointer_member_access): Implement
12806         expr->IDENTIFIER production.
12807
12808         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12809         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12810         on safe contexts.
12811
12812         (Unary): Implement indirection.
12813
12814         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12815         use in non-unsafe context).
12816
12817         (SimpleName.DoResolve): Check for pointers in field access on safe
12818         contexts. 
12819
12820         (Expression.LoadFromPtr): Factor the load-indirect code in this
12821         function.  This was duplicated in UnboxCast and ParameterReference
12822
12823 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12824
12825         * expression.cs (ComposedCast): report an error if a pointer cast
12826         is used in a safe region.
12827
12828         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12829         pointer type casts in unsafe context.
12830
12831         * codegen.cs (EmitContext): Set up IsUnsafe.
12832
12833         * cs-parser.jay (non_expression_type): Add productions for pointer
12834         casts. 
12835
12836         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12837         code.  We should not use force into static mode if the method is
12838         not virtual.  Fixes bug in MIS
12839
12840         * statement.cs (Do.Emit, While.Emit, For.Emit,
12841         Statement.EmitBoolExpression): Add support to Do and While to
12842         propagate infinite loop as `I do return' semantics.
12843
12844         Improve the For case to also test for boolean constants.
12845
12846         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12847         to the list of attributes we can add.
12848
12849         Remove `EmitContext' argument.
12850
12851         * class.cs (Method.Define): Apply parameter attributes.
12852         (Constructor.Define): Apply parameter attributes.
12853         (MethodCore.LabelParameters): Move here the core of labeling
12854         parameters. 
12855
12856         * support.cs (ReflectionParameters.ParameterModifier,
12857         InternalParameters.ParameterModifier): Use IsByRef on the type and
12858         only return the OUT bit for these parameters instead of in/out/ref
12859         flags.
12860
12861         This is because I miss-understood things.  The ParameterInfo.IsIn
12862         and IsOut represent whether the parameter has the [In] and [Out]
12863         attributes set.  
12864
12865 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12866
12867         * ecore.cs (FieldExpr.Emit): Release temporaries.
12868
12869         * assign.cs (LocalTemporary.Release): new function.
12870
12871         * codegen.cs (EmitContext.GetTemporaryStorage,
12872         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12873         temporary storage.  Now we can "put back" localbuilders when we
12874         are done with them
12875
12876 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12877
12878         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12879         need to make a copy of the variable to generate verifiable code.
12880
12881 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12882
12883         * driver.cs: Compute dynamically the system directory.
12884
12885         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12886         Slower, but more generally useful.  Used by the abstract
12887         registering implementation. 
12888
12889         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12890         the rules for the special rule on Type/instances.  First check if
12891         we have the same name, and if so, try that special static path
12892         rather than the instance path.
12893
12894 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12895
12896         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12897         for, while and if.
12898
12899         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12900         Enum, ValueType, Delegate or Array for non-corlib compiles.
12901
12902         * cs-tokenizer.cs: Catch long identifiers (645)
12903
12904         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12905         piece of code.
12906
12907         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12908         fix, we were returning too early, so we were not registering
12909         pending methods from abstract classes.
12910
12911         Do not register pending methods if the class is abstract.
12912
12913         * expression.cs (Conditional.DoResolve): Report circular implicit
12914         conversions when we neecd to compute it for conditional
12915         expressions. 
12916
12917         (Is.DoResolve): If the expression is always of the provided type,
12918         flag warning 183.  If the expression can not ever be of the
12919         provided type flag warning 184.
12920
12921         * class.cs: Catch 169 as well.
12922
12923         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12924         read. 
12925
12926 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12927
12928         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12929
12930 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12931
12932         * interface.cs: (PopulateMethod): Check for pointers being defined
12933         only if the unsafe context is active.
12934         (PopulateProperty): ditto.
12935         (PopulateIndexer): ditto.
12936
12937         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12938         specified.  If pointers are present, make sure that they are
12939         present in an unsafe context.
12940         (Constructor, Constructor.Define): ditto.
12941         (Field, Field.Define): ditto.
12942         (Property, Property.Define): ditto.
12943         (Event, Event.Define): ditto.
12944
12945         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12946         hashtable if there are classes or structs defined.
12947
12948         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12949         code, as the constant resolution moved.
12950
12951         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12952         the metadata, so we can flag error 133. 
12953
12954         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12955         pointer is being declared in an unsafe context.
12956
12957 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12958
12959         * modifiers.cs (Modifiers.Check): Require a Location argument.
12960         Report error 227 for Unsafe use.
12961
12962         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12963
12964         * statement.cs (For.Emit): If the test is null, then report that
12965         we do `return', as we wont reach anything afterwards.
12966
12967         (Switch.SwitchGoverningType): Track the expression that matched
12968         the conversion.
12969
12970         * driver.cs: Allow negative numbers as an error code to flag.
12971
12972         * cs-parser.jay: Handle 1551.
12973
12974         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12975
12976 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12977
12978         * cs-parser.jay: Report 1518 (type declaration can only contain
12979         class, struct, interface, enum or delegate)
12980
12981         (switch_label): Report 1523 (keywords `case' or `default' must
12982         preced code)
12983
12984         (opt_switch_sections): Report 1522 (empty switch)
12985
12986         * driver.cs: Report 1515 (response file specified multiple times)
12987         Report 1516 (Source file specified multiple times).
12988
12989         * expression.cs (Argument.Resolve): Signal 1510
12990
12991         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12992         access not allowed in static code)
12993
12994 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12995
12996         * typemanager.cs (IsPointerType): Utility method which we are going
12997         to need a lot.
12998
12999         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13000         the object type, so we take care of that.
13001
13002         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13003
13004         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13005         added to non-params parameters :-)
13006
13007         * typemanager.cs (CSharpName): Include 'void' type too. 
13008
13009         (void_ptr_type): Include in the set of core types.
13010
13011         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13012         duplicating code.
13013
13014         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13015         an unsafe context.
13016
13017         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13018         completely forgotten about it.
13019
13020 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13021
13022         * cs-parser.jay (pointer_type): Add. This begins our implementation
13023         of parsing rules for unsafe code.
13024
13025         (unsafe_statement): Implement.
13026
13027         (embedded_statement): Modify to include the above.
13028
13029         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13030
13031         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13032         if the current context is an unsafe one.
13033
13034         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13035         are handled differently, we need separate rules for them.
13036
13037         (local_variable_declaration): Update to use local_variable_pointer_type
13038         to allow variable declarations of unmanaged pointer types.
13039
13040         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13041         in unsafe contexts.
13042
13043         * ../errors/cs0214.cs : Add.
13044
13045 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13046
13047         * makefile: remove 'response' file when cleaning.
13048
13049 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13050
13051         * cs-parser.jay: Report 1524.
13052
13053 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13054
13055         * typemanager.cs (RegisterMethod): drop checking if we have
13056         registered this from here
13057
13058 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13059
13060         * class.cs (Method.EmitDestructor): Implement calling our base
13061         destructor. 
13062
13063         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13064         value of InFinally.
13065
13066         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13067         this routine and will wrap the call in a try/catch block.  Deal
13068         with the case.
13069
13070 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13071
13072         * ecore.cs (Expression.MemberLookup): instead of taking a
13073         parameter `same_type' that was used to tell whether we could
13074         access private members we compute our containing type from the
13075         EmitContext.
13076
13077         (FieldExpr): Added partial support for volatile fields.  This does
13078         not work for volatile fields exposed from assemblies, as I can not
13079         figure out how to extract the modreq from it.
13080
13081         Updated all the source files to use this.
13082
13083         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13084         because it is referenced by MemberLookup very often. 
13085
13086 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13087
13088         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13089         TypeBuilder.GetCustomAttributes to retrieve what we need.
13090
13091         Get rid of redundant default_member_attr_type as this is the same as
13092         default_member_type which already exists.
13093
13094         * interface.cs, attribute.cs : Update accordingly.
13095
13096 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13097
13098         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13099         work for TYpeBuilders though.  Ravi, can you please fix this?
13100
13101         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13102
13103         * expression.cs (Argument.Emit): Handle the case of ref objects
13104         being passed to ref functions;  
13105
13106         (ParameterReference.EmitLoad): Loads the content of the pointer
13107         without dereferencing.
13108
13109 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13110
13111         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13112
13113 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13114
13115         * class.cs (Indexer.DefineMethod): Incorporate the interface
13116         type in the name of the method if we are doing explicit interface
13117         implementation.
13118
13119         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13120
13121         (BetterConversion): Fix extremely trivial bug where we were referring to
13122         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13123         again !
13124
13125         * ../errors/bug16.cs : Add although we have fixed it.
13126
13127 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13128
13129         * expression.cs (BaseIndexer): Begin implementation.
13130
13131         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13132
13133         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13134         production directly to remove a shift/reduce, and implement
13135         explicit interface implementation.
13136
13137         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13138         after a floating point suffix.
13139
13140         * expression.cs (DoNumericPromotions): Improved the conversion for
13141         uint/uint.  If we have a constant, we avoid doing a typecast to a
13142         larger type.
13143
13144         * class.cs (Indexer): Implement explicit interface implementation
13145         for indexers.
13146
13147 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13148
13149         * class.cs: make the default instance constructor public and hidebysig.
13150
13151 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13152
13153         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13154         so we can call it from elsewhere.
13155
13156         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13157         we emit it internally if the class has a defined indexer; otherwise the user
13158         emits it by decorating the class definition with the DefaultMemberAttribute.
13159
13160         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13161         attribute is not used on a type which defines an indexer.
13162
13163         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13164         character when we skip whitespace.
13165
13166         * ../errors/cs0646.cs : Add.
13167
13168 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13169
13170         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13171         again. 
13172
13173         * makefile: Add practical target `mcs3.exe' which builds the third
13174         generation compiler. 
13175
13176         * expression.cs (New): Fix structures constructor calling.
13177
13178         * class.cs (Property, Method, Indexer): Emit Final flag on the
13179         method if we are an interface implementation and we are not
13180         abstract. 
13181
13182         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13183         whether this property is referencing a `base' method.
13184
13185         * expression.cs (Invocation.EmitCall): take an extra argument:
13186         is_base, this is used to determine whether the `call' or
13187         `callvirt' opcode should be used.
13188
13189
13190         * delegate.cs: update EmitCall.
13191
13192         * class.cs (Method.Define): Set NewSlot for the cases where we are
13193         not implementing an interface method.
13194
13195         (Property.Define): ditto.
13196
13197 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13198
13199         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13200         'r'.  Allows mcs to parse itself fully.
13201
13202 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13203
13204         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13205         of the number of initializers that require the InitializeArray method.
13206
13207         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13208         update the above field where necessary.
13209
13210         (MakeByteBlob): Update accordingly.
13211
13212         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13213         greater than 2.
13214
13215         (EmitDynamicInitializers): Update in accordance with the new optimization.
13216
13217         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13218         same OpCode applies.
13219
13220         * cs-parser.jay : Fix some glaring errors I introduced.
13221
13222 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13223
13224         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13225         so that we can check for name clashes there too.
13226
13227         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13228         for interface indexers.
13229
13230         * interfaces.cs (Define): Emit the default member attribute.
13231
13232         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13233         variable was being referred to while setting the value ;-)
13234
13235 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13236
13237         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13238         byte-by-byte information when we know the data is zero.
13239
13240         Make the block always a multiple of 4, because
13241         DefineInitializedData has a bug.
13242
13243         * assign.cs: Fix, we should assign from the temporary, not from
13244         the source. 
13245
13246         * expression.cs (MakeByteBlob): Fix my incorrect code.
13247
13248 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13249
13250         * typemanager.cs (EnumToUnderlying): This function is used to get
13251         the underlying type from an enumeration, because it does not
13252         always work. 
13253
13254         * constant.cs: Use the I4_S form for values between -128 and 127.
13255
13256         * statement.cs (Block.LookupLabel): Looks up a label.
13257         (Block): Drop support for labeled blocks.
13258
13259         (LabeledStatement): New kind of statement that represents a label
13260         only.
13261
13262         (Goto): Finally implement this bad boy.
13263
13264         * cs-parser.jay: Update to reflect new mechanism to implement
13265         labels.
13266
13267 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13268
13269         * codegen.cs (EmitContext.This): a codegen property that keeps the
13270         a single instance of this instead of creating many different this
13271         instances. 
13272
13273         * delegate.cs (Delegate.DoResolve): Update to use the property;
13274
13275         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13276
13277         * expression.cs (BaseAccess.DoResolve): Ditto.
13278
13279 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13280
13281         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13282         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13283
13284         (InitCoreTypes): Update accordingly.
13285
13286         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13287         so we can quickly store the state.
13288
13289         (ApplyAttributes): Set the correct implementation flags
13290         for InternalCall methods.
13291
13292 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13293
13294         * expression.cs (EmitCall): if a method is not virtual, then do
13295         not use callvirt on it.
13296
13297         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13298         user defined stuff) requires the use of stobj, which takes an
13299         address on the stack instead of an array and an index.  So emit
13300         the Ldelema operation for it.
13301
13302         (EmitStoreOpcode): Use stobj for valuetypes.
13303
13304         (UnaryMutator.EmitCode): Use the right 1 value depending on
13305         whether we are dealing with int64/uint64, float or doubles.
13306
13307         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13308         constructors that I implemented last night.
13309
13310         (Constructor.IsDefault): Fix to work properly for static
13311         constructors.
13312
13313         * cs-parser.jay (CheckDef): report method signature errors.
13314         Update error number 103 to be 132.
13315
13316         * decl.cs: New AdditionResult enumeration value: MethodExists.
13317         Although we do this check for methods later on in the semantic
13318         analysis, catching repeated default constructors is so easy that
13319         we catch these here. 
13320
13321         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13322         promotions code.
13323
13324         (ParameterReference.EmitAssign, Emit): handle
13325         bools as bytes.
13326
13327         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13328         (ArrayAccess.EmitStoreOpcode): ditto.
13329
13330         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13331
13332         * expression.cs (MakeByteBlob): Complete all the missing types
13333         (uint, short, ushort, byte, sbyte)
13334
13335         * class.cs: Only init instance field initializers on instance
13336         constructors. 
13337
13338         Rename `constructors' to instance_constructors. 
13339
13340         (TypeContainer.AddConstructor): Only add constructors to the list
13341         if it is not static.
13342
13343         Make sure that we handle default_static_constructor independently
13344         everywhere where we handle instance_constructors
13345
13346 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13347
13348         * class.cs: Do not lookup or create a base initializer for a
13349         static constructor.
13350
13351         (ConstructorInitializer.Resolve): use the proper type to lookup
13352         for constructors.
13353
13354         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13355
13356         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13357         in DeclSpace. 
13358
13359         * decl.cs: CloseType is now an virtual method, the default
13360         implementation just closes this type.
13361
13362 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13363
13364         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13365         to PreserveSig by default. Also emit HideBySig on such methods.
13366
13367         Basically, set the defaults to standard values.
13368
13369         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13370         argument, if candidate is better, it can't be worse than the best !
13371
13372         (Invocation): Re-write bits to differentiate between methods being
13373         applicable in their expanded form and their normal form - for params
13374         methods of course.
13375
13376         Get rid of use_standard everywhere as only standard conversions are allowed
13377         in overload resolution. 
13378
13379         More spec conformance.
13380
13381 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13382
13383         * driver.cs: Add --timestamp, to see where the compiler spends
13384         most of its time.
13385
13386         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13387         `this' in static code.
13388
13389         (SimpleName.DoResolve): Implement in terms of a helper function
13390         that allows static-references to be passed upstream to
13391         MemberAccess.
13392
13393         (Expression.ResolveWithSimpleName): Resolve specially simple
13394         names when called by MemberAccess to implement the special
13395         semantics. 
13396
13397         (Expression.ImplicitReferenceConversion): Handle conversions from
13398         Null to reference types before others, as Null's type is
13399         System.Object. 
13400
13401         * expression.cs (Invocation.EmitCall): Handle the special case of
13402         calling methods declared on a reference type from a ValueType
13403         (Base classes System.Object and System.Enum)
13404
13405         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13406         the left hand side is a TypeExpr, not on every enumeration. 
13407
13408         (Binary.Resolve): If types are reference types, then do a cast to
13409         object on operators != and == of both arguments.
13410
13411         * typemanager.cs (FindMembers): Extract instance and static
13412         members if requested.
13413
13414         * interface.cs (PopulateProperty): Use void_type instead of null
13415         as the return type for the setter method.
13416
13417         (PopulateIndexer): ditto.
13418
13419 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13420
13421         * support.cs (ReflectionParameters): Fix minor bug where we
13422         were examining the wrong parameter for the ParamArray attribute.
13423
13424         Cope with requests for the type of the parameter at position
13425         greater than the params parameter's. We now return the element
13426         type of the params array as that makes more sense.
13427
13428         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13429         accordingly as we no longer have to extract the element type
13430         ourselves.
13431
13432         (Invocation.OverloadResolve): Update.
13433
13434 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13435
13436         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13437         against IEnumerator, test whether the return value is a descendant
13438         of the IEnumerator interface.
13439
13440         * class.cs (Indexer.Define): Use an auxiliary method to implement
13441         the other bits of the method definition.  Begin support for
13442         explicit interface implementation.
13443
13444         (Property.DefineMethod): Use TypeManager.void_type instead of null
13445         for an empty return value.
13446
13447 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13448
13449         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13450         dealing with a FieldExpr which is composed of a FieldBuilder, in
13451         the code path we did extract the constant, but we should have
13452         obtained the underlying value to be able to cast it (otherwise we
13453         end up in an infinite loop, this is what Ravi was running into).
13454
13455         (ArrayCreation.UpdateIndices): Arrays might be empty.
13456
13457         (MemberAccess.ResolveMemberAccess): Add support for section
13458         14.5.4.1 that deals with the special case of E.I when E is a type
13459         and something else, that I can be a reference to a static member.
13460
13461         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13462         handle a particular array type to create byte blobs, it is just
13463         something we dont generate byteblobs for.
13464
13465         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13466         arguments. 
13467
13468         * location.cs (Push): remove the key from the hashtable that we
13469         are about to add.   This happens for empty files.
13470
13471         * driver.cs: Dispose files after we have parsed them.
13472
13473         (tokenize): new function that only runs the tokenizer on its
13474         input, for speed testing.
13475
13476 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13477
13478         * class.cs (Event.Define): Define the private field only if there
13479         are no accessors defined.
13480
13481         * expression.cs (ResolveMemberAccess): If there is no associated
13482         field with the event, that means we have an event defined with its
13483         own accessors and we should flag error cs0070 since transforming
13484         ourselves into a field is not valid in that case.
13485
13486         * ecore.cs (SimpleName.DoResolve): Same as above.
13487
13488         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13489         and charset to sane values.
13490
13491 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13492
13493         * assign.cs (DoResolve): Perform check on events only if they 
13494         are being accessed outside the declaring type.
13495
13496         * cs-parser.jay (event_declarations): Update rules to correctly
13497         set the type of the implicit parameter etc.
13498
13499         (add_accessor, remove_accessor): Set current local parameters.
13500
13501         * expression.cs (Binary): For delegate addition and subtraction,
13502         cast the return value from the method into the appropriate delegate
13503         type.
13504
13505 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13506
13507         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13508         of these as the workaround is unnecessary.
13509
13510         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13511         delegate data - none of that is needed at all.
13512
13513         Re-write bits to extract the instance expression and the delegate method
13514         correctly.
13515
13516         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13517         on delegates too.
13518
13519         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13520         of attaching attributes instead of duplicating code everywhere.
13521
13522         * everywhere : Update code to do attribute emission using the above method.
13523
13524 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13525
13526         * expression.cs (IsParamsMethodApplicable): if there are not
13527         parameters, return immediately.
13528
13529         * ecore.cs: The 0 literal can be implicity converted to an enum
13530         type. 
13531
13532         (SimpleName.DoResolve): First lookup the type, then lookup the
13533         members. 
13534
13535         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13536         want to get its address.  If the InstanceExpression is not
13537         addressable, store the result in a temporary variable, then get
13538         the address of it.
13539
13540         * codegen.cs: Only display 219 errors on warning level or above. 
13541
13542         * expression.cs (ArrayAccess): Make it implement the
13543         IMemoryLocation interface.
13544
13545         (Binary.DoResolve): handle the operator == (object a, object b)
13546         and operator != (object a, object b) without incurring into a
13547         BoxedCast (because 5 != o should never be performed).
13548
13549         Handle binary enumerator operators.
13550
13551         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13552         value type, otherwise use Ldelem_ref.
13553
13554         Use precomputed names;
13555
13556         (AddressOf): Implement address of
13557
13558         * cs-parser.jay (labeled_statement): Fix recursive block
13559         addition by reworking the production.
13560
13561         * expression.cs (New.DoEmit): New has a special case:
13562                 
13563                  If we are dealing with a ValueType, we have a few
13564                  situations to deal with:
13565                 
13566                     * The target of New is a ValueType variable, that is
13567                       easy, we just pass this as the variable reference
13568                 
13569                     * The target of New is being passed as an argument,
13570                       to a boxing operation or a function that takes a
13571                       ValueType.
13572                 
13573                       In this case, we need to create a temporary variable
13574                       that is the argument of New.
13575
13576
13577 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13578
13579         * rootcontext.cs (LookupType): Check that current_type is not null before
13580         going about looking at nested types.
13581
13582         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13583         not implement the IAssignMethod interface any more.
13584
13585         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13586         where we tranform them into FieldExprs if they are being resolved from within
13587         the declaring type.
13588
13589         * ecore.cs (SimpleName.DoResolve): Do the same here.
13590
13591         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13592
13593         * ../errors/bug10.cs : Add.
13594
13595         * ../errors/cs0070.cs : Add.
13596
13597         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13598
13599         * assign.cs : Get rid of EventIsLocal everywhere.
13600
13601 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13602
13603         * ecore.cs (ConvertIntLiteral): finished the implementation.
13604
13605         * statement.cs (SwitchLabel): Convert the value we are using as a
13606         key before looking up the table.
13607
13608 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13609
13610         * codegen.cs (EmitTopBlock): Require a Location argument now.
13611
13612         * cs-parser.jay (constructor_declarator): We need to setup
13613         current_local_parameters before we parse the
13614         opt_constructor_initializer, to allow the variables to be bound
13615         to the constructor arguments.
13616
13617         * rootcontext.cs (LookupType): First lookup nested classes in our
13618         class and our parents before we go looking outside our class.
13619
13620         * expression.cs (ConstantFold): Extract/debox the values at the
13621         beginnning. 
13622
13623         * rootcontext.cs (EmitCode): Resolve the constants first before we
13624         resolve the types.  This is not really needed, but it helps debugging.
13625
13626         * statement.cs: report location.
13627
13628         * cs-parser.jay: pass location to throw statement.
13629
13630         * driver.cs: Small bug fix.
13631
13632         * report.cs: Updated format to be 4-zero filled digits.
13633
13634 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13635
13636         * expression.cs (CheckIndices): Fix minor bug where the wrong
13637         variable was being referred to ;-)
13638
13639         (DoEmit): Do not call EmitStaticInitializers when the 
13640         underlying type is System.Object.
13641
13642 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13643
13644         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13645         and do the usual workaround for SRE.
13646
13647         * class.cs (MyEventBuilder.EventType): New member to get at the type
13648         of the event, quickly.
13649
13650         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13651
13652         * assign.cs (Assign.DoResolve): Handle the case when the target
13653         is an EventExpr and perform the necessary checks.
13654
13655         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13656         interface.
13657
13658         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13659
13660         (EventExpr): Set the type in the constructor itself since we 
13661         are meant to be born fully resolved.
13662
13663         (EventExpr.Define): Revert code I wrote earlier.
13664                 
13665         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13666         instance expression is null. The instance expression is a This in that case
13667         or a null, depending on whether it is a static method or not.
13668
13669         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13670         refers to more than one method.
13671
13672         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13673         and accordingly flag errors.
13674
13675 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13676
13677         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13678
13679 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13680
13681         * location.cs (ToString): Provide useful rutine.
13682
13683 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13684
13685         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13686         objects, return the actual integral boxed.
13687
13688         * statement.cs (SwitchLabel): define an ILLabel for each
13689         SwitchLabel. 
13690
13691         (Switch.CheckSwitch): If the value is a Literal, extract
13692         the underlying literal.
13693
13694         Also in the unused hashtable we had, add the SwitchLabel so we can
13695         quickly look this value up.
13696
13697         * constant.cs: Implement a bunch of new constants.  Rewrite
13698         Literal based on this.  Made changes everywhere to adapt to this.
13699
13700         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13701         dereferencing array only once, and also copes with enumrations.
13702
13703         bytes are two bytes wide, not one.
13704
13705         (Cast): Perform constant conversions.
13706
13707         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13708         wrappers to the literals here.
13709
13710         * expression.cs (DoNumericPromotions): long literals can converted
13711         to ulong implicity (this is taken care of elsewhere, but I was
13712         missing this spot).
13713
13714         * ecore.cs (Expression.Literalize): Make the return type Literal,
13715         to improve type checking.
13716
13717         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13718
13719 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13720
13721         * literal.cs: Revert code from ravi that checked the bounds.  The
13722         bounds are sane by the definition of the type itself. 
13723
13724         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13725         need to actually look up in our parent hierarchy for interfaces
13726         implemented. 
13727
13728         * const.cs: Use the underlying type for enumerations
13729
13730         * delegate.cs: Compute the basename for the delegate creation,
13731         that should fix the delegate test case, and restore the correct
13732         Type Lookup semantics in rootcontext
13733
13734         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13735         referencing a nested type with the Reflection API is using the "+"
13736         sign. 
13737
13738         * cs-parser.jay: Do not require EOF token at the end.
13739
13740 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13741
13742         * rootcontext.cs (LookupType): Concatenate type names with
13743         a '.' instead of a '+' The test suite passes again.
13744
13745         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13746         field of the enumeration.
13747
13748         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13749         the case when the member is an EventExpr.
13750
13751         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13752         static has an associated instance expression.
13753
13754         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13755
13756         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13757
13758         * class.cs (Event.Define): Register event and perform appropriate checks
13759         for error #111.
13760
13761         We define the Add and Remove methods even if the use provides none because
13762         in that case, we provide default implementations ourselves.
13763
13764         Define a private field of the type of the event. This is done by the CSC compiler
13765         and we should be doing it too ;-)
13766
13767         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13768         More methods we use in code we generate.
13769
13770         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13771         is important.
13772
13773         (InitCoreTypes): Update accordingly for the above.
13774
13775         * class.cs (Event.Emit): Generate code for default accessors that we provide
13776
13777         (EmitDefaultMethod): Do the job in the above.
13778
13779         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13780         appropriate place.
13781
13782 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13783
13784         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13785         builders even if we were missing one.
13786
13787         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13788         pass the Basename as our class name instead of the Name.  The
13789         basename will be correctly composed for us.
13790
13791         * parameter.cs (Paramters): Now takes a Location argument.
13792
13793         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13794         make all the code call directly LookupType in RootContext and take
13795         this chance to pass the Location information everywhere.
13796
13797         * Everywhere: pass Location information.
13798
13799 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13800
13801         * class.cs (Constructor.Define): Updated way of detecting the
13802         length of the parameters.
13803
13804         (TypeContainer.DefineType): Use basename as the type name for
13805         nested types.
13806
13807         (TypeContainer.Define): Do not recursively define types here, as
13808         definition is taken care in order by the RootContext.
13809
13810         * tree.cs: Keep track of namespaces in a per-file basis.
13811
13812         * parameter.cs (Parameter.ComputeSignature): Update to use
13813         DeclSpace. 
13814
13815         (Parameters.GetSignature): ditto.
13816
13817         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13818         instead of a TypeContainer.
13819
13820         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13821         resolve names.  Because we need to be resolve in our context, not
13822         our parents.
13823
13824         * driver.cs: Implement response files.
13825
13826         * class.cs (TypeContainer.DefineType): If we are defined, do not
13827         redefine ourselves.
13828
13829         (Event.Emit): Emit the code for add/remove handlers.
13830         (Event.Define): Save the MethodBuilders for add/remove.
13831
13832         * typemanager.cs: Use pair here too.
13833
13834         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13835         DictionaryEntry requires the first argument to be non-null.  
13836
13837         (enum_declaration): Compute full name for registering the
13838         enumeration.
13839
13840         (delegate_declaration): Instead of using
13841         formal_parameter_list, use opt_formal_parameter_list as the list
13842         can be empty.
13843
13844         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13845         (EventParsing): New property that controls whether `add' and
13846         `remove' are returned as tokens or identifiers (for events);
13847
13848 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13849
13850         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13851         use MyEventBuilder only and let it wrap the real builder for us.
13852
13853         (MyEventBuilder): Revamp constructor etc.
13854
13855         Implement all operations that we perform on EventBuilder in precisely the same
13856         way here too.
13857
13858         (FindMembers): Update to use the EventBuilder member.
13859
13860         (Event.Emit): Update accordingly.
13861
13862 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13863
13864         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13865         by calling the appropriate methods.
13866
13867         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13868         useful.
13869
13870         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13871
13872 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13873
13874         * delegate.cs (Delegate.Populate): Check that the return type
13875         and various parameters types are indeed accessible.
13876
13877         * class.cs (Constructor.Define): Same here.
13878
13879         (Field.Define): Ditto.
13880
13881         (Event.Define): Ditto.
13882
13883         (Operator.Define): Check that the underlying Method defined itself
13884         correctly - so it's MethodBuilder should not be null.
13885
13886         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13887         expression happens to be null.
13888
13889         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13890         members but as of now we don't seem to be able to do anything really useful with it.
13891
13892         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13893         not the EventBuilder.
13894
13895 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13896
13897         * cs-tokenizer.cs: Add support for defines.
13898         Add support for #if, #elif, #else, #endif
13899
13900         (eval_var): evaluates a variable.
13901         (eval): stubbed for evaluating functions.
13902
13903         * cs-parser.jay: Pass the defines information
13904
13905         * driver.cs: Add --define command line option.
13906
13907         * decl.cs: Move MemberCore here.
13908
13909         Make it the base class for DeclSpace.  This allows us to catch and
13910         report 108 and 109 for everything now.
13911
13912         * class.cs (TypeContainer.Define): Extract all the members
13913         before populating and emit the warning 108 (new keyword required
13914         to override) instead of having each member implement this.
13915
13916         (MemberCore.Define): New abstract method, we will be using this in
13917         the warning reporting engine in Populate.
13918
13919         (Operator.Define): Adjust to new MemberCore protocol. 
13920
13921         * const.cs (Const): This does not derive from Expression, it is a
13922         temporary object we use to create fields, it is a MemberCore. 
13923
13924         * class.cs (Method.Define): Allow the entry point to be in a
13925         specific class.
13926
13927         * driver.cs: Rewrite the argument handler to clean it up a bit.
13928
13929         * rootcontext.cs: Made it just an auxiliary namespace feature by
13930         making everything static.
13931
13932         * driver.cs: Adapt code to use RootContext type name instead of
13933         instance variable.
13934
13935         * delegate.cs: Remove RootContext argument.
13936
13937         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13938         argument. 
13939
13940         * class.cs (Event.Define): The lookup can fail.
13941
13942         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13943
13944         * expression.cs: Resolve the this instance before invoking the code.
13945
13946 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13947
13948         * cs-parser.jay: Add a production in element_access that allows
13949         the thing to become a "type" reference.  This way we can parse
13950         things like "(string [])" as a type.
13951
13952         Note that this still does not handle the more complex rules of
13953         casts. 
13954
13955
13956         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13957
13958         * ecore.cs: (CopyNewMethods): new utility function used to
13959         assemble the list of methods from running FindMembers.
13960
13961         (MemberLookup): Rework FindMembers so that 
13962
13963 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13964
13965         * class.cs (TypeContainer): Remove Delegates who fail to be
13966         defined.
13967
13968         * delegate.cs (Populate): Verify that we dont get null return
13969         values.   TODO: Check for AsAccessible.
13970
13971         * cs-parser.jay: Use basename to emit error 574 (destructor should
13972         have the same name as container class), not the full name.
13973
13974         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13975         possible representation.  
13976
13977         Also implements integer type suffixes U and L.
13978
13979 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13980
13981         * expression.cs (ArrayCreation.DoResolve): We need to do the
13982         argument resolution *always*.
13983
13984         * decl.cs: Make this hold the namespace.  Hold the root context as
13985         well.
13986         (LookupType): Move here.
13987
13988         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13989
13990         * location.cs (Row, Name): Fixed the code, it was always returning
13991         references to the first file.
13992
13993         * interface.cs: Register properties defined through interfaces.
13994
13995         * driver.cs: Add support for globbing on the command line
13996
13997         * class.cs (Field): Make it derive from MemberCore as well.
13998         (Event): ditto.
13999
14000 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14001
14002         * class.cs (Event::Define): Check that the type of the event is a delegate
14003         type else flag error #66.
14004
14005         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14006         same.
14007
14008         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14009         values of EntryPoint, CharSet etc etc.
14010
14011         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14012
14013         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14014         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14015         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14016         which needs this to do its work.
14017
14018         * ../errors/cs0066.cs : Add.
14019
14020 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14021
14022         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14023         helper functions.
14024
14025         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14026         clears out the parameters field.
14027         (MemberSignatureCompare): Cleanup
14028
14029         (MemberCore): New base class used to share code between MethodCore
14030         and Property.
14031
14032         (RegisterRequiredImplementations) BindingFlags.Public requires
14033         either BindingFlags.Instace or Static.  Use instance here.
14034
14035         (Property): Refactored code to cope better with the full spec.
14036
14037         * parameter.cs (GetParameterInfo): Return an empty array instead
14038         of null on error.
14039
14040         * class.cs (Property): Abstract or extern properties have no bodies.
14041
14042         * parameter.cs (GetParameterInfo): return a zero-sized array.
14043
14044         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14045         method modifier validation to the typecontainer so we can reuse
14046         this on properties.
14047
14048         (MethodCore.ParameterTypes): return an empty sized array of types.
14049
14050         (Property.Define): Test property modifier validity.
14051
14052         Add tests for sealed/override too.
14053
14054         (Method.Emit): abstract or extern methods have no bodies.
14055
14056 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14057
14058         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14059         thing.
14060
14061         (Method::Define, ::Emit): Modify accordingly.
14062
14063         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14064
14065         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14066
14067         * makefile: Pass in /unsafe.
14068
14069 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14070
14071         * class.cs (MakeKey): Kill routine.
14072
14073         * class.cs (TypeContainer.Define): Correctly define explicit
14074         method implementations (they require the full interface name plus
14075         the method name).
14076
14077         * typemanager.cs: Deply the PtrHashtable here and stop using the
14078         lame keys.  Things work so much better.
14079
14080         This of course broke everyone who depended on `RegisterMethod' to
14081         do the `test for existance' test.  This has to be done elsewhere.
14082
14083         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14084         the object stupid Equals method (because, that like fails all over
14085         the place).  We still do not use it.
14086
14087         * class.cs (TypeContainer.SetRequiredInterface,
14088         TypeContainer.RequireMethods): Killed these two routines and moved
14089         all the functionality to RegisterRequiredImplementations.
14090
14091         (TypeContainer.RegisterRequiredImplementations): This routine now
14092         registers all the implementations required in an array for the
14093         interfaces and abstract methods.  We use an array of structures
14094         which can be computed ahead of time to reduce memory usage and we
14095         also assume that lookups are cheap as most classes will not
14096         implement too many interfaces.
14097
14098         We also avoid creating too many MethodSignatures.
14099
14100         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14101         clear the "pending" bit if we find that there are problems with
14102         the declaration.
14103
14104         (TypeContainer.VerifyPendingMethods): Update to report errors of
14105         methods that look like implementations but are not.
14106
14107         (TypeContainer.Define): Add support for explicit interface method
14108         implementation. 
14109
14110 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14111
14112         * typemanager.cs: Keep track of the parameters here instead of
14113         being a feature of the TypeContainer.
14114
14115         * class.cs: Drop the registration of parameters here, as
14116         InterfaceMethods are also interface declarations.
14117
14118         * delegate.cs: Register methods with the TypeManager not only with
14119         the TypeContainer.  This code was buggy.
14120
14121         * interface.cs: Full registation here.
14122
14123 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14124
14125         * expression.cs: Remove reducer for binary expressions, it can not
14126         be done this way.
14127
14128         * const.cs: Put here the code that used to go into constant.cs
14129
14130         * constant.cs: Put here the code for constants, this is a new base
14131         class for Literals.
14132
14133         * literal.cs: Make Literal derive from Constant.
14134
14135 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14136
14137         * statement.cs (Return.Emit): Report error 157 if the user
14138         attempts to return from a finally block.
14139
14140         (Return.Emit): Instead of emitting a return, jump to the end of
14141         the function.
14142
14143         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14144         LocalBuilder to store the result of the function.  ReturnLabel is
14145         the target where we jump.
14146
14147
14148 2001-12-09  Radek Doulik  <rodo@ximian.com>
14149
14150         * cs-parser.jay: remember alias in current namespace
14151
14152         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14153         namespaces
14154
14155         * class.cs (LookupAlias): lookup alias in my_namespace
14156
14157         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14158         aliases hashtable
14159         (LookupAlias): lookup alias in this and if needed in parent
14160         namespaces
14161
14162 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14163
14164         * support.cs: 
14165
14166         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14167         making things static.  I need this to avoid passing the
14168         TypeContainer when calling ParameterType.
14169
14170         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14171         that did string manipulation to compute the type and then call
14172         GetType.  Use Parameter.ParameterType instead.
14173
14174         * cs-tokenizer.cs: Consume the suffix for floating values.
14175
14176         * expression.cs (ParameterReference): figure out whether this is a
14177         reference parameter or not.  Kill an extra variable by computing
14178         the arg_idx during emission.
14179
14180         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14181         function that returns whether a parameter is an out/ref value or not.
14182
14183         (Parameter.ParameterType): The type of the parameter (base,
14184         without ref/out applied).
14185
14186         (Parameter.Resolve): Perform resolution here.
14187         (Parameter.ExternalType): The full type (with ref/out applied).
14188
14189         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14190         support for expressions on the using statement.
14191
14192 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14193
14194         * statement.cs (Using.EmitLocalVariableDecls): Split the
14195         localvariable handling of the using statement.
14196
14197         (Block.EmitMeta): Keep track of variable count across blocks.  We
14198         were reusing slots on separate branches of blocks.
14199
14200         (Try.Emit): Emit the general code block, we were not emitting it. 
14201
14202         Check the type of the declaration to be an IDisposable or
14203         something that can be implicity converted to it. 
14204
14205         Emit conversions if required.
14206
14207         * ecore.cs (EmptyExpression): New utility class.
14208         (Expression.ImplicitConversionExists): New utility function.
14209
14210 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14211
14212         * statement.cs (Using): Implement.
14213
14214         * expression.cs (LocalVariableReference): Support read only variables.
14215
14216         * statement.cs: Remove the explicit emit for the Leave opcode.
14217         (VariableInfo): Add a readonly field.
14218
14219 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14220
14221         * ecore.cs (ConvCast): new class used to encapsulate the various
14222         explicit integer conversions that works in both checked and
14223         unchecked contexts.
14224
14225         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14226         properly generate the overflow opcodes.
14227
14228 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14229
14230         * statement.cs: The correct type for the EmptyExpression is the
14231         element_type, not the variable type.  Ravi pointed this out.
14232
14233 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14234
14235         * class.cs (Method::Define): Handle PInvoke methods specially
14236         by using DefinePInvokeMethod instead of the usual one.
14237
14238         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14239         above to do the task of extracting information and defining the method.
14240
14241 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14242
14243         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14244         of the condition for string type.
14245
14246         (Emit): Move that here. 
14247
14248         (ArrayCreation::CheckIndices): Keep string literals in their expression
14249         form.
14250
14251         (EmitDynamicInitializers): Handle strings appropriately.
14252
14253 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14254
14255         * codegen.cs (EmitContext): Replace multiple variables with a
14256         single pointer to the current Switch statement.
14257
14258         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14259         EmitContext.
14260
14261 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14262
14263         * statement.cs 
14264
14265         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14266         default'.
14267
14268         (Foreach.Emit): Foreach on arrays was not setting
14269         up the loop variables (for break/continue).
14270
14271         (GotoCase): Semi-implented.
14272
14273 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14274
14275         * attribute.cs (CheckAttribute): Handle system attributes by using
14276         Attribute.GetAttributes to examine information we need.
14277
14278         (GetValidPlaces): Same here.
14279
14280         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14281
14282         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14283
14284         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14285
14286         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14287
14288         (Method::Emit): Handle the case when we are a PInvoke method.
14289
14290 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14291
14292         * expression.cs: Use ResolveWithSimpleName on compound names.
14293
14294 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14295
14296         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14297         before trying to reduce it.
14298
14299         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14300
14301         * constant.cs (LookupConstantValue): Implement.
14302
14303         (EmitConstant): Use the above in emitting the constant.
14304
14305         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14306         that are user-defined by doing a LookupConstantValue on them.
14307
14308         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14309         too, like above.
14310
14311 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14312
14313         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14314
14315         (BaseAccess.DoResolve): Implement.
14316
14317         (MemberAccess.DoResolve): Split this routine into a
14318         ResolveMemberAccess routine that can be used independently
14319
14320 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14321
14322         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14323         As that share bits of the implementation.  Is returns a boolean,
14324         while As returns the Type that is being probed.
14325
14326 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14327
14328         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14329         instead of a Literal - much easier.
14330
14331         (EnumInTransit): Remove - utterly useless :-)
14332
14333         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14334
14335         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14336
14337         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14338         chain when we have no associated expression.
14339
14340 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14341
14342         * constant.cs (Define): Use Location while reporting the errror.
14343
14344         Also emit a warning when 'new' is used and there is no inherited
14345         member to hide.
14346
14347         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14348         populated.
14349
14350         (LookupEnumValue): Implement to lookup an enum member's value and define it
14351         if necessary.
14352
14353         (Populate): Re-write accordingly to use the above routine.
14354
14355 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14356
14357         * expression.cs (This): Fix prototype for DoResolveLValue to
14358         override the base class DoResolveLValue.
14359
14360         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14361         declarations) 
14362
14363         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14364         (we need to load the address of the field here).  This fixes
14365         test-22. 
14366
14367         (FieldExpr.DoResolveLValue): Call the DoResolve
14368         function to initialize the Instance expression.
14369
14370         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14371         correctly the GetEnumerator operation on a value type.
14372
14373         * cs-parser.jay: Add more simple parsing error catches.
14374
14375         * statement.cs (Switch): Add support for string switches.
14376         Handle null specially.
14377
14378         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14379
14380 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14381
14382         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14383
14384         (declare_local_constant): New helper function.
14385
14386         * statement.cs (AddConstant): Keep a separate record of constants
14387
14388         (IsConstant): Implement to determine if a variable is a constant.
14389
14390         (GetConstantExpression): Implement.
14391
14392         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14393
14394         * statement.cs (IsVariableDefined): Re-write.
14395
14396 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14397
14398         * class.cs (TypeContainer::FindMembers): Look for constants
14399         in the case when we are looking for MemberTypes.Field
14400
14401         * expression.cs (MemberAccess::DoResolve): Check that in the
14402         case we are a FieldExpr and a Literal, we are not being accessed
14403         by an instance reference.
14404
14405         * cs-parser.jay (local_constant_declaration): Implement.
14406
14407         (declaration_statement): Implement for constant declarations.
14408
14409 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14410
14411         * statement.cs (Switch): Catch double defaults.
14412
14413         (Switch): More work on the switch() statement
14414         implementation.  It works for integral values now, need to finish
14415         string support.
14416
14417
14418 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14419
14420         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14421         integer literals into other integer literals.  To be used by
14422         switch. 
14423
14424 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14425
14426         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14427         some memory.
14428
14429         (EmitDynamicInitializers): Cope with the above since we extract data
14430         directly from ArrayData now.
14431
14432         (ExpectInitializers): Keep track of whether initializers are mandatory
14433         or not.
14434
14435         (Bounds): Make it a hashtable to prevent the same dimension being 
14436         recorded for every element in that dimension.
14437
14438         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14439         from being found.
14440
14441         Also fix bug which was causing the indices to be emitted in the reverse
14442         order.
14443
14444 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14445
14446         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14447         unfinished.  They do not work, because the underlying code is
14448         sloppy.
14449
14450 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14451
14452         * cs-parser.jay: Remove bogus fixme.
14453
14454         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14455         on Switch statement.
14456
14457 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14458
14459         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14460         the same. 
14461
14462         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14463         parameter. Apparently, any expression is allowed. 
14464
14465         (ValidateInitializers): Update accordingly.
14466
14467         (CheckIndices): Fix some tricky bugs thanks to recursion.
14468
14469         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14470         I was being completely brain-dead.
14471
14472         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14473         and re-write acordingly.
14474
14475         (DelegateInvocation): Re-write accordingly.
14476
14477         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14478
14479         (MakeByteBlob): Handle types more correctly.
14480
14481         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14482         initialization from expressions but it is incomplete because I am a complete
14483         Dodo :-|
14484
14485 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14486
14487         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14488         on If.  Basically, we have to return `true' (ie, we do return to
14489         our caller) only if both branches of the if return.
14490
14491         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14492         short-circuit operators, handle them as short circuit operators. 
14493
14494         (Cast.DoResolve): Resolve type.
14495         (Cast.Cast): Take an expression as the target type.
14496
14497         * cs-parser.jay (cast_expression): Remove old hack that only
14498         allowed a limited set of types to be handled.  Now we take a
14499         unary_expression and we resolve to a type during semantic
14500         analysis.
14501
14502         Use the grammar productions from Rhys to handle casts (this is
14503         not complete like Rhys syntax yet, we fail to handle that corner
14504         case that C# has regarding (-x), but we will get there.
14505
14506 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14507
14508         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14509         field which is an array type.
14510
14511         * cs-parser.jay (declare_local_variables): Support array initialization too.
14512
14513         * typemanager.cs (MakeKey): Implement.
14514
14515         (everywhere): Use the above appropriately.
14516
14517         * cs-parser.jay (for_statement): Update for array initialization while
14518         declaring variables.
14519
14520         * ecore.cs : The error message was correct, it's the variable's names that
14521         were misleading ;-) Make the code more readable.
14522
14523         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14524         the correct type etc.
14525
14526         (ConvertExplicit): Handle Enum types by examining the underlying type.
14527
14528 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14529
14530         * parameter.cs (GetCallingConvention): Always return
14531         CallingConventions.Standard for now.
14532
14533 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14534
14535         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14536         and `r' after calling DoNumericPromotions.
14537
14538         * ecore.cs: Fix error message (the types were in the wrong order).
14539
14540         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14541         BindingFlags.Instance as well 
14542
14543         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14544         implicit int literal conversion in an empty cast so that we
14545         propagate the right type upstream.
14546
14547         (UnboxCast): new class used to unbox value types.
14548         (Expression.ConvertExplicit): Add explicit type conversions done
14549         by unboxing.
14550
14551         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14552         the target type before applying the implicit LongLiterals to ULong
14553         literal cast.
14554
14555 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14556
14557         * cs-parser.jay (for_statement): Reworked the way For works: now
14558         we declare manually any variables that are introduced in
14559         for_initializer to solve the problem of having out-of-band code
14560         emition (that is what got for broken).
14561
14562         (declaration_statement): Perform the actual variable declaration
14563         that used to be done in local_variable_declaration here.
14564
14565         (local_variable_declaration): Do not declare anything, just pass
14566         the information on a DictionaryEntry
14567
14568 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14569
14570         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14571         re-write of the logic to now make it recursive.
14572
14573         (UpdateIndices): Re-write accordingly.
14574
14575         Store element data in a separate ArrayData list in the above methods.
14576
14577         (MakeByteBlob): Implement to dump the array data into a byte array.
14578
14579 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14580
14581         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14582         into CheckIndices.
14583
14584         * constant.cs (Define): Implement.
14585
14586         (EmitConstant): Re-write fully.
14587
14588         Pass in location info.
14589
14590         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14591         respectively.
14592
14593         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14594         DictionaryEntry since we need location info too.
14595
14596         (constant_declaration): Update accordingly.
14597
14598         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14599         code into another method : UpdateIndices.
14600
14601 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14602
14603         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14604         some type checking etc.
14605
14606 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14607
14608         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14609         bits to provide dimension info if the user skips doing that.
14610
14611         Update second constructor to store the rank correctly.
14612
14613 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14614
14615         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14616         and try to implement.
14617
14618         * ../errors/cs0150.cs : Add.
14619
14620         * ../errors/cs0178.cs : Add.
14621
14622 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14623
14624         * statement.cs: Implement foreach on multi-dimensional arrays. 
14625
14626         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14627         name of the params argument.
14628
14629         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14630         initializing the array.
14631
14632         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14633         we can use this elsewhere.
14634
14635         * statement.cs: Finish implementation of foreach for single
14636         dimension arrays.
14637
14638         * cs-parser.jay: Use an out-of-band stack to pass information
14639         around, I wonder why I need this.
14640
14641         foreach_block: Make the new foreach_block the current_block.
14642
14643         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14644         function used to return a static Parameters structure.  Used for
14645         empty parameters, as those are created very frequently.
14646
14647         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14648
14649 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14650
14651         * interface.cs : Default modifier is private, not public. The
14652         make verify test passes again.
14653
14654 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14655
14656         * support.cs (ReflectionParameters): Fix logic to determine
14657         whether the last parameter is a params one. Test 9 passes again.
14658
14659         * delegate.cs (Populate): Register the builders we define with
14660         RegisterParameterForBuilder. Test 19 passes again.
14661
14662         * cs-parser.jay (property_declaration): Reference $6 instead
14663         of $$ to get at the location.
14664
14665         (indexer_declaration): Similar stuff.
14666
14667         (attribute): Ditto.
14668
14669         * class.cs (Property): Register parameters for the Get and Set methods
14670         if they exist. Test 23 passes again.
14671
14672         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14673         call to EmitArguments as we are sure there aren't any params arguments. 
14674         Test 32 passes again.
14675
14676         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14677         IndexOutOfRangeException. 
14678
14679         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14680         Test 33 now passes again.
14681
14682 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14683
14684         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14685         broke a bunch of things.  Will have to come up with a better way
14686         of tracking locations.
14687
14688         * statement.cs: Implemented foreach for single dimension arrays.
14689
14690 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14691
14692         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14693         an error.  This removes the lookup from the critical path.
14694
14695         * cs-parser.jay: Removed use of temporary_loc, which is completely
14696         broken. 
14697
14698 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14699
14700         * support.cs (ReflectionParameters.ParameterModifier): Report
14701         whether the argument is a PARAMS argument or not.
14702
14703         * class.cs: Set the attribute `ParamArrayAttribute' on the
14704         parameter argument.
14705
14706         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14707         and cons_param_array_attribute (ConstructorInfo for
14708         ParamArrayAttribute)., 
14709
14710         * codegen.cs: Emit the return using the `Return' statement, that
14711         way we can report the error correctly for missing return values. 
14712
14713         * class.cs (Method.Emit): Clean up.
14714
14715         * expression.cs (Argument.Resolve): Take another argument: the
14716         location where this argument is used.  Notice that this is not
14717         part of the "Argument" class as to reduce the size of the
14718         structure (we know the approximate location anyways).
14719
14720         Test if the argument is a variable-reference, if not, then
14721         complain with a 206.
14722
14723         (Argument.Emit): Emit addresses of variables.
14724
14725         (Argument.FullDesc): Simplify.
14726
14727         (Invocation.DoResolve): Update for Argument.Resolve.
14728
14729         (ElementAccess.DoResolve): ditto.
14730
14731         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14732         method should be virtual, as this method is always virtual.
14733
14734         (NewDelegate.DoResolve): Update for Argument.Resolve.
14735
14736         * class.cs (ConstructorInitializer.DoResolve): ditto.
14737
14738         * attribute.cs (Attribute.Resolve): ditto.
14739
14740 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14741
14742         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14743
14744         * expression.cs (ParameterReference): Drop IStackStorage and implement
14745         IAssignMethod instead. 
14746
14747         (LocalVariableReference): ditto.
14748
14749         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14750         IAssignMethod instead. 
14751
14752 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14753
14754         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14755         enumerations that are used in heavily used structures derive from
14756         byte in a laughable and pathetic attempt to reduce memory usage.
14757         This is the kind of pre-optimzations that you should not do at
14758         home without adult supervision.
14759
14760         * expression.cs (UnaryMutator): New class, used to handle ++ and
14761         -- separatedly from the other unary operators.  Cleans up the
14762         code, and kills the ExpressionStatement dependency in Unary.
14763
14764         (Unary): Removed `method' and `Arguments' from this class, making
14765         it smaller, and moving it all to SimpleCall, so I can reuse this
14766         code in other locations and avoid creating a lot of transient data
14767         strucutres when not required.
14768
14769         * cs-parser.jay: Adjust for new changes.
14770
14771 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14772
14773         * enum.cs (Enum.Populate): If there is a failure during
14774         definition, return
14775
14776         * cs-parser.jay (opt_enum_base): we used to catch type errors
14777         here, but this is really incorrect.  The type error should be
14778         catched during semantic analysis.
14779
14780 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14781
14782         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14783         current_local_parameters as expected since I, in my stupidity, had forgotten
14784         to do this :-)
14785
14786         * attribute.cs (GetValidPlaces): Fix stupid bug.
14787
14788         * class.cs (Method::Emit): Perform check on applicability of attributes.
14789
14790         (Constructor::Emit): Ditto.
14791
14792         (Field::Emit): Ditto.
14793
14794         (Field.Location): Store location information.
14795
14796         (Property, Event, Indexer, Operator): Ditto.
14797
14798         * cs-parser.jay (field_declaration): Pass in location for each field.
14799
14800         * ../errors/cs0592.cs : Add.
14801
14802 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14803
14804         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14805
14806         (InitCoreTypes): Update accordingly.
14807
14808         (RegisterAttrType, LookupAttr): Implement.
14809
14810         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14811         info about the same.
14812
14813         (Resolve): Update to populate the above as necessary.
14814
14815         (Error592): Helper.
14816
14817         (GetValidPlaces): Helper to the above.
14818
14819         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14820
14821         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14822
14823 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14824
14825         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14826
14827         * ../errors/cs0617.cs : Add.
14828
14829 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14830
14831         * enum.cs (Emit): Rename to Populate to be more consistent with what
14832         we expect it to do and when exactly it is called.
14833
14834         * class.cs, rootcontext.cs : Update accordingly.
14835
14836         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14837         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14838
14839         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14840
14841         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14842         of a fieldinfo using the above, when dealing with a FieldBuilder.
14843
14844 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14845
14846         * ../errors/cs0031.cs : Add.
14847
14848         * ../errors/cs1008.cs : Add.
14849
14850         * ../errrors/cs0543.cs : Add.
14851
14852         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14853         enum type.
14854
14855         (FindMembers): Implement.
14856
14857         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14858         enums and delegates too.
14859
14860         (enum_types): Rename to builder_to_enum.
14861
14862         (delegate_types): Rename to builder_to_delegate.
14863
14864         * delegate.cs (FindMembers): Implement.
14865
14866 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14867
14868         * typemanager.cs (IsEnumType): Implement.
14869
14870         * enum.cs (Emit): Re-write parts to account for the underlying type
14871         better and perform checking etc.
14872
14873         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14874         of the underlying type.
14875
14876         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14877         value
14878
14879         * enum.cs (error31): Helper to report error #31.
14880
14881         * cs-parser.jay (enum_declaration): Store location of each member too.
14882
14883         * enum.cs (member_to_location): New hashtable. 
14884
14885         (AddEnumMember): Update location hashtable.
14886
14887         (Emit): Use the location of each member while reporting errors.
14888
14889 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14890
14891         * cs-parser.jay: A for_initializer if is a
14892         local_variable_declaration really ammount to have an implicit
14893         block with the variable declaration and no initializer for for.
14894
14895         * statement.cs (For.Emit): Cope with null initializers.
14896
14897         This fixes the infinite loop on for initializers.
14898
14899 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14900
14901         * enum.cs: More cleanup.
14902
14903         * ecore.cs: Remove dead code.
14904
14905         * class.cs (Property.Emit): More simplification.
14906         (Event.Emit): ditto.
14907
14908         Reworked to have less levels of indentation.
14909
14910 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14911
14912         * class.cs (Property): Emit attributes.
14913
14914         (Field): Ditto.
14915
14916         (Event): Ditto.
14917
14918         (Indexer): Ditto.
14919
14920         (Operator): Ditto.
14921
14922         * enum.cs (Emit): Ditto.
14923
14924         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14925         Enums too.
14926
14927         * class.cs (Field, Event, etc.): Move attribute generation into the
14928         Emit method everywhere.
14929
14930         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14931         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14932         as we had no way of defining nested enums !
14933
14934         * rootcontext.cs : Adjust code accordingly.
14935
14936         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14937
14938 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14939
14940         * expression.cs (EvalConstantExpression): Move into ecore.cs
14941
14942         * enum.cs (Enum): Rename some members and make them public and readonly
14943         according to our convention.
14944
14945         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14946         nothing else.
14947
14948         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14949
14950         (Enum::Emit): Write a simple version for now which doesn't try to compute
14951         expressions. I shall modify this to be more robust in just a while.
14952
14953         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14954
14955         (TypeContainer::CloseType): Create the Enum types too.
14956
14957         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14958
14959         * expression.cs (EvalConstantExpression): Get rid of completely.
14960
14961         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14962         user-defined values and other cases.
14963
14964         (IsValidEnumLiteral): Helper function.
14965
14966         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14967         out there in the case we had a literal FieldExpr.
14968
14969         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14970
14971         (Literalize): Revamp a bit to take two arguments.
14972
14973         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14974
14975 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14976
14977         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14978
14979         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14980
14981         (Resolve): Use the above to ensure we have proper initializers.
14982
14983 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14984
14985         * expression.cs (Expression::EvalConstantExpression): New method to 
14986         evaluate constant expressions.
14987
14988         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14989
14990 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14991
14992         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14993         in an array.
14994
14995         (Binary.ResolveOperator): Handle operator != (object a, object b)
14996         and operator == (object a, object b);
14997
14998         (Binary.DoNumericPromotions): Indicate whether the numeric
14999         promotion was possible.
15000
15001         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15002         Implement.  
15003
15004         Made the ArrayAccess implement interface IAssignMethod instead of
15005         IStackStore as the order in which arguments are passed reflects
15006         this.
15007
15008         * assign.cs: Instead of using expr.ExprClass to select the way of
15009         assinging, probe for the IStackStore/IAssignMethod interfaces.
15010
15011         * typemanager.cs: Load InitializeArray definition.
15012
15013         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15014         static data that can be used to initialize arrays. 
15015
15016 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15017
15018         * expression.cs: Handle operator== and operator!= for booleans.
15019
15020         (Conditioal.Reduce): Implement reducer for the ?: operator.
15021
15022         (Conditional.Resolve): Implement dead code elimination.
15023
15024         (Binary.Resolve): Catch string literals and return a new
15025         concatenated string.
15026
15027         (Unary.Reduce): Implement reduction of unary expressions.
15028
15029         * ecore.cs: Split out the expression core handling here.
15030
15031         (Expression.Reduce): New method used to perform constant folding
15032         and CSE.  This is needed to support constant-expressions. 
15033
15034         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15035         targets, and optimize for !x.
15036
15037 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15038
15039         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15040         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15041         set custom atttributes.
15042
15043         * literal.cs (Literal::GetValue): New abstract method to return the actual
15044         value of the literal, cast as an object.
15045
15046         (*Literal): Implement GetValue method.
15047
15048         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15049         expressions to the arraylist but objects of type Argument.
15050
15051         * class.cs (TypeContainer::Emit): Emit our attributes too.
15052
15053         (Method::Emit, Constructor::Emit): Ditto.
15054
15055         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15056         to be ignoring earlier.
15057
15058 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15059
15060         * attribute.cs (AttributeSection::Define): Implement to do the business
15061         of constructing a CustomAttributeBuilder.
15062
15063         (Attribute): New trivial class. Increases readability of code.  
15064
15065         * cs-parser.jay : Update accordingly.
15066
15067         (positional_argument_list, named_argument_list, named_argument): New rules
15068
15069         (attribute_arguments): Use the above so that we are more correct.
15070
15071 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15072
15073         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15074         to perform all checks for a method with a params parameter.
15075
15076         (Invocation::OverloadResolve): Update to use the above method and therefore
15077         cope correctly with params method invocations.
15078
15079         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15080         params too.
15081
15082         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15083         constructors in our parent too because we can't afford to miss out on 
15084         protected ones ;-)
15085
15086         * attribute.cs (AttributeSection): New name for the class Attribute
15087
15088         Other trivial changes to improve readability.
15089
15090         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15091         use the new class names.
15092
15093 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15094
15095         * class.cs (Method::Define): Complete definition for params types too
15096
15097         (Indexer::Define): Ditto.
15098
15099         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15100         Cope everywhere with a request for info about the array parameter.
15101
15102 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15103
15104         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15105
15106         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15107         local_variable_type to extract the string corresponding to the type.
15108
15109         (local_variable_type): Fixup the action to use the new helper method.
15110
15111         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15112         go.
15113
15114         * expression.cs : Clean out code which uses the above.
15115
15116 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15117
15118         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15119         and bale out if necessary by returning a false.
15120
15121         (RegisterProperty): Ditto.
15122
15123         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15124         and print out appropriate error messages.
15125
15126         * interface.cs (everywhere): Ditto.
15127
15128         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15129         location to constructor.
15130
15131         * class.cs (Property, Event, Indexer): Update accordingly.
15132
15133         * ../errors/cs111.cs : Added.
15134
15135         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15136         of a method, as laid down by the spec.
15137
15138         (Invocation::OverloadResolve): Use the above method.
15139
15140 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15141
15142         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15143         now take a TypeContainer and a Parameters object.
15144
15145         (ParameterData): Modify return type of ParameterModifier method to be 
15146         Parameter.Modifier and not a string.
15147
15148         (ReflectionParameters, InternalParameters): Update accordingly.
15149
15150         * expression.cs (Argument::GetParameterModifier): Same here.
15151
15152         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15153         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15154         symbol in it at all so maybe this is only for now.
15155
15156 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15157
15158         * support.cs (InternalParameters): Constructor now takes an extra argument 
15159         which is the actual Parameters class.
15160
15161         (ParameterDesc): Update to provide info on ref/out modifiers.
15162
15163         * class.cs (everywhere): Update call to InternalParameters to pass in
15164         the second argument too.
15165
15166         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15167         to return the modifier info [ref/out etc]
15168
15169         (InternalParameters, ReflectionParameters): Implement the above.
15170
15171         * expression.cs (Argument::ParameterModifier): Similar function to return
15172         info about the argument's modifiers.
15173
15174         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15175         too.
15176
15177         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15178         a new SetFormalParameters object which we pass to InternalParameters.
15179
15180 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15181
15182         * expression.cs (NewArray): Merge into the ArrayCreation class.
15183
15184 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15185
15186         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15187         NewUserdefinedArray into one as there wasn't much of a use in having
15188         two separate ones.
15189
15190         * expression.cs (Argument): Change field's name to ArgType from Type.
15191
15192         (Type): New readonly property which returns the proper type, taking into 
15193         account ref/out modifiers.
15194
15195         (everywhere): Adjust code accordingly for the above.
15196
15197         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15198         whether we are emitting for a ref or out parameter.
15199
15200         * expression.cs (Argument::Emit): Use the above field to set the state.
15201
15202         (LocalVariableReference::Emit): Update to honour the flag and emit the
15203         right stuff.
15204
15205         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15206
15207         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15208
15209         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15210
15211         (ReflectionParameters, InternalParameters): Implement the above method.
15212
15213         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15214         reporting errors.
15215
15216         (Invocation::FullMethodDesc): Ditto. 
15217
15218 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15219
15220         * cs-parser.jay: Add extra production for the second form of array
15221         creation. 
15222
15223         * expression.cs (ArrayCreation): Update to reflect the above
15224         change. 
15225
15226         * Small changes to prepare for Array initialization.
15227
15228 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15229
15230         * typemanager.cs (ImplementsInterface): interface might be null;
15231         Deal with this problem;
15232
15233         Also, we do store negative hits on the cache (null values), so use
15234         this instead of calling t.GetInterfaces on the type everytime.
15235
15236 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15237
15238         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15239
15240         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15241         split functionality out into different classes.
15242
15243         (New::FormArrayType): Move into NewBuiltinArray.
15244
15245         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15246         quite useless.
15247
15248         (NewBuiltinArray): New class to handle creation of built-in arrays.
15249
15250         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15251         account creation of one-dimensional arrays.
15252
15253         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15254
15255         (NewUserdefinedArray::DoResolve): Implement.
15256
15257         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15258
15259         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15260         we maintain inside the TypeManager. This is necessary to perform lookups on the
15261         module builder.
15262
15263         (LookupType): Update to perform GetType on the module builders too.     
15264
15265         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15266
15267         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15268
15269 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15270
15271         * expression.cs (New::DoResolve): Implement guts of array creation.
15272
15273         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15274
15275 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15276
15277         * expression.cs: Fix bug I introduced lsat night that broke
15278         Delegates. 
15279
15280         (Expression.Resolve): Report a 246 error (can not resolve name)
15281         if we find a SimpleName in the stream.
15282
15283         (Expression.ResolveLValue): Ditto.
15284
15285         (Expression.ResolveWithSimpleName): This function is a variant of
15286         ResolveName, this one allows SimpleNames to be returned without a
15287         warning.  The only consumer of SimpleNames is MemberAccess
15288
15289 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15290
15291         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15292         might arrive here.  I have my doubts that this is correct.
15293
15294         * statement.cs (Lock): Implement lock statement.
15295
15296         * cs-parser.jay: Small fixes to support `lock' and `using'
15297
15298         * cs-tokenizer.cs: Remove extra space
15299
15300         * driver.cs: New flag --checked, allows to turn on integer math
15301         checking. 
15302
15303         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15304         Threading.Monitor.Exit 
15305
15306 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15307
15308         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15309         Expression Class to be IndexerAccess.
15310
15311         Notice that Indexer::DoResolve sets the eclass to Value.
15312
15313 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15314
15315         * class.cs (TypeContainer::Emit): Emit code for indexers.
15316
15317         * assign.cs (IAssignMethod): New interface implemented by Indexers
15318         and Properties for handling assignment.
15319
15320         (Assign::Emit): Simplify and reuse code. 
15321
15322         * expression.cs (IndexerAccess, PropertyExpr): Implement
15323         IAssignMethod, clean up old code. 
15324
15325 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15326
15327         * typemanager.cs (ImplementsInterface): New method to determine if a type
15328         implements a given interface. Provides a nice cache too.
15329
15330         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15331         method.
15332
15333         (ConvertReferenceExplicit): Ditto.
15334
15335         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15336         various methods, with correct names etc.
15337
15338         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15339         Operator.UnaryNegation.
15340
15341         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15342         we have a unary plus or minus operator.
15343
15344         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15345         UnaryMinus.
15346
15347         * everywhere : update accordingly.
15348
15349         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15350         respectively.
15351
15352         * class.cs (Method::Define): For the case where we are implementing a method
15353         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15354         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15355
15356 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15357
15358         * interface.cs (FindMembers): Implement to work around S.R.E
15359         lameness.
15360
15361         * typemanager.cs (IsInterfaceType): Implement.
15362
15363         (FindMembers): Update to handle interface types too.
15364
15365         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15366         use IsAssignableFrom as that is not correct - it doesn't work.
15367
15368         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15369         and accordingly override EmitStatement.
15370
15371         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15372         using the correct logic :-)
15373
15374 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15375
15376         * ../errors/cs-11.cs : Add to demonstrate error -11 
15377
15378 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15379
15380         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15381         then pass this as a hint to ResolveLValue.
15382
15383         * expression.cs (FieldExpr): Add Location information
15384
15385         (FieldExpr::LValueResolve): Report assignment to readonly
15386         variable. 
15387
15388         (Expression::ExprClassFromMemberInfo): Pass location information.
15389
15390         (Expression::ResolveLValue): Add new method that resolves an
15391         LValue. 
15392
15393         (Expression::DoResolveLValue): Default invocation calls
15394         DoResolve. 
15395
15396         (Indexers): New class used to keep track of indexers in a given
15397         Type. 
15398
15399         (IStackStore): Renamed from LValue, as it did not really describe
15400         what this did.  Also ResolveLValue is gone from this interface and
15401         now is part of Expression.
15402
15403         (ElementAccess): Depending on the element access type
15404
15405         * typemanager.cs: Add `indexer_name_type' as a Core type
15406         (System.Runtime.CompilerServices.IndexerNameAttribute)
15407
15408         * statement.cs (Goto): Take a location.
15409
15410 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15411
15412         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15413         if two delegates are compatible.
15414
15415         (NewDelegate::DoResolve): Update to take care of the case when
15416         we instantiate a delegate from another delegate.
15417
15418         * typemanager.cs (FindMembers): Don't even try to look up members
15419         of Delegate types for now.
15420
15421 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15422
15423         * delegate.cs (NewDelegate): New class to take care of delegate
15424         instantiation.
15425
15426         * expression.cs (New): Split the delegate related code out into 
15427         the NewDelegate class.
15428
15429         * delegate.cs (DelegateInvocation): New class to handle delegate 
15430         invocation.
15431
15432         * expression.cs (Invocation): Split out delegate related code into
15433         the DelegateInvocation class.
15434
15435 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15436
15437         * expression.cs (New::DoResolve): Implement delegate creation fully
15438         and according to the spec.
15439
15440         (New::DoEmit): Update to handle delegates differently.
15441
15442         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15443         because of which we were printing out arguments in reverse order !
15444
15445         * delegate.cs (VerifyMethod): Implement to check if the given method
15446         matches the delegate.
15447
15448         (FullDelegateDesc): Implement.
15449
15450         (VerifyApplicability): Implement.
15451
15452         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15453         delegate invocations too.
15454
15455         (Invocation::Emit): Ditto.
15456
15457         * ../errors/cs1593.cs : Added.
15458
15459         * ../errors/cs1594.cs : Added.
15460
15461         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15462
15463 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15464
15465         * typemanager.cs (intptr_type): Core type for System.IntPtr
15466
15467         (InitCoreTypes): Update for the same.
15468
15469         (iasyncresult_type, asynccallback_type): Ditto.
15470
15471         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15472         correct.
15473
15474         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15475         too.
15476
15477         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15478         the builders for the 4 members of a delegate type :-)
15479
15480         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15481         type.
15482
15483         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15484
15485         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15486
15487 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15488
15489         * statement.cs (Break::Emit): Implement.   
15490         (Continue::Emit): Implement.
15491
15492         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15493         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15494         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15495         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15496         end loop
15497
15498         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15499         properties that track the label for the current loop (begin of the
15500         loop and end of the loop).
15501
15502 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15503
15504         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15505         use of emitting anything at all.
15506
15507         * class.cs, rootcontext.cs : Get rid of calls to the same.
15508
15509         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15510
15511         (Populate): Define the constructor correctly and set the implementation
15512         attributes.
15513
15514         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15515         have been defined.
15516
15517         (AddDelegateType): Implement.
15518
15519         (IsDelegateType): Implement helper method.
15520
15521         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15522
15523         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15524         and accordingly handle it.
15525
15526         * delegate.cs (Populate): Take TypeContainer argument.
15527         Implement bits to define the Invoke method. However, I still haven't figured out
15528         how to take care of the native int bit :-(
15529
15530         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15531         Qualify the name of the delegate, not its return type !
15532
15533         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15534         conversion.
15535
15536         (StandardConversionExists): Checking for array types turns out to be recursive.
15537
15538         (ConvertReferenceExplicit): Implement array conversion.
15539
15540         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15541
15542 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15543
15544         * cs-parser.jay (delegate_declaration): Store the fully qualified
15545         name as it is a type declaration.
15546
15547         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15548         readonly.
15549
15550         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15551         as TypeContainer::DefineType.
15552
15553         (Populate): Method in which all the definition of the various methods (Invoke)
15554         etc is done.
15555
15556         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15557         see.
15558
15559         (CloseDelegate): Finally creates the delegate.
15560
15561         * class.cs (TypeContainer::DefineType): Update to define delegates.
15562         (Populate, Emit and CloseType): Do the same thing here too.
15563
15564         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15565         delegates in all these operations.
15566
15567 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15568
15569         * expression.cs: LocalTemporary: a new expression used to
15570         reference a temporary that has been created.
15571
15572         * assign.cs: Handle PropertyAccess back here, so that we can
15573         provide the proper semantic access to properties.
15574
15575         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15576         a few more explicit conversions. 
15577
15578         * modifiers.cs: `NEW' modifier maps to HideBySig.
15579
15580         * expression.cs (PropertyExpr): Make this into an
15581         ExpressionStatement, and support the EmitStatement code path. 
15582
15583         Perform get/set error checking, clean up the interface.
15584
15585         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15586         them into toplevel access objects.
15587
15588 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15589
15590         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15591         SRE.
15592
15593         * typemanager.cs: Keep track here of our PropertyBuilders again to
15594         work around lameness in SRE.
15595
15596 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15597
15598         * expression.cs (LValue::LValueResolve): New method in the
15599         interface, used to perform a second resolution pass for LValues. 
15600
15601         (This::DoResolve): Catch the use of this in static methods.
15602
15603         (This::LValueResolve): Implement.
15604
15605         (This::Store): Remove warning, assigning to `this' in structures
15606         is 
15607
15608         (Invocation::Emit): Deal with invocation of
15609         methods on value types.  We need to pass the address to structure
15610         methods rather than the object itself.  (The equivalent code to
15611         emit "this" for structures leaves the entire structure on the
15612         stack instead of a pointer to it). 
15613
15614         (ParameterReference::DoResolve): Compute the real index for the
15615         argument based on whether the method takes or not a `this' pointer
15616         (ie, the method is static).
15617
15618         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15619         value types returned from functions when we need to invoke a
15620         method on the sturcture.
15621
15622
15623 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15624
15625         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15626         defining the type in the Modulebuilder or Typebuilder. This is to take
15627         care of nested types which need to be defined on the TypeBuilder using
15628         DefineNestedMethod.
15629
15630         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15631         methods in RootContext, only ported to be part of TypeContainer.
15632
15633         (TypeContainer::GetInterfaceOrClass): Ditto.
15634
15635         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15636
15637         * interface.cs (Interface::DefineInterface): New method. Does exactly
15638         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15639         too.
15640
15641         (Interface::GetInterfaces): Move from RootContext here and port.
15642
15643         (Interface::GetInterfaceByName): Same here.
15644
15645         * rootcontext.cs (ResolveTree): Re-write.
15646
15647         (PopulateTypes): Re-write.
15648
15649         * class.cs (TypeContainer::Populate): Populate nested types too.
15650         (TypeContainer::Emit): Emit nested members too.
15651
15652         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15653         instead just use the name argument passed in as it is already fully
15654         qualified.
15655
15656         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15657         to TypeContainer mapping to see if a type is user-defined.
15658
15659         * class.cs (TypeContainer::CloseType): Implement. 
15660
15661         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15662         the default constructor.
15663
15664         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15665         twice.
15666
15667         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15668
15669         * interface.cs (CloseType): Create the type here.
15670
15671         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15672         the hierarchy.
15673
15674         Remove all the methods which are now in TypeContainer.
15675
15676 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15677
15678         * delegate.cs (Define): Re-write bits to define the delegate
15679         correctly.
15680
15681 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15682
15683         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15684
15685         * expression.cs (ImplicitReferenceConversion): handle null as well
15686         as a source to convert to any reference type.
15687
15688         * statement.cs (Return): Perform any implicit conversions to
15689         expected return type.  
15690
15691         Validate use of return statement.  
15692
15693         * codegen.cs (EmitContext): Pass the expected return type here.
15694
15695         * class.cs (Method, Constructor, Property): Pass expected return
15696         type to EmitContext.
15697
15698 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15699
15700         * expression.cs: Make DoResolve take an EmitContext instead of a
15701         TypeContainer.
15702
15703         Replaced `l' and `location' for `loc', for consistency.
15704
15705         (Error, Warning): Remove unneeded Tc argument.
15706
15707         * assign.cs, literal.cs, constant.cs: Update to new calling
15708         convention. 
15709
15710         * codegen.cs: EmitContext now contains a flag indicating whether
15711         code is being generated in a static method or not.
15712
15713         * cs-parser.jay: DecomposeQI, new function that replaces the old
15714         QualifiedIdentifier.  Now we always decompose the assembled
15715         strings from qualified_identifier productions into a group of
15716         memberaccesses.
15717
15718 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15719
15720         * rootcontext.cs: Deal with field-less struct types correctly now
15721         by passing the size option to Define Type.
15722
15723         * class.cs: Removed hack that created one static field. 
15724
15725 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15726
15727         * statement.cs: Moved most of the code generation here. 
15728
15729 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15730
15731         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15732         seem very right.
15733
15734         (ElementAccess): Remove useless bits for now - keep checks as the spec
15735         says.
15736
15737 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15738
15739         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15740         and start performing checks according to the spec.
15741
15742 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15743
15744         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15745         rank_specifiers instead.
15746
15747         (rank_specifiers): Change the order in which the rank specifiers are stored
15748
15749         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15750
15751         * expression.cs (ElementAccess): Implement the LValue interface too.
15752
15753 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15754
15755         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15756         except that user defined conversions are not included.
15757
15758         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15759         perform the conversion of the return type, if necessary.
15760
15761         (New::DoResolve): Check whether we are creating an array or an object
15762         and accordingly do the needful.
15763
15764         (New::Emit): Same here.
15765
15766         (New::DoResolve): Implement guts of array creation.
15767
15768         (New::FormLookupType): Helper function.
15769
15770 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15771
15772         * codegen.cs: Removed most of the code generation here, and move the
15773         corresponding code generation bits to the statement classes. 
15774
15775         Added support for try/catch/finalize and throw.
15776
15777         * cs-parser.jay: Added support for try/catch/finalize.
15778
15779         * class.cs: Catch static methods having the flags override,
15780         virtual or abstract.
15781
15782         * expression.cs (UserCast): This user cast was not really doing
15783         what it was supposed to do.  Which is to be born in fully resolved
15784         state.  Parts of the resolution were being performed at Emit time! 
15785
15786         Fixed this code.
15787
15788 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15789
15790         * expression.cs: Implicity convert the result from UserCast.
15791
15792 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15793
15794         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15795         prevented it from working correctly. 
15796
15797         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15798         merely ConvertImplicit.
15799
15800 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15801
15802         * typemanager.cs: Make the LookupTypeContainer function static,
15803         and not per-instance.  
15804
15805         * class.cs: Make static FindMembers (the one that takes a Type
15806         argument). 
15807
15808         * codegen.cs: Add EmitForeach here.
15809
15810         * cs-parser.jay: Make foreach a toplevel object instead of the
15811         inline expansion, as we need to perform semantic analysis on it. 
15812
15813 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15814
15815         * expression.cs (Expression::ImplicitUserConversion): Rename to
15816         UserDefinedConversion.
15817
15818         (Expression::UserDefinedConversion): Take an extra argument specifying 
15819         whether we look for explicit user conversions too.
15820
15821         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15822
15823         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15824
15825         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15826         with the appropriate arguments.
15827
15828         * cs-parser.jay (cast_expression): Record location too.
15829
15830         * expression.cs (Cast): Record location info.
15831
15832         (Expression::ConvertExplicit): Take location argument.
15833
15834         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15835         to determine if we are doing explicit conversions.
15836
15837         (UserCast::Emit): Update accordingly.
15838
15839         (Expression::ConvertExplicit): Report an error if everything fails.
15840
15841         * ../errors/cs0030.cs : Add.
15842
15843 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15844
15845         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15846         virtual and newslot bits. 
15847
15848         * class.cs (TypeContainer::RegisterRequiredImplementations):
15849         Record methods we need.
15850
15851         (TypeContainer::MakeKey): Helper function to make keys for
15852         MethodBases, since the Methodbase key is useless.
15853
15854         (TypeContainer::Populate): Call RegisterRequiredImplementations
15855         before defining the methods.   
15856
15857         Create a mapping for method_builders_to_methods ahead of time
15858         instead of inside a tight loop.
15859
15860         (::RequireMethods):  Accept an object as the data to set into the
15861         hashtable so we can report interface vs abstract method mismatch.
15862
15863 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15864
15865         * report.cs: Make all of it static.
15866
15867         * rootcontext.cs: Drop object_type and value_type computations, as
15868         we have those in the TypeManager anyways.
15869
15870         Drop report instance variable too, now it is a global.
15871
15872         * driver.cs: Use try/catch on command line handling.
15873
15874         Add --probe option to debug the error reporting system with a test
15875         suite. 
15876
15877         * report.cs: Add support for exiting program when a probe
15878         condition is reached.
15879
15880 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15881
15882         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15883         we do a forcible conversion regardless of type, to check if 
15884         ForceConversion returns a null.
15885
15886         (Binary::error19): Use location to report error.
15887
15888         (Unary::error23): Use location here too.
15889
15890         * ../errors/cs0019.cs : Check in.
15891
15892         * ../errors/cs0023.cs : Check in.
15893
15894         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15895         case of a non-null MethodInfo object with a length of 0 !
15896
15897         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15898         an applicable member - according to the spec :-)
15899         Also fix logic to find members in base types.
15900
15901         (Unary::ResolveOperator): Same here.
15902
15903         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15904         as I was getting thoroughly confused between this and error19 :-)
15905
15906         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15907         (::FindMostEncompassedType): Implement.
15908         (::FindMostEncompassingType): Implement.
15909         (::StandardConversionExists): Implement.
15910
15911         (UserImplicitCast): Re-vamp. We now need info about most specific
15912         source and target types so that we can do the necessary conversions.
15913
15914         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15915         mathematical union with no duplicates.
15916
15917 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15918
15919         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15920         in order from base classes to child classes, so that we can in
15921         child classes look up in our parent for method names and
15922         attributes (required for handling abstract, virtual, new, override
15923         constructs: we need to instrospect our base class, and if we dont
15924         populate the classes in order, the introspection might be
15925         incorrect.  For example, a method could query its parent before
15926         the parent has any methods and would determine that the parent has
15927         no abstract methods (while it could have had them)).
15928
15929         (RootContext::CreateType): Record the order in which we define the
15930         classes.
15931
15932 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15933
15934         * class.cs (TypeContainer::Populate): Also method definitions can
15935         fail now, keep track of this.
15936
15937         (TypeContainer::FindMembers): Implement support for
15938         DeclaredOnly/noDeclaredOnly flag.
15939
15940         (Constructor::Emit) Return the ConstructorBuilder.
15941
15942         (Method::Emit) Return the MethodBuilder. 
15943         Check for abstract or virtual methods to be public.
15944
15945         * rootcontext.cs (RootContext::CreateType): Register all the
15946         abstract methods required for the class to be complete and the
15947         interface methods that must be implemented. 
15948
15949         * cs-parser.jay: Report error 501 (method requires body if it is
15950         not marked abstract or extern).
15951
15952         * expression.cs (TypeOf::Emit): Implement.
15953
15954         * typemanager.cs: runtime_handle_type, new global type.
15955
15956         * class.cs (Property::Emit): Generate code for properties.
15957
15958 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15959
15960         * expression.cs (Unary::ResolveOperator): Find operators on base type
15961         too - we now conform exactly to the spec.
15962
15963         (Binary::ResolveOperator): Same here.
15964
15965         * class.cs (Operator::Define): Fix minor quirk in the tests.
15966
15967         * ../errors/cs0215.cs : Added.
15968
15969         * ../errors/cs0556.cs : Added.
15970
15971         * ../errors/cs0555.cs : Added.
15972
15973 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15974
15975         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15976         single integer which is really efficient
15977
15978 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15979
15980         *  expression.cs (Expression::ImplicitUserConversion): Use location
15981         even in the case when we are examining True operators.
15982  
15983         * class.cs (Operator::Define): Perform extensive checks to conform
15984         with the rules for operator overloading in the spec.
15985
15986         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15987         some of the other conversions mentioned in the spec.
15988
15989         * typemanager.cs (array_type): New static member for the System.Array built-in
15990         type.
15991
15992         (cloneable_interface): For System.ICloneable interface.
15993
15994         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15995         we start resolving the tree and populating types.
15996
15997         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15998  
15999 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16000
16001         * expression.cs (Expression::ExprClassFromMemberInfo,
16002         Expression::Literalize): Create literal expressions from
16003         FieldInfos which are literals.
16004
16005         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16006         type casts, because they were wrong.  The test suite in tests
16007         caught these ones.
16008
16009         (ImplicitNumericConversion): ushort to ulong requires a widening
16010         cast. 
16011
16012         Int32 constant to long requires widening cast as well.
16013
16014         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16015         for integers because the type on the stack is not i4.
16016
16017 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16018
16019         * expression.cs (report118): require location argument. 
16020
16021         * parameter.cs: Do not dereference potential null value.
16022
16023         * class.cs: Catch methods that lack the `new' keyword when
16024         overriding a name.  Report warnings when `new' is used without
16025         anything being there to override.
16026
16027         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16028
16029         * class.cs: Only add constructor to hashtable if it is non-null
16030         (as now constructors can fail on define).
16031
16032         (TypeManager, Class, Struct): Take location arguments.
16033
16034         Catch field instance initialization in structs as errors.
16035
16036         accepting_filter: a new filter for FindMembers that is static so
16037         that we dont create an instance per invocation.
16038
16039         (Constructor::Define): Catch errors where a struct constructor is
16040         parameterless 
16041
16042         * cs-parser.jay: Pass location information for various new
16043         constructs. 
16044
16045         * delegate.cs (Delegate): take a location argument.
16046
16047         * driver.cs: Do not call EmitCode if there were problesm in the
16048         Definition of the types, as many Builders wont be there. 
16049
16050         * decl.cs (Decl::Decl): Require a location argument.
16051
16052         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16053         into integers, and find the most appropiate integer for it.
16054
16055         * literal.cs: Implement ULongLiteral.
16056
16057         * rootcontext.cs: Provide better information about the location of
16058         failure when CreateType fails.
16059
16060 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16061
16062         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16063         as well.
16064
16065         * expression.cs (Binary::CheckShiftArguments): Add missing type
16066         computation.
16067         (Binary::ResolveOperator): Add type to the logical and and logical
16068         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16069         before.
16070
16071         (Binary::DoNumericPromotions): In the case where either argument
16072         is ulong (and most signed types combined with ulong cause an
16073         error) perform implicit integer constant conversions as well.
16074
16075 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16076
16077         * expression.cs (UserImplicitCast): Method should always be
16078         non-null. 
16079         (Invocation::BetterConversion): Simplified test for IntLiteral.
16080
16081         (Expression::ImplicitNumericConversion): Split this routine out.
16082         Put the code that performs implicit constant integer conversions
16083         here. 
16084
16085         (Expression::Resolve): Become a wrapper around DoResolve so we can
16086         check eclass and type being set after resolve.
16087
16088         (Invocation::Badness): Remove this dead function
16089
16090         (Binary::ResolveOperator): Do not compute the expensive argumnets
16091         unless we have a union for it.
16092
16093         (Probe::Emit): Is needs to do an isinst and then
16094         compare against null.
16095
16096         (::CanConvert): Added Location argument.  If the Location argument
16097         is null (Location.Null), then we do not report errors.  This is
16098         used by the `probe' mechanism of the Explicit conversion.  We do
16099         not want to generate an error for something that the user
16100         explicitly requested to be casted.  But the pipeline for an
16101         explicit cast first tests for potential implicit casts.
16102
16103         So for now, if the Location is null, it means `Probe only' to
16104         avoid adding another argument.   Might have to revise this
16105         strategy later.
16106
16107         (ClassCast): New class used to type cast objects into arbitrary
16108         classes (used in Explicit Reference Conversions).
16109
16110         Implement `as' as well.
16111
16112         Reverted all the patches from Ravi below: they were broken:
16113
16114                 * The use of `level' as a mechanism to stop recursive
16115                   invocations is wrong.  That was there just to catch the
16116                   bug with a strack trace but not as a way of addressing
16117                   the problem.
16118
16119                   To fix the problem we have to *understand* what is going
16120                   on and the interactions and come up with a plan, not
16121                   just get things going.
16122
16123                 * The use of the type conversion cache that I proposed
16124                   last night had an open topic: How does this work across
16125                   protection domains.  A user defined conversion might not
16126                   be public in the location where we are applying the
16127                   conversion, a different conversion might be selected
16128                   (ie, private A->B (better) but public B->A (worse),
16129                   inside A, A->B applies, but outside it, B->A will
16130                   apply).
16131
16132                 * On top of that (ie, even if the above is solved),
16133                   conversions in a cache need to be abstract.  Ie, `To
16134                   convert from an Int to a Short use an OpcodeCast', not
16135                   `To convert from an Int to a Short use the OpcodeCast on
16136                   the variable 5' (which is what this patch was doing).
16137
16138 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16139
16140         * expression.cs (Invocation::ConversionExists): Re-write to use
16141         the conversion cache
16142
16143         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16144         cache all conversions done, not just user-defined ones.
16145
16146         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16147         to determine if a conversion exists instead of acutually trying to 
16148         perform the conversion. It's faster too.
16149
16150         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16151         and only then attempt the implicit conversion.
16152
16153 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16154
16155         * expression.cs (ConvertImplicit): Use a cache for conversions
16156         already found. Check level of recursion and bail out if necessary.
16157
16158 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16159
16160         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16161         Export standard methods that we expect for string operations.
16162
16163         * statement.cs (Block::UsageWarning): Track usage of variables and
16164         report the errors for not used variables.
16165
16166         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16167         operator. 
16168
16169 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16170
16171         * codegen.cs: remove unnneded code 
16172
16173         * expression.cs: Removed BuiltinTypeAccess class
16174
16175         Fix the order in which implicit conversions are
16176         done.  
16177
16178         The previous fixed dropped support for boxed conversions (adding a
16179         test to the test suite now)
16180
16181         (UserImplicitCast::CanConvert): Remove test for source being null,
16182         that code is broken.  We should not feed a null to begin with, if
16183         we do, then we should track the bug where the problem originates
16184         and not try to cover it up here.
16185
16186         Return a resolved expression of type UserImplicitCast on success
16187         rather than true/false.  Ravi: this is what I was talking about,
16188         the pattern is to use a static method as a "constructor" for
16189         objects. 
16190
16191         Also, do not create arguments until the very last minute,
16192         otherwise we always create the arguments even for lookups that
16193         will never be performed. 
16194
16195         (UserImplicitCast::Resolve): Eliminate, objects of type
16196         UserImplicitCast are born in a fully resolved state. 
16197
16198         * typemanager.cs (InitCoreTypes): Init also value_type
16199         (System.ValueType). 
16200
16201         * expression.cs (Cast::Resolve): First resolve the child expression.
16202
16203         (LValue): Add new method AddressOf to be used by
16204         the `&' operator.  
16205
16206         Change the argument of Store to take an EmitContext instead of an
16207         ILGenerator, because things like FieldExpr need to be able to call
16208         their children expression to generate the instance code. 
16209
16210         (Expression::Error, Expression::Warning): Sugar functions for
16211         reporting errors.
16212
16213         (Expression::MemberLookup): Accept a TypeContainer instead of a
16214         Report as the first argument.
16215
16216         (Expression::ResolvePrimary): Killed.  I still want to improve
16217         this as currently the code is just not right.
16218
16219         (Expression::ResolveMemberAccess): Simplify, but it is still
16220         wrong. 
16221
16222         (Unary::Resolve): Catch errors in AddressOf operators.
16223
16224         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16225         index to a byte for the short-version, or the compiler will choose
16226         the wrong Emit call, which generates the wrong data.
16227
16228         (ParameterReference::Emit, ::Store): same.
16229
16230         (FieldExpr::AddressOf): Implement.
16231
16232         * typemanager.cs: TypeManager: made public variable instead of
16233         property.
16234
16235         * driver.cs: document --fatal.
16236
16237         * report.cs (ErrorMessage, WarningMessage): new names for the old
16238         Error and Warning classes.
16239
16240         * cs-parser.jay (member_access): Turn built-in access to types
16241         into a normal simplename
16242
16243 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16244
16245         * expression.cs (Invocation::BetterConversion): Fix to cope
16246         with q being null, since this was introducing a bug.
16247
16248         * expression.cs (ConvertImplicit): Do built-in conversions first.
16249
16250 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16251
16252         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16253
16254 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16255
16256         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16257         I had introduced long ago (what's new ?).
16258
16259         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16260         the work of all the checking. 
16261         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16262         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16263
16264         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16265         that is the right way. 
16266
16267         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16268         overloading resolution. Use everywhere instead of cutting and pasting code.
16269
16270         (Binary::ResolveOperator): Use MakeUnionSet.
16271
16272         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16273         we have to convert to bool types. Not complete yet.
16274
16275 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16276
16277         * typemanager.cs (TypeManager::CSharpName): support ushort.
16278
16279         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16280         to provide an expression that performsn an implicit constant int
16281         conversion (section 6.1.6).
16282         (Expression::ConvertImplicitRequired): Reworked to include
16283         implicit constant expression conversions.
16284
16285         (Expression::ConvertNumericExplicit): Finished.
16286
16287         (Invocation::Emit): If InstanceExpression is null, then it means
16288         that we perform a call on this.
16289
16290 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16291
16292         * expression.cs (Unary::Emit): Remove some dead code.
16293         (Probe): Implement Resolve and Emit for `is'.
16294         (Expression::ConvertImplicitRequired): Attempt to do constant
16295         expression conversions here.  Maybe should be moved to
16296         ConvertImplicit, but I am not sure.
16297         (Expression::ImplicitLongConstantConversionPossible,
16298         Expression::ImplicitIntConstantConversionPossible): New functions
16299         that tell whether is it possible to apply an implicit constant
16300         expression conversion.
16301
16302         (ConvertNumericExplicit): Started work on explicit numeric
16303         conversions.
16304
16305         * cs-parser.jay: Update operator constants.
16306
16307         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16308         (Parameters::GetSignature): Hook up VerifyArgs here.
16309         (Parameters::VerifyArgs): Verifies that no two arguments have the
16310         same name. 
16311
16312         * class.cs (Operator): Update the operator names to reflect the
16313         ones that the spec expects (as we are just stringizing the
16314         operator names).
16315
16316         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16317         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16318         previous usage did only work for our methods.
16319         (Expression::ConvertImplicit): Handle decimal implicit numeric
16320         conversions as well.
16321         (Expression::InternalTypeConstructor): Used to invoke constructors
16322         on internal types for default promotions.
16323
16324         (Unary::Emit): Implement special handling for the pre/post
16325         increment/decrement for overloaded operators, as they need to have
16326         the same semantics as the other operators.
16327
16328         (Binary::ResolveOperator): ditto.
16329         (Invocation::ConversionExists): ditto.
16330         (UserImplicitCast::Resolve): ditto.
16331
16332 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16333
16334         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16335         operator, return after emitting body. Regression tests pass again !
16336
16337         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16338         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16339         (Invocation::OverloadResolve): Ditto.
16340         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16341
16342         * everywhere : update calls to the above methods accordingly.
16343
16344 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16345
16346         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16347
16348         * expression.cs (ExpressionStatement): New base class used for
16349         expressions that can appear in statements, so that we can provide
16350         an alternate path to generate expression that do not leave a value
16351         on the stack.
16352
16353         (Expression::Emit, and all the derivatives): We no longer return
16354         whether a value is left on the stack or not.  Every expression
16355         after being emitted leaves a single value on the stack.
16356
16357         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16358         facilties of ExpressionStatement if possible.
16359
16360         * cs-parser.jay: Update statement_expression.
16361
16362 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16363
16364         * driver.cs: Change the wording of message
16365
16366 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16367
16368         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16369         the type of the expression to the return type of the method if
16370         we have an overloaded operator match ! The regression tests pass again !
16371         (Unary::ResolveOperator): Ditto.
16372
16373         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16374         to find "op_Implicit", not "implicit" ;-)
16375         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16376         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16377
16378         * everywhere : Correct calls to the above accordingly.
16379
16380         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16381         (ConvertImplicit): Do user-defined conversion if it exists.
16382
16383 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16384
16385         * assign.cs: track location.
16386         (Resolve): Use implicit conversions on assignment.
16387
16388         * literal.cs: Oops.  Not good, Emit of short access values should
16389         pass (Bytes) or the wrong argument will be selected.
16390
16391         * expression.cs (Unary::Emit): Emit code for -expr.
16392
16393         (Unary::ResolveOperator): Handle `Substract' for non-constants
16394         (substract from zero from the non-constants).
16395         Deal with Doubles as well. 
16396
16397         (Expression::ConvertImplicitRequired): New routine that reports an
16398         error if no implicit conversion exists. 
16399
16400         (Invocation::OverloadResolve): Store the converted implicit
16401         expressions if we make them
16402
16403 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16404
16405         * class.cs (ConstructorInitializer): Take a Location argument.
16406         (ConstructorBaseInitializer): Same here.
16407         (ConstructorThisInitializer): Same here.
16408
16409         * cs-parser.jay : Update all calls accordingly.
16410
16411         * expression.cs (Unary, Binary, New): Take location argument.
16412         Update accordingly everywhere.
16413
16414         * cs-parser.jay : Update all calls to the above to take a location
16415         argument.
16416
16417         * class.cs : Ditto.
16418
16419 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16420
16421         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16422         (Invocation::BetterConversion): Same here
16423         (Invocation::ConversionExists): Ditto.
16424
16425         (Invocation::ConversionExists): Implement.
16426
16427 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16428
16429         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16430         Also take an additional TypeContainer argument.
16431
16432         * All over : Pass in TypeContainer as argument to OverloadResolve.
16433
16434         * typemanager.cs (CSharpName): Update to check for the string type and return
16435         that too.
16436
16437         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16438         a given method.
16439
16440 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16441
16442         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16443         (Invocation::BetterFunction): Implement.
16444         (Invocation::BetterConversion): Implement.
16445         (Invocation::ConversionExists): Skeleton, no implementation yet.
16446
16447         Okay, things work fine !
16448
16449 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16450
16451         * typemanager.cs: declare and load enum_type, delegate_type and
16452         void_type. 
16453
16454         * expression.cs (Expression::Emit): Now emit returns a value that
16455         tells whether a value is left on the stack or not.  This strategy
16456         might be reveted tomorrow with a mechanism that would address
16457         multiple assignments.
16458         (Expression::report118): Utility routine to report mismatches on
16459         the ExprClass.
16460
16461         (Unary::Report23): Report impossible type/operator combination
16462         utility function.
16463
16464         (Unary::IsIncrementableNumber): Whether the type can be
16465         incremented or decremented with add.
16466         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16467         complemented. 
16468         (Unary::ResolveOperator): Implement ++, !, ~,
16469
16470         (Invocation::Emit): Deal with new Emit convetion.
16471
16472         * All Expression derivatives: Updated their Emit method to return
16473         whether they leave values on the stack or not.
16474
16475         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16476         stack for expressions that are statements. 
16477
16478 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16479
16480         * expression.cs (LValue): New interface.  Must be implemented by
16481         LValue objects.
16482         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16483         LValue interface.
16484
16485         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16486         interface for generating code, simplifies the code.
16487
16488 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16489
16490         * expression.cs (everywhere): Comment out return statements in ::Resolve
16491         methods to avoid the warnings.
16492
16493 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16494
16495         * driver.cs (parse): Report error 2001 if we can not open the
16496         source file.
16497
16498         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16499         not resolve it.
16500
16501         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16502         object. 
16503
16504         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16505         otherwise nested blocks end up with the same index.
16506
16507         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16508
16509         * expression.cs:  Instead of having FIXMEs in the Resolve
16510         functions, throw exceptions so it is obvious that we are facing a
16511         bug. 
16512
16513         * cs-parser.jay (invocation_expression): Pass Location information.
16514
16515         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16516         Use a basename for those routines because .NET does not like paths
16517         on them. 
16518
16519         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16520         already defined.
16521
16522 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16523
16524         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16525         are loading the correct data types (throws an exception if not).
16526         (TypeManager::InitCoreTypes): Use CoreLookupType
16527
16528         * expression.cs (Unary::ResolveOperator): return the child
16529         expression for expressions which are just +expr.
16530         (Unary::ResolveOperator): Return negative literals for -LITERAL
16531         expressions (otherwise they are Unary {Literal}).
16532         (Invocation::Badness): Take into account `Implicit constant
16533         expression conversions'.
16534
16535         * literal.cs (LongLiteral): Implement long literal class.
16536         (IntLiteral): export the `Value' of the intliteral. 
16537
16538 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16539
16540         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16541
16542         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16543         instead of 'Operator'
16544
16545         * expression.cs (Binary::ResolveOperator): Update accordingly.
16546         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16547         and 'Minus'
16548
16549         * cs-parser.jay (unary_expression): Update to use the new names.
16550
16551         * gen-treedump.cs (GetUnary): Same here.
16552
16553         * expression.cs (Unary::Resolve): Implement.
16554         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16555         operators are found instead of making noise ;-)
16556         (Unary::ResolveOperator): New method to do precisely the same thing which
16557         Binary::ResolveOperator does for Binary expressions.
16558         (Unary.method, .Arguments): Add.
16559         (Unary::OperName): Implement.   
16560         (Unary::ForceConversion): Copy and Paste !
16561
16562         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16563         a unary operator.
16564
16565         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16566         for the inbuilt operators. Only overloading works for now ;-)
16567
16568 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16569
16570         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16571         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16572
16573         * expression.cs (This::Emit): Implement. 
16574         (This::Resolve): Implement.
16575         (TypeOf:Resolve): Implement.
16576         (Expression::ResolveSimpleName): Add an implicit this to instance
16577         field references. 
16578         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16579         Bind instance variable to Field expressions.
16580         (FieldExpr::Instance): New field used to track the expression that
16581         represents the object instance.
16582         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16583         binding 
16584         (FieldExpr::Emit): Implement.
16585
16586         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16587         the last instruction contains a return opcode to avoid generating
16588         the last `ret' instruction (this generates correct code, and it is
16589         nice to pass the peverify output).
16590
16591         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16592         initializer for static and instance variables.
16593         (Constructor::Emit): Allow initializer to be null in the case of
16594         static constructors.  Only emit initializer for instance
16595         constructors. 
16596
16597         (TypeContainer::FindMembers): Return a null array if there are no
16598         matches.
16599
16600         Also fix the code for the MemberTypes.Method branch, as it was not
16601         scanning that for operators (or tried to access null variables before).
16602
16603         * assign.cs (Assign::Emit): Handle instance and static fields. 
16604
16605         * TODO: Updated.
16606
16607         * driver.cs: Stop compilation if there are parse errors.
16608
16609         * cs-parser.jay (constructor_declaration): Provide default base
16610         initializer for non-static constructors.
16611         (constructor_declarator): Do not provide a default base
16612         initializers if none was specified.
16613         Catch the fact that constructors should not have parameters.
16614
16615         * class.cs: Do not emit parent class initializers for static
16616         constructors, that should be flagged as an error.
16617
16618 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16619
16620         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16621         Move back code into TypeContainer::Populate.
16622
16623 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16624
16625         * class.cs (TypeContainer::AddConstructor): Fix the check to
16626         compare against Name, not Basename. 
16627         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16628
16629         * cs-parser.jay : Update accordingly.
16630
16631         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16632         for methods, don't forget to look into the operators too.
16633         (RegisterMethodBuilder): Helper method to take care of this for
16634         methods, constructors and operators.
16635         (Operator::Define): Completely revamp.
16636         (Operator.OperatorMethod, MethodName): New fields.
16637         (TypeContainer::Populate): Move the registering of builders into
16638         RegisterMethodBuilder.
16639         (Operator::Emit): Re-write.
16640
16641         * expression.cs (Binary::Emit): Comment out code path to emit method
16642         invocation stuff for the case when we have a user defined operator. I am
16643         just not able to get it right !
16644
16645 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16646
16647         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16648         argument. 
16649
16650         (Expression::MemberLookup): Provide a version that allows to
16651         specify the MemberTypes and BindingFlags. 
16652
16653         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16654         so it was not fetching variable information from outer blocks.
16655
16656         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16657         Beforefieldinit as it was buggy.
16658
16659         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16660         that Ravi put here.  
16661
16662         * class.cs (Constructor::Emit): Only emit if block is not null.
16663         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16664         deal with this by semantically definining it as if the user had
16665         done it.
16666
16667         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16668         constructors as we now "emit" them at a higher level.
16669
16670         (TypeContainer::DefineDefaultConstructor): Used to define the
16671         default constructors if none was provided.
16672
16673         (ConstructorInitializer): Add methods Resolve and Emit. 
16674
16675         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16676
16677 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16678
16679         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16680         the default constructor builder with our hashtable for methodbuilders
16681         to methodcores.
16682
16683         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16684         and argument_count is 0 in which case we have a match.
16685         (Binary::ResolveOperator): More null checking and miscellaneous coding
16686         style cleanup.
16687
16688 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16689
16690         * rootcontext.cs (IsNameSpace): Compare against null.
16691
16692         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16693
16694         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16695         and Unary::Operator.
16696
16697         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16698         accordingly.
16699
16700         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16701         we have overloaded operators.
16702         (Binary::ResolveOperator): Implement the part which does the operator overload
16703         resolution.
16704
16705         * class.cs (Operator::Emit): Implement.
16706         (TypeContainer::Emit): Emit the operators we have too.
16707
16708         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16709         the case when we have a user-defined operator.
16710
16711 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16712
16713         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16714
16715 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16716
16717         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16718         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16719         (Constructor::Emit): Implement.
16720         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16721         if we have no work to do. 
16722         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16723         Emit method.
16724
16725         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16726         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16727
16728         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16729         of parent.parent.
16730
16731 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16732
16733         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16734         in the source.
16735         (Tree::RecordNamespace): Method to do what the name says ;-)
16736         (Tree::Namespaces): Property to get at the namespaces hashtable.
16737
16738         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16739         keep track.
16740
16741         * rootcontext.cs (IsNamespace): Fixed it :-)
16742
16743 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16744
16745         * class.cs (TypeContainer::FindMembers): Add support for
16746         constructors. 
16747         (MethodCore): New class that encapsulates both the shared aspects
16748         of a Constructor and a Method.  
16749         (Method, Constructor): Factored pieces into MethodCore.
16750
16751         * driver.cs: Added --fatal which makes errors throw exceptions.
16752         Load System assembly as well as part of the standard library.
16753
16754         * report.cs: Allow throwing exceptions on errors for debugging.
16755
16756         * modifiers.cs: Do not use `parent', instead use the real type
16757         container to evaluate permission settings.
16758
16759         * class.cs: Put Ravi's patch back in.  He is right, and we will
16760         have to cope with the
16761
16762 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16763
16764         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16765         FamORAssem, not FamANDAssem.
16766
16767 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16768
16769         * driver.cs: Added --parse option that only parses its input files
16770         and terminates.
16771
16772         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16773         incorrect.  IsTopLevel is not used to tell whether an object is
16774         root_types or not (that can be achieved by testing this ==
16775         root_types).  But to see if this is a top-level *class* (not
16776         necessarly our "toplevel" container). 
16777
16778 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16779
16780         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16781         parent instead of a direct call to GetType.
16782
16783 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16784
16785         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16786         Modifiers.TypeAttr. This should just be a call to that method.
16787
16788         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16789         object so that we can determine if we are top-level or not.
16790
16791         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16792         TypeContainer too.
16793
16794         * enum.cs (Enum::Define): Ditto.
16795
16796         * modifiers.cs (FieldAttr): Re-write.
16797
16798         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16799         (TypeContainer::HaveStaticConstructor): New property to provide access
16800         to precisely that info.
16801
16802         * modifiers.cs (MethodAttr): Re-write.
16803         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16804
16805         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16806         of top-level types as claimed.
16807
16808 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16809
16810         * expression.cs (MemberLookup): Fruitless attempt to lookup
16811         constructors.  Maybe I need to emit default constructors?  That
16812         might be it (currently .NET emits this for me automatically).
16813         (Invocation::OverloadResolve): Cope with Arguments == null.
16814         (Invocation::EmitArguments): new function, shared by the new
16815         constructor and us.
16816         (Invocation::Emit): Handle static and instance methods.  Emit
16817         proper call instruction for virtual or non-virtual invocations.
16818         (New::Emit): Implement.
16819         (New::Resolve): Implement.
16820         (MemberAccess:Resolve): Implement.
16821         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16822         to track instances.
16823         (FieldExpr::Resolve): Set type.
16824
16825         * support.cs: Handle empty arguments.
16826                 
16827         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16828         SimpleLookup): Auxiliary routines to help parse a qualifier
16829         identifier.  
16830
16831         Update qualifier_identifier rule.
16832
16833         * codegen.cs: Removed debugging messages.
16834
16835         * class.cs: Make this a global thing, this acts just as a "key" to
16836         objects that we might have around.
16837
16838         (Populate): Only initialize method_builders_to_methods once.
16839
16840         * expression.cs (PropertyExpr): Initialize type from the
16841         PropertyType. 
16842
16843         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16844         Resolve pattern.  Attempt to implicitly convert value to boolean.
16845         Emit code.
16846
16847         * expression.cs: Set the type for the int32/int32 argument case.
16848         (Binary::ResolveOperator): Set the return type to boolean for
16849         comparission operators
16850
16851         * typemanager.cs: Remove debugging print code.
16852
16853         (Invocation::Resolve): resolve type.
16854
16855         * class.cs: Allocate a MemberInfo of the correct size, as the code
16856         elsewhere depends on the test to reflect the correct contents.
16857
16858         (Method::) Keep track of parameters, due to System.Reflection holes
16859
16860         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16861         mapping here.
16862
16863         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16864         of the exact size and return that.
16865
16866         (Class::LookupMethodByBuilder): New function that maps
16867         MethodBuilders to its methods.  Required to locate the information
16868         on methods because System.Reflection bit us again.
16869
16870         * support.cs: New file, contains an interface ParameterData and
16871         two implementations: ReflectionParameters and InternalParameters
16872         used to access Parameter information.  We will need to grow this
16873         as required.
16874
16875         * expression.cs (Invocation::GetParameterData): implement a cache
16876         and a wrapper around the ParameterData creation for methods. 
16877         (Invocation::OverloadResolve): Use new code.
16878
16879 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16880
16881         * class.cs (TypeContainer::EmitField): Remove and move into 
16882         (Field::Define): here and modify accordingly.
16883         (Field.FieldBuilder): New member.
16884         (TypeContainer::Populate): Update accordingly.
16885         (TypeContainer::FindMembers): Implement.
16886
16887 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16888
16889         * statement.cs: (VariableInfo::VariableType): New field to be
16890         initialized with the full type once it is resolved. 
16891
16892 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16893
16894         * parameter.cs (GetParameterInfo): Use a type cache to compute
16895         things only once, and to reuse this information
16896
16897         * expression.cs (LocalVariableReference::Emit): Implement.
16898         (OpcodeCast::Emit): fix.
16899
16900         (ParameterReference::Resolve): Implement.
16901         (ParameterReference::Emit): Implement.
16902
16903         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16904         that are expressions need to stay as Expressions.
16905
16906         * typemanager.cs (CSharpName): Returns the C# name of a type if
16907         possible. 
16908
16909         * expression.cs (Expression::ConvertImplicit): New function that
16910         implements implicit type conversions.
16911
16912         (Expression::ImplicitReferenceConversion): Implements implicit
16913         reference conversions.
16914
16915         (EmptyCast): New type for transparent casts.
16916
16917         (OpcodeCast): New type for casts of types that are performed with
16918         a sequence of bytecodes.
16919
16920         (BoxedCast): New type used for casting value types into reference
16921         types.  Emits a box opcode.
16922
16923         (Binary::DoNumericPromotions): Implements numeric promotions of
16924         and computation of the Binary::Type.
16925
16926         (Binary::EmitBranchable): Optimization.
16927
16928         (Binary::Emit): Implement code emission for expressions.
16929
16930         * typemanager.cs (TypeManager): Added two new core types: sbyte
16931         and byte.
16932
16933 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16934
16935         * class.cs (TypeContainer::FindMembers): Method which does exactly
16936         what Type.FindMembers does, only we don't have to use reflection. No
16937         implementation yet.
16938
16939         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16940         typecontainer objects as we need to get at them.
16941         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16942
16943         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16944         typecontainer object.
16945
16946         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16947         of just a Report object.
16948
16949 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16950
16951         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16952         "remove_"
16953         (TypeContainer::Populate): Now define the delegates of the type too.
16954         (TypeContainer.Delegates): Property to access the list of delegates defined
16955         in the type.
16956
16957         * delegates.cs (Delegate::Define): Implement partially.
16958
16959         * modifiers.cs (TypeAttr): Handle more flags.
16960
16961 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16962
16963         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16964         and not <=
16965         (Operator::Define): Re-write logic to get types by using the LookupType method
16966         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16967         (Indexer::Define): Ditto.
16968         (Event::Define): Ditto.
16969         (Property::Define): Ditto.
16970
16971 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16972
16973         * class.cs (TypeContainer::Populate): Now define operators too. 
16974         (TypeContainer.Operators): New property to access the list of operators
16975         in a type.
16976         (Operator.OperatorMethodBuilder): New member to hold the method builder
16977         for the operator we are defining.
16978         (Operator::Define): Implement.
16979
16980 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16981
16982         * class.cs (Event::Define): Make the prefixes of the accessor methods
16983         addOn_ and removeOn_ 
16984
16985         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16986         of the location being passed in too. Ideally, this should go later since all
16987         error reporting should be done through the Report object.
16988
16989         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16990         (Populate): Iterate thru the indexers we have and define them too.
16991         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16992         for the get and set accessors.
16993         (Indexer::Define): Implement.
16994
16995 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16996
16997         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16998         my previous implementation, did not work.
16999
17000         * typemanager.cs: Add a couple of missing types (the longs).
17001
17002         * literal.cs: Use TypeManager.bool_type instead of getting it.
17003
17004         * expression.cs (EventExpr): New kind of expressions.
17005         (Expressio::ExprClassFromMemberInfo): finish
17006
17007 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17008
17009         * assign.cs: Emit stores to static fields differently.
17010
17011 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17012
17013         * Merge in changes and adjust code to tackle conflicts. Backed out my
17014         code in Assign::Resolve ;-) 
17015
17016 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17017
17018         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17019         instead Report.Error and also pass in the location.
17020         (CSharpParser::Lexer): New readonly property to return the reference
17021         to the Tokenizer object.
17022         (declare_local_variables): Use Report.Error with location instead of plain 
17023         old error.
17024         (CheckDef): Ditto.
17025
17026         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17027         (Operator.CheckBinaryOperator): Ditto.
17028
17029         * cs-parser.jay (operator_declarator): Update accordingly.
17030
17031         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17032         (CheckBinaryOperator): Same here.
17033
17034         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17035         on the name without any prefixes of namespace names etc. This is because we
17036         already might have something already fully qualified like 
17037         'System.Console.WriteLine'
17038
17039         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17040
17041 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17042
17043         * cs-tokenizer.cs (location): Return a string which also contains
17044         the file name.
17045
17046         * expression.cs (ElementAccess): New class for expressions of the
17047         type 'element access.'
17048         (BaseAccess): New class for expressions of the type 'base access.'
17049         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17050         respectively.
17051
17052         * cs-parser.jay (element_access): Implement action.
17053         (base_access): Implement actions.
17054         (checked_expression, unchecked_expression): Implement.
17055
17056         * cs-parser.jay (local_variable_type): Correct and implement.
17057         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17058
17059         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17060
17061         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17062         name and the specifiers.
17063
17064         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17065
17066         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17067         making them all public ;-)
17068
17069         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17070         class anyways.
17071
17072 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17073
17074         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17075         PropertyExprs.
17076         (FieldExpr, PropertyExprs): New resolved expressions.
17077         (SimpleName::MemberStaticCheck): Perform static checks for access
17078         to non-static fields on static methods. Maybe this should be
17079         generalized for MemberAccesses. 
17080         (SimpleName::ResolveSimpleName): More work on simple name
17081         resolution. 
17082
17083         * cs-parser.jay (primary_expression/qualified_identifier): track
17084         the parameter index.
17085
17086         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17087         (EmitContext::EmitBoolExpression): Chain to expression generation
17088         instead of temporary hack.
17089         (::EmitStatementExpression): Put generic expression code generation.
17090
17091         * assign.cs (Assign::Emit): Implement variable assignments to
17092         local variables, parameters and fields.
17093
17094 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17095
17096         * statement.cs (Block::GetVariableInfo): New method, returns the
17097         VariableInfo for a variable name in a block.
17098         (Block::GetVariableType): Implement in terms of GetVariableInfo
17099
17100         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17101         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17102
17103 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17104
17105         * cs-parser.jay (operator_declaration): Continue on my quest : update
17106         to take attributes argument.
17107         (event_declaration): Ditto.
17108         (enum_declaration): Ditto.
17109         (indexer_declaration): Ditto.
17110
17111         * class.cs (Operator::Operator): Update constructor accordingly.
17112         (Event::Event): Ditto.
17113
17114         * delegate.cs (Delegate::Delegate): Same here.
17115
17116         * enum.cs (Enum::Enum): Same here.
17117
17118 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17119
17120         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17121
17122         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17123
17124         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17125         being passed around as an arraylist.
17126         (Attributes::AddAttribute): Method to add attribute sections.
17127
17128         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17129         (struct_declaration): Update accordingly.
17130         (constant_declaration): Update.
17131         (field_declaration): Update.
17132         (method_header): Update.
17133         (fixed_parameter): Update.
17134         (parameter_array): Ditto.
17135         (property_declaration): Ditto.
17136         (destructor_declaration): Ditto.
17137
17138         * class.cs (Struct::Struct): Update constructors accordingly.
17139         (Class::Class): Ditto.
17140         (Field::Field): Ditto.
17141         (Method::Method): Ditto.
17142         (Property::Property): Ditto.
17143         (TypeContainer::OptAttribute): update property's return type.
17144
17145         * interface.cs (Interface.opt_attributes): New member.
17146         (Interface::Interface): Update to take the extra Attributes argument.
17147
17148         * parameter.cs (Parameter::Parameter): Ditto.
17149
17150         * constant.cs (Constant::Constant): Ditto.
17151
17152         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17153         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17154         the attributes as a parameter.
17155         (InterfaceProperty): Update constructor call.
17156         (InterfaceEvent): Ditto.
17157         (InterfaceMethod): Ditto.
17158         (InterfaceIndexer): Ditto.
17159
17160         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17161         pass the attributes too.
17162         (interface_event_declaration): Ditto.
17163         (interface_property_declaration): Ditto.
17164         (interface_method_declaration): Ditto.
17165         (interface_declaration): Ditto.
17166
17167 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17168
17169         * class.cs (Method::Define): Track the "static Main" definition to
17170         create an entry point. 
17171
17172         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17173         EntryPoint if we find it. 
17174
17175         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17176         (EmitContext::ig): Make this variable public.
17177
17178         * driver.cs: Make the default output file be the first file name
17179         with the .exe extension.  
17180
17181         Detect empty compilations
17182
17183         Handle various kinds of output targets.  Handle --target and
17184         rename -t to --dumper.
17185
17186         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17187         methods inherited from Expression return now an Expression.  This
17188         will is used during the tree rewriting as we resolve them during
17189         semantic analysis.
17190
17191         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17192         the spec.  Missing entirely is the information about
17193         accessability of elements of it.
17194
17195         (Expression::ExprClassFromMemberInfo): New constructor for
17196         Expressions that creates a fully initialized Expression based on
17197         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17198         a Type.
17199
17200         (Invocation::Resolve): Begin implementing resolution of invocations.
17201
17202         * literal.cs (StringLiteral):  Implement Emit.
17203
17204 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17205
17206         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17207         member.
17208
17209 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17210
17211         * cs-parser.jay (attribute_arguments): Implement actions.
17212         (attribute): Fix bug in production. Implement action.
17213         (attribute_list): Implement.
17214         (attribute_target): Implement.
17215         (attribute_target_specifier, opt_target_specifier): Implement
17216         (CheckAttributeTarget): New method to check if the attribute target
17217         is valid.
17218         (attribute_section): Implement.
17219         (opt_attributes): Implement.
17220
17221         * attribute.cs : New file to handle attributes.
17222         (Attribute): Class to hold attribute info.
17223
17224         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17225         (attribute_section): Modify production to use 2 different rules to 
17226         achieve the same thing. 1 s/r conflict down !
17227         Clean out commented, useless, non-reducing dimension_separator rules.
17228
17229         * class.cs (TypeContainer.attributes): New member to hold list
17230         of attributes for a type.
17231         (Struct::Struct): Modify to take one more argument, the attribute list.
17232         (Class::Class): Ditto.
17233         (Field::Field): Ditto.
17234         (Method::Method): Ditto.
17235         (Property::Property): Ditto.
17236
17237         * cs-parser.jay (struct_declaration): Update constructor call to
17238         pass in the attributes too.
17239         (class_declaration): Ditto.
17240         (constant_declaration): Ditto.
17241         (field_declaration): Ditto.
17242         (method_header): Ditto.
17243         (fixed_parameter): Ditto.
17244         (parameter_array): Ditto.
17245         (property_declaration): Ditto.
17246
17247         * constant.cs (Constant::Constant): Update constructor similarly.
17248         Use System.Collections.
17249
17250         * parameter.cs (Parameter::Parameter): Update as above.
17251
17252 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17253
17254         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17255         (TypeContainer.delegates): New member to hold list of delegates.
17256
17257         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17258         this time as I seem to be on crack ;-)
17259
17260 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17261
17262         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17263         tell whether an identifier represents a namespace.
17264
17265         * expression.cs (NamespaceExpr): A namespace expression, used only
17266         temporarly during expression resolution.
17267         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17268         utility functions to resolve names on expressions.
17269
17270 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17271
17272         * codegen.cs: Add hook for StatementExpressions. 
17273
17274         * class.cs: Fix inverted test for static flag in methods.
17275
17276 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17277
17278         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17279         to make it coincide with MS' number.
17280         (Operator::CheckBinaryOperator): Ditto.
17281
17282         * ../errors/errors.txt : Remove error numbers added earlier.
17283
17284         * ../errors/cs1019.cs : Test case for error # 1019
17285
17286         * ../errros/cs1020.cs : Test case for error # 1020
17287
17288         * cs-parser.jay : Clean out commented cruft.
17289         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17290         used anywhere - non-reducing rule.
17291         (namespace_declarations): Non-reducing rule - comment out.
17292
17293         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17294         with TypeContainer::AddEnum.
17295
17296         * delegate.cs : New file for delegate handling classes.
17297         (Delegate): Class for declaring delegates.
17298
17299         * makefile : Update.
17300
17301         * cs-parser.jay (delegate_declaration): Implement.
17302
17303 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17304
17305         * class.cs (Event::Define): Implement.
17306         (Event.EventBuilder): New member.
17307
17308         * class.cs (TypeContainer::Populate): Update to define all enums and events
17309         we have.
17310         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17311         readonly fields for all these cases ?
17312
17313 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17314
17315         * class.cs (Property): Revamp to use the convention of making fields readonly.
17316         Accordingly modify code elsewhere.
17317
17318         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17319         the Define method of the Property class.
17320
17321         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17322         trivial bug.
17323         (TypeContainer::Populate): Update to define all the properties we have. Also
17324         define all enumerations.
17325
17326         * enum.cs (Define): Implement.
17327
17328 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17329
17330         * cs-parser.jay (overloadable_operator): The semantic value is an
17331         enum of the Operator class.
17332         (operator_declarator): Implement actions.
17333         (operator_declaration): Implement.
17334
17335         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17336         validity of definitions.
17337         (Operator::CheckBinaryOperator): Static method to check for binary operators
17338         (TypeContainer::AddOperator): New method to add an operator to a type.
17339
17340         * cs-parser.jay (indexer_declaration): Added line to actually call the
17341         AddIndexer method so it gets added ;-)
17342
17343         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17344         already taken care of by the MS compiler ?  
17345
17346 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17347
17348         * class.cs (Operator): New class for operator declarations.
17349         (Operator::OpType): Enum for the various operators.
17350
17351 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17352
17353         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17354         ostensibly handle this in semantic analysis.
17355
17356         * cs-parser.jay (general_catch_clause): Comment out
17357         (specific_catch_clauses, specific_catch_clause): Ditto.
17358         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17359         (catch_args, opt_catch_args): New productions.
17360         (catch_clause): Rewrite to use the new productions above
17361         (catch_clauses): Modify accordingly.
17362         (opt_catch_clauses): New production to use in try_statement
17363         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17364         and re-write the code in the actions to extract the specific and
17365         general catch clauses by being a little smart ;-)
17366
17367         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17368         Hooray, try and catch statements parse fine !
17369
17370 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17371
17372         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17373         string from the hashtable of variables.
17374
17375         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17376         I end up making that mistake ;-)
17377         (catch_clauses): Fixed gross error which made Key and Value of the 
17378         DictionaryEntry the same : $1 !!
17379
17380 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17381
17382         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17383
17384         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17385         when the add and remove accessors are specified. 
17386
17387 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17388
17389         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17390         information about indexer_declarator.
17391         (indexer_declarator): Implement actions.
17392         (parsing_indexer): New local boolean used to keep track of whether
17393         we are parsing indexers or properties. This is necessary because 
17394         implicit_parameters come into picture even for the get accessor in the 
17395         case of an indexer.
17396         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17397
17398         * class.cs (Indexer): New class for indexer declarations.
17399         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17400         (TypeContainer::indexers): New member to hold list of indexers for the
17401         type.
17402
17403 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17404
17405         * cs-parser.jay (add_accessor_declaration): Implement action.
17406         (remove_accessor_declaration): Implement action.
17407         (event_accessors_declaration): Implement
17408         (variable_declarators): swap statements for first rule - trivial.
17409
17410         * class.cs (Event): New class to hold information about event
17411         declarations.
17412         (TypeContainer::AddEvent): New method to add an event to a type
17413         (TypeContainer::events): New member to hold list of events.
17414
17415         * cs-parser.jay (event_declaration): Implement actions.
17416
17417 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17418
17419         * cs-parser.jay (dim_separators): Implement. Make it a string
17420         concatenating all the commas together, just as they appear.
17421         (opt_dim_separators): Modify accordingly
17422         (rank_specifiers): Update accordingly. Basically do the same
17423         thing - instead, collect the brackets here.
17424         (opt_rank_sepcifiers): Modify accordingly.
17425         (array_type): Modify to actually return the complete type string
17426         instead of ignoring the rank_specifiers.
17427         (expression_list): Implement to collect the expressions
17428         (variable_initializer): Implement. We make it a list of expressions
17429         essentially so that we can handle the array_initializer case neatly too.
17430         (variable_initializer_list): Implement.
17431         (array_initializer): Make it a list of variable_initializers
17432         (opt_array_initializer): Modify accordingly.
17433
17434         * expression.cs (New::NType): Add enumeration to help us
17435         keep track of whether we have an object/delegate creation
17436         or an array creation.
17437         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17438         members to hold data about array creation.
17439         (New:New): Modify to update NewType
17440         (New:New): New Overloaded contructor for the array creation
17441         case.
17442
17443         * cs-parser.jay (array_creation_expression): Implement to call
17444         the overloaded New constructor.
17445
17446 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17447
17448         * class.cs (TypeContainer::Constructors): Return member
17449         constructors instead of returning null.
17450
17451 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17452
17453         * typemanager.cs (InitCoreTypes): Initialize the various core
17454         types after we have populated the type manager with the user
17455         defined types (this distinction will be important later while
17456         compiling corlib.dll)
17457
17458         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17459         on Expression Classification.  Now all expressions have a method
17460         `Resolve' and a method `Emit'.
17461
17462         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17463         generation from working.     Also add some temporary debugging
17464         code. 
17465
17466 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17467
17468         * codegen.cs: Lots of code generation pieces.  This is only the
17469         beginning, will continue tomorrow with more touches of polish.  We
17470         handle the fundamentals of if, while, do, for, return.  Others are
17471         trickier and I need to start working on invocations soon.
17472
17473         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17474         s.InitStatement. 
17475
17476         * codegen.cs (EmitContext): New struct, used during code
17477         emission to keep a context.   Most of the code generation will be
17478         here. 
17479
17480         * cs-parser.jay: Add embedded blocks to the list of statements of
17481         this block.  So code generation proceeds in a top down fashion.
17482
17483 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17484
17485         * statement.cs: Add support for multiple child blocks.
17486
17487 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17488
17489         * codegen.cs (EmitCode): New function, will emit the code for a
17490         Block of code given a TypeContainer and its ILGenerator. 
17491
17492         * statement.cs (Block): Standard public readonly optimization.
17493         (Block::Block constructors): Link children. 
17494         (Block::Child): Child Linker.
17495         (Block::EmitVariables): Emits IL variable declarations.
17496
17497         * class.cs: Drop support for MethodGroups here, delay until
17498         Semantic Analysis.
17499         (Method::): Applied the same simplification that I did before, and
17500         move from Properties to public readonly fields.
17501         (Method::ParameterTypes): Returns the parameter types for the
17502         function, and implements a cache that will be useful later when I
17503         do error checking and the semantic analysis on the methods is
17504         performed.
17505         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17506         and made a method, optional argument tells whether this is a class
17507         or a structure to apply the `has-this' bit.
17508         (Method::GetCallingConvention): Implement, returns the calling
17509         convention. 
17510         (Method::Define): Defines the type, a second pass is performed
17511         later to populate the methods.
17512
17513         (Constructor::ParameterTypes): implement a cache similar to the
17514         one on Method::ParameterTypes, useful later when we do semantic
17515         analysis. 
17516
17517         (TypeContainer::EmitMethod):  New method.  Emits methods.
17518
17519         * expression.cs: Removed MethodGroup class from here.
17520
17521         * parameter.cs (Parameters::GetCallingConvention): new method.
17522
17523 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17524
17525         * class.cs (TypeContainer::Populate): Drop RootContext from the
17526         argument. 
17527
17528         (Constructor::CallingConvention): Returns the calling convention.
17529         (Constructor::ParameterTypes): Returns the constructor parameter
17530         types. 
17531
17532         (TypeContainer::AddConstructor): Keep track of default constructor
17533         and the default static constructor.
17534
17535         (Constructor::) Another class that starts using `public readonly'
17536         instead of properties. 
17537
17538         (Constructor::IsDefault): Whether this is a default constructor. 
17539
17540         (Field::) use readonly public fields instead of properties also.
17541
17542         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17543         track of static constructors;  If none is used, turn on
17544         BeforeFieldInit in the TypeAttributes. 
17545
17546         * cs-parser.jay (opt_argument_list): now the return can be null
17547         for the cases where there are no arguments. 
17548
17549         (constructor_declarator): If there is no implicit `base' or
17550         `this', then invoke the default parent constructor. 
17551
17552         * modifiers.cs (MethodAttr): New static function maps a set of
17553         modifiers flags into a MethodAttributes enum
17554         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17555         MethodAttr, TypeAttr to represent the various mappings where the
17556         modifiers are used.
17557         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17558
17559 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17560
17561         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17562         method arguments.
17563
17564         * interface.cs (PopulateIndexer): Implemented the code generator
17565         for interface indexers.
17566
17567 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17568
17569         * interface.cs (InterfaceMemberBase): Now we track the new status
17570         here.  
17571
17572         (PopulateProperty): Implement property population.  Woohoo!  Got
17573         Methods and Properties going today. 
17574
17575         Removed all the properties for interfaces, and replaced them with
17576         `public readonly' fields. 
17577
17578 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17579
17580         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17581         initialize their hashtables/arraylists only when they are needed
17582         instead of doing this always.
17583
17584         * parameter.cs: Handle refs and out parameters.
17585
17586         * cs-parser.jay: Use an ArrayList to construct the arguments
17587         instead of the ParameterCollection, and then cast that to a
17588         Parameter[] array.
17589
17590         * parameter.cs: Drop the use of ParameterCollection and use
17591         instead arrays of Parameters.
17592
17593         (GetParameterInfo): Use the Type, not the Name when resolving
17594         types. 
17595
17596 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17597
17598         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17599         and instead use public readonly fields.
17600
17601         * class.cs: Put back walking code for type containers.
17602
17603 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17604
17605         * class.cs (MakeConstant): Code to define constants.
17606
17607         * rootcontext.cs (LookupType): New function.  Used to locate types 
17608
17609
17610 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17611
17612         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17613         this System.Reflection code is.  Kudos to Microsoft
17614
17615         * typemanager.cs: Implement a type cache and avoid loading all
17616         types at boot time.  Wrap in LookupType the internals.  This made
17617         the compiler so much faster.  Wow.  I rule!
17618
17619         * driver.cs: Make sure we always load mscorlib first (for
17620         debugging purposes, nothing really important).
17621
17622         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17623         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17624
17625         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17626         on namespaces that have been imported using the `using' keyword.
17627
17628         * class.cs (TypeContainer::TypeAttr): Virtualize.
17629         (Class::TypeAttr): Return attributes suitable for this bad boy.
17630         (Struct::TypeAttr): ditto.
17631         Handle nested classes.
17632         (TypeContainer::) Remove all the type visiting code, it is now
17633         replaced with the rootcontext.cs code
17634
17635         * rootcontext.cs (GetClassBases): Added support for structs. 
17636
17637 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17638
17639         * interface.cs, statement.cs, class.cs, parameter.cs,
17640         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17641         Drop use of TypeRefs, and use strings instead.
17642
17643 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17644
17645         * rootcontext.cs: 
17646
17647         * class.cs (Struct::Struct): set the SEALED flags after
17648         checking the modifiers.
17649         (TypeContainer::TypeAttr): new property, returns the
17650         TypeAttributes for a class.  
17651
17652         * cs-parser.jay (type_list): Oops, list production was creating a
17653         new list of base types.
17654
17655         * rootcontext.cs (StdLib): New property.
17656         (GetInterfaceTypeByName): returns an interface by type name, and
17657         encapsulates error handling here.
17658         (GetInterfaces): simplified.
17659         (ResolveTree): Encapsulated all the tree resolution here.
17660         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17661         types. 
17662
17663         * driver.cs: Add support for --nostdlib, to avoid loading the
17664         default assemblies.
17665         (Main): Do not put tree resolution here. 
17666
17667         * rootcontext.cs: Beginning of the class resolution.
17668
17669 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17670
17671         * rootcontext.cs: Provide better error reporting. 
17672
17673         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17674
17675         * rootcontext.cs (CreateInterface): Handle the case where there
17676         are no parent interfaces.
17677
17678         (CloseTypes): Routine to flush types at the end.
17679         (CreateInterface): Track types.
17680         (GetInterfaces): Returns an array of Types from the list of
17681         defined interfaces.
17682
17683         * typemanager.c (AddUserType): Mechanism to track user types (puts
17684         the type on the global type hash, and allows us to close it at the
17685         end). 
17686
17687 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17688
17689         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17690         RecordInterface instead.
17691
17692         * cs-parser.jay: Updated to reflect changes above.
17693
17694         * decl.cs (Definition): Keep track of the TypeBuilder type that
17695         represents this type here.  Not sure we will use it in the long
17696         run, but wont hurt for now.
17697
17698         * driver.cs: Smaller changes to accomodate the new code.
17699
17700         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17701         when done. 
17702
17703         * rootcontext.cs (CreateInterface):  New method, used to create
17704         the System.TypeBuilder type for interfaces.
17705         (ResolveInterfaces): new entry point to resolve the interface
17706         hierarchy. 
17707         (CodeGen): Property, used to keep track of the code generator.
17708
17709 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17710
17711         * cs-parser.jay: Add a second production for delegate_declaration
17712         with `VOID'.
17713
17714         (enum_body): Put an opt_comma here instead of putting it on
17715         enum_body or enum_member_declarations so we can handle trailing
17716         commas on enumeration members.  Gets rid of a shift/reduce.
17717
17718         (type_list): Need a COMMA in the middle.
17719
17720         (indexer_declaration): Tell tokenizer to recognize get/set
17721
17722         * Remove old targets.
17723
17724         * Re-add the parser target.
17725
17726 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17727
17728         * cs-parser.jay: Add precendence rules for a number of operators
17729         ot reduce the number of shift/reduce conflicts in the grammar.
17730
17731 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17732
17733         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17734         and put it here.
17735
17736         Get rid of old crufty code.
17737
17738         * rootcontext.cs: Use this to keep track of the parsed
17739         representation and the defined types available to the program. 
17740
17741         * gen-treedump.cs: adjust for new convention.
17742
17743         * type.cs: Split out the type manager, and the assembly builder
17744         from here. 
17745
17746         * typemanager.cs: the type manager will live here now.
17747
17748         * cil-codegen.cs: And the code generator here. 
17749
17750 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17751
17752         * makefile: Fixed up for easy making.
17753
17754 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17755
17756         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17757         the 
17758
17759         (unary_expression): Expand pre_increment_expression and
17760         post_decrement_expression to reduce a shift/reduce.
17761
17762 2001-07-11  Simon Cozens
17763
17764         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17765
17766         Improve allow_keyword_as_indent name.
17767
17768 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17769
17770         * Adjustments for Beta2. 
17771
17772 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17773
17774         * decl.cs: Added `Define' abstract method.
17775         (InTransit): new property, used to catch recursive definitions. 
17776
17777         * interface.cs: Implement `Define'. 
17778
17779         * modifiers.cs: Map Modifiers.constants to
17780         System.Reflection.TypeAttribute flags.
17781
17782         * class.cs: Keep track of types and user-defined types.
17783         (BuilderInit): New method for creating an assembly
17784         (ResolveType): New function to launch the resolution process, only
17785         used by interfaces for now.
17786
17787         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17788         that are inserted into the name space. 
17789
17790 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17791
17792         * ARGH.  I have screwed up my tree so many times due to the use of
17793         rsync rather than using CVS.  Going to fix this at once. 
17794
17795         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17796         load types.
17797
17798 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17799
17800         * Experiment successful: Use System.Type rather that our own
17801         version of Type.  
17802
17803 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17804
17805         * cs-parser.jay: Removed nsAliases from here.
17806
17807         Use new namespaces, handle `using XXX;' 
17808
17809         * namespace.cs: Reimplemented namespace handling, use a recursive
17810         definition of the class.  Now we can keep track of using clauses
17811         and catch invalid using clauses.
17812
17813 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17814
17815         * gen-treedump.cs: Adapted for all the renaming.
17816
17817         * expression.cs (Expression): this class now has a Type property
17818         which returns an expression Type.
17819
17820         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17821         `Type', as this has a different meaning now in the base
17822
17823 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17824
17825         * interface.cs, class.cs: Removed from all the sources the
17826         references to signature computation, as we can not do method
17827         signature computation during the parsing time, as we are not
17828         trying to solve at that point distinguishing:
17829
17830         class X {
17831                 void a (Blah x) {}
17832                 void a (NS.Blah x) {}
17833         }
17834
17835         Which depending on the context might be valid or not, as we do not
17836         know if Blah is the same thing as NS.Blah at that point.
17837
17838         * Redid everything so the code uses TypeRefs now instead of
17839         Types.  TypeRefs are just temporary type placeholders, that need
17840         to be resolved.  They initially have a pointer to a string and the
17841         current scope in which they are used.  This is used later by the
17842         compiler to resolve the reference to an actual Type. 
17843
17844         * DeclSpace is no longer a CIR.Type, and neither are
17845         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17846         are all DeclSpaces, but no Types. 
17847
17848         * type.cs (TypeRefManager): This implements the TypeRef manager,
17849         which keeps track of all the types that need to be resolved after
17850         the parsing has finished. 
17851
17852 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17853
17854         * ARGH.  We are going to have to store `foreach' as a class rather
17855         than resolving it, as we need to verify error 1579 after name
17856         resolution.   *OR* we could keep a flag that says `This request to
17857         IEnumerator comes from a foreach statement' which we can then use
17858         to generate the error.
17859
17860 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17861
17862         * class.cs (TypeContainer.AddMethod): we now add methods to the
17863         MethodGroup instead of the method hashtable.  
17864
17865         * expression.cs: Add MethodGroup abstraction, which gets us one
17866         step closer to the specification in the way we handle method
17867         declarations.  
17868
17869         * cs-parser.jay (primary_expression): qualified_identifier now
17870         tried to match up an identifier to a local variable reference or
17871         to a parameter reference.
17872
17873         current_local_parameters is now a parser global variable that
17874         points to the current parameters for the block, used during name
17875         lookup.
17876
17877         (property_declaration): Now creates an implicit `value' argument to
17878         the set accessor.
17879
17880 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17881
17882         * parameter.cs: Do not use `param' arguments as part of the
17883         signature, per the spec.
17884
17885 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17886
17887         * decl.cs: Base class for classes, structs and interfaces.  This
17888         is the "Declaration Space" 
17889
17890         * cs-parser.jay: Use CheckDef for checking declaration errors
17891         instead of having one on each function.
17892
17893         * class.cs: Factor out some code for handling error handling in
17894         accordance to the "Declarations" section in the "Basic Concepts"
17895         chapter in the ECMA C# spec.
17896
17897         * interface.cs: Make all interface member classes derive from
17898         InterfaceMemberBase.
17899
17900 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17901
17902         * Many things: all interfaces are parsed and generated in
17903         gen-treedump.  Support for member variables, constructors,
17904         destructors, properties, constants is there.
17905
17906         Beginning of the IL backend, but very little done, just there for
17907         testing purposes. 
17908
17909 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17910
17911         * cs-parser.jay: Fix labeled statement.
17912
17913         * cs-tokenizer.cs (escape): Escape " and ' always.
17914         ref_line, ref_name: keep track of the line/filename as instructed
17915         by #line by the compiler.
17916         Parse #line.
17917
17918 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17919
17920         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17921         to match the values in System.CodeDOM.
17922
17923         Divid renamed to Divide.
17924
17925         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17926         statements. 
17927         (Statements.set): remove.
17928
17929         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17930         statements. 
17931
17932         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17933         falseStatements always have valid values. 
17934
17935         * cs-parser.jay: Use System.CodeDOM now.
17936