925fe78fb19e36da879b25013e6a42d0a57da232
[mono.git] / mcs / gmcs / ChangeLog
1 2004-12-07  Martin Baulig  <martin@ximian.com>
2
3         * driver.cs: Call it "BETA SOFTWARE" :-)
4
5 2004-12-06  Raja R Harinath  <rharinath@novell.com>
6
7         Fix crash on cs0657-17.cs.
8         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
9         Use RootContext.Tree.Types, not 'new RootTypes ()'.
10         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
11         the case where the NamespaceEntry gets overwritten.
12
13 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
14
15         Fixed #69195, #56821
16         * ecore.cs (ResolveBoolean): Tiny refactoring.
17
18         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
19         of right expression resolving when left is false constant and
20         operator is LogicalAnd OR true constant and operator is LogicalOr.
21
22         * statement.cs (ResolveUnreachable): Always reports warning.
23
24 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
25
26         * class.cs: Distinguish between 1721 and 1722 (just a little help
27         for the programmer).
28
29 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
30
31         * delegate.cs: Only allow this on new versions of the language. 
32
33 2004-12-02  Duncan Mak  <duncan@ximian.com>
34
35         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
36         Expression class.
37         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
38         here as a static method. Take an additional bool out parameter
39         `must_do_cs1540_check' for signaling to InstanceResolve.
40         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
41         member field from PropertyExpr class and made it an argument of
42         the method instead.
43         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
44         check for MarshalByRefObject, and report CS0122 instead of CS1540.
45         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
46         and `remove_accessor' as well as InstanceResolve: report CS0122
47         where applicable.
48
49         Fixes #70129.
50
51 2004-12-07  Martin Baulig  <martin@ximian.com>
52
53         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
54         and CS0692 where appropriate.
55
56 2004-12-06  Martin Baulig  <martin@ximian.com>
57
58         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
59         IsDuplicateImplementation() and improved it.
60
61         * expression.cs (Invocation.InferTypeArguments): Added
62         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
63         and removed the "ref" modifier from `infered_types'.
64
65         * decl.cs (MemberName.ToString): Removed the exception.
66
67 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
68
69         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
70           comments are allowed.
71
72 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
73
74         * delegate.cs: Add checks for subtypes in paramaters and return values
75         in VerifyMethod () to add support for Covariance/Contravariance
76         in delegates.
77         
78 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
79
80         * report.cs: Remove extra closing parenthesis.
81
82         * convert.cs (Error_CannotImplicitConversion): If the name of the
83         types are the same, provide some extra information.
84
85 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
86
87         Fix bug #70102
88         * attribute.cs (Resolve): Improved implementation of params
89         attribute arguments.
90
91         * support.cs (ParameterData): Add HasParams to be faster.
92
93 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
94
95         all things are for /doc support:
96
97         * doc.cs: new file that supports XML documentation generation.
98         * mcs.exe.sources: added doc.cs.
99         * driver.cs:
100           Handle /doc command line option.
101           Report error 2006 instead of 5 for missing file name for /doc.
102           Generate XML documentation when required, after type resolution.
103         * cs-tokenizer.cs:
104           Added support for picking up documentation (/// and /** ... */),
105           including a new XmlCommentState enumeration.
106         * cs-parser.jay:
107           Added lines to fill Documentation element for field, constant,
108           property, indexer, method, constructor, destructor, operator, event
109           and class, struct, interface, delegate, enum.
110           Added lines to warn incorrect comment.
111         * rootcontext.cs :
112           Added Documentation field (passed only when /doc was specified).
113         * decl.cs:
114           Added DocComment, DocCommentHeader, GenerateDocComment() and
115           OnGenerateDocComment() and some supporting private members for
116           /doc feature to MemberCore.
117         * class.cs:
118           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
119         * delegate.cs:
120           Added overriden DocCommentHeader.
121         * enum.cs:
122           Added overriden DocCommentHeader and GenerateDocComment().
123
124 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
125
126         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
127         unwrapping the enumeration values, chain to
128         DoConstantNumericPromotions again, so we can promote things to the
129         fundamental types (takes care of enums that are bytes, sbytes).
130
131         Fixes bug #62054.
132
133 2004-12-01  Raja R Harinath  <rharinath@novell.com>
134
135         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
136         Fix long-standing bug in type-lookup.  Use FindType instead of
137         LookupType when ec.ResolvingTypeTree.
138         (Attribute.ResolveType, Attribute.Resolve)
139         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
140         Update to changes.
141         (Attributes.Search): Remove internal version.  Update.
142         (Attributes.SearchMulti): Update.
143         (Attributes.GetClsCompliantAttribute): Remove.
144         (Attributes.GetIndexerNameAttribute): Remove.
145         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
146         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
147         * class.cs (Indexer.Define): Likewise.
148
149 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
150
151         Fix bug #68790
152         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
153         MarshallByReference members access.
154
155         * expression.cs: Use CheckMarshallByRefAccess;
156         Better error CS0197 message.
157
158         * report.cs: Print whole related error message.
159
160 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
161
162         * class (GetClassBases): Better error 60 report.
163         (EventProperty): Disabled warning 67 detection.
164
165 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
166
167         Fix bug #60324
168         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
169
170         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
171         precise values.
172
173 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
174
175         Fix bug #49488
176         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
177
178         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
179
180 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
181
182         * attribute.cs (Attribute.Resolve): Refine error reporting and
183         report a cs0117 if the identifier does not exist, to distinguish
184         from 0617 which is a miss-use of the actual identifier.
185
186         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
187         between cs0070 and cs0079.
188
189         * class.cs (MemberBase.DoDefine): When reporting a wrong
190         accessibility level, we use MethodCore to compare instead of
191         Method (this was a regression in some refactoring effort).
192
193         So now we correctly report cs0056 again.
194
195         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
196         testing the target_type (which was known to be object_type) and
197         not the source type (which is anonymous_method).
198
199         Fixed reporting of error cs1660.
200
201         * expression.cs (UserCast.Source): Expose the underlying cast.
202
203         * statement.cs (Switch.SwitchGoverningType): Sort the list of
204         allowed types to find a match to int32 first (most common).
205
206         In addition, it ignores any ImplicitUserConversions that did an
207         internal implicit conversion (as the switch statement allows only
208         one integral conversion to exist).
209
210         * class.cs (PartialContainer.Create): rename `name' to
211         `member_name' for clarity.  Then replace the string calls with a
212         call to MemberName.GetPartialName, as now using
213         MemberName.ToString is an error (this is due to the side effects
214         it had, that were fixed in the past).
215
216         This will restore the error reporting on a number of partial class
217         errors that were missusing this (and getting an exception as a
218         results, which is now just a plain textual warning, because
219         yyparse debug output would crash otherwise).
220
221 2004-11-26  Raja R Harinath  <rharinath@novell.com>
222
223         * Makefile (PROGRAM_INSTALL_DIR): Remove.
224
225 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
226
227         * rootcontext.cs (LookupType): Make sure to cache lookups that
228         don't give us a negative result. This saves about 5% of corlib
229         compilation time.
230
231 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
232
233         * report.cs (AbstractMessage.Print): messages are sent to stderr
234
235         * class.cs (TypeContainer.GetClassBases): It is an error to have a
236         non-interface in the list of interfaces (at this point, either
237         parent was properly set, or a base class is being listed in the
238         interfaces section).
239
240         This flags error 1722, and resolves the crash from bug 69259.
241
242 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
243
244         * statement.cs (Using.EmitExpressionFinally): make this work right
245         for valuetypes. Fixes 69926.
246
247 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
248
249         * const.cs (Const.ChangeType): Cope with the "0 literal can be
250         converted to an enum" here, before we try to change the underlying
251         type.  This code exists, but it is a different code path than the
252         one used while encoding constants.
253
254         (ImplicitReferenceConversionExists): In addition, resynchronized
255         the code here, so it matches the same code in
256         ImplicitReferenceConversionExists for the `from any class-type S
257         to any interface-type T'.       
258
259 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
260
261         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
262
263 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
264
265         * cs-parser.jay: Use verbosity accordingly. 
266
267 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
268
269         * expression.cs (Unary.ResolveOperator): Do not report warning;
270         AddressOf reads from variable.
271         
272         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
273
274 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
275
276         Fix bug #69462
277
278         * attribute.cs (Attributable): Removed CheckTargets.
279         (Attributes.Emit): Explicit attribute targets are tested here.
280
281         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
282         not enabled for interfaces.
283
284         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
285         (GetAssemblyName): Ouch next bug there.
286
287 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
288
289         * expression.cs: Error 275 added.
290         
291 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
292
293         Fix bug #69177 (Implemented decimal constant support)
294
295         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
296         (BinaryFold): Add DecimalConstant.
297
298         * const.cs (Define): Decimal constant 
299         (is not constant.
300         (ChangeType): Add decimal type handling.
301         (LookupConstantValue): Don't set value for decimal type but
302         emit DecimalConstantAttribute. Needed for constant optimization.
303
304         * constant.cs (ToDecimal): New method.
305         (ConvertToDecimal): New method.
306         (IntConstant): Implemented ConvertToDecimal.
307         (DecimalConstant.Emit): Emit optimized version for decimals in
308         int range.
309
310         * expression.cs (ResolveOperator): Changed order of constant
311         reduction to work correctly with native types which have
312         overloaded operators.
313         (ResolveMemberAccess): Extract constant value from attribute
314         for decimal type.
315
316         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
317
318         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
319         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
320         (ChangeType): Decimal is special.
321         (TypeToCoreType): Add decimal type.
322
323 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
324
325         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
326         decimal types.
327
328 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
329
330         * class.cs (EventField.ApplyAttributeBuilder): Fix error
331         test cs1667-5.cs.
332
333 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
334
335         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
336
337         * pending.cs (PendingImplementation): Grab only interfaces.
338
339 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
340
341         * statement.cs (ForeachHelperMethods): Add location member and
342         error 202 detection.
343
344 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
345
346         * expression.cs (DoResolveBase): Fixed wrong warning for out
347         variables.
348
349 2004-12-04  Martin Baulig  <martin@ximian.com>
350
351         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
352         to check whether the conversion is ok.
353
354         * typemanager.cs (TypeManager.GetTypeArguments): Just return
355         `Type.EmptyTypes' if we're not a generic TypeContainer.
356
357 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
358
359         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
360         old bug: when converting from the null literal to a pointer,
361         return an EmptyCast, not the NullLiteral.
362
363         This fixes #69921, the recent null_type changes probably made this
364         bug more prominent.
365
366 2004-12-03  Martin Baulig  <martin@ximian.com>
367
368         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
369         method as our child, call AnonymousMethod.Compatible() on it.
370
371 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
372
373         * class.cs (FieldBase): Use an unused bit field from the field to
374         encode the `has_offset' property from the FieldMember.  This saves
375         a couple of Ks on bootstrap compilation.
376
377         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
378         method as our child, return the AnonymousMethod resolved
379         expression.
380
381         * expression.cs (New.DoResolve): Allow return values from
382         NewDelegate to also include AnonymousMethods.
383
384         Fixes #70150.
385
386 2004-11-29  Raja R Harinath  <rharinath@novell.com>
387
388         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
389         cs1648 report.
390         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
391         System.Runtime.InteropServices._Exception, since it's a base
392         interface of the core type System.Exception in the net_2_0 profile.
393
394 2004-11-27  Martin Baulig  <martin@ximian.com>
395
396         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
397
398 2004-11-26  Raja R Harinath  <rharinath@novell.com>
399
400         * Makefile: Convert to use executable.make.
401         * gmcs.exe.sources: New.
402
403 2004-11-25  Martin Baulig  <martin@ximian.com>
404
405         * expression.cs (Invocation.InferType): Added support for byref types.
406
407 2004-11-25  Martin Baulig  <martin@ximian.com>
408
409         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
410         in TypeManager.TypeToCoreType().
411
412 2004-11-25  Martin Baulig  <martin@ximian.com>
413
414         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
415         "Dispose" method from the `current_type'.
416         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
417         DoDefineMembers() instead of using the MethodBuilder; this is
418         required for generic iterators.
419
420         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
421
422 2004-11-24  Martin Baulig  <martin@ximian.com>
423
424         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
425
426 2004-11-20  Martin Baulig  <martin@ximian.com>
427
428         * expression.cs (Invocation.InferType): Correctly infer generic
429         instances; see gen-103.cs.
430         (Invocation.InferTypeArguments): If a generic method doesn't have
431         any unbound type parameters, we don't need to infer anything.
432
433 2004-11-19  Raja R Harinath  <rharinath@novell.com>
434
435         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
436
437 2004-11-17  Raja R Harinath  <rharinath@novell.com>
438
439         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
440         (TypeHandle.GetMemberCache): New.
441         (TypeHandle.TypeHandle): Update.
442         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
443         (TypeManager.LookupParentInterfacesCache):
444         Rename from LookupInterfaceCache.  Optimize slightly.
445         (TypeManager.MemberLookup_FindMembers): Update.
446         * decl.cs (MemberCache.MemberCache): Set Container to null in the
447         multi-type variant.
448         (AddCacheContents): Rename from AddHashtable.
449         * class.cs (TypeContainer.parent_container): Remove.
450         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
451         (TypeContainer.DoDefineMembers): Don't initialize it.
452         Update to name changes.
453         
454 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
455
456         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
457         that factors the code to check access modifiers on override.  
458
459         (PropertyBase): Use the code here.
460
461         Patch from Lluis S'anchez, fixes bug #69361.
462
463 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
464
465         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
466         routine that is used to report the use of a captured variable
467         whose address has been taken.
468
469         There are two checks: one when variables are being captured and
470         the other check is when the address of a variable is taken. 
471         
472         (because an anonymous methods might be resolved before *or* after
473         the address has been taken) and 
474
475         * expression.cs (Conditional.DoResolve): Remove the special
476         casing that Martin added to trueExpr and falseExpr being both
477         NullLiteral.  We get the right behavior now just by introducing
478         the null_type into the compiler. 
479
480         * convert.cs (ExplicitConversion): Change the code to use
481         null_type instead of testing `expr is NullLiteral'.
482         (ImplicitConversionStandard): use null_type too.
483         (ImplicitReferenceConversionExists): use null_type too.
484         (ImplicitReferenceConversion): use null_type too.
485
486         * literal.cs: The type of `NullLiteral' is now null_type instead
487         of object_type. 
488         (Resolve): Set the type here.
489
490         * typemanager.cs: Introduce null_type.
491
492 2004-11-18  Martin Baulig  <martin@ximian.com>
493
494         * rootcontext.cs
495         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
496
497 2004-11-18  Martin Baulig  <martin@ximian.com>
498
499         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
500
501 2004-11-18  Martin Baulig  <martin@ximian.com>
502
503         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
504         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
505         call ResolveConstructedType() on it to resolve it without checking
506         constraints.
507         (Constraints.ResolveTypes): Check them here.
508         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
509         but don't check constraints.
510         (ConstructedType.ResolveAsTypeTerminal): Override this and also
511         check constraints here.
512         (ConstructedType.ResolveConstructedType): New public method.  This
513         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
514         resolve ourselves without checking constraints.
515
516         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
517
518 2004-11-18  Martin Baulig  <martin@ximian.com>
519
520         * decl.cs
521         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
522
523         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
524
525 2004-11-18  Martin Baulig  <martin@ximian.com>
526
527         * ecore.cs (TypeExpr.ResolveType): Removed.
528         (Expression.ResolveAsTypeTerminal): We always return a fully
529         resolved `TypeExpr', so we can just access its `Type'.
530
531         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
532
533 2004-11-17  Martin Baulig  <martin@ximian.com>
534
535         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
536         sure we don't return any unresolved TypeExpr's.
537         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
538         a `TypeExpr'.
539         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
540
541         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
542         unresolved `ConstructedType's.
543
544 2004-11-17  Martin Baulig  <martin@ximian.com>
545
546         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
547
548 2004-11-17  Martin Baulig  <martin@ximian.com>
549
550         * ecore.cs
551         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
552
553         * decl.cs (DeclSpace.ResolveType): Removed.
554         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
555
556 2004-11-17  Martin Baulig  <martin@ximian.com>
557
558         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
559         direction, like FindMembers() does.  Fixes #69546, testcase is in
560         test-315.cs.    
561
562 2004-11-16  Martin Baulig  <martin@ximian.com>
563
564         This is based on a patch from Marek Safar, see bug #69082.
565         Fixes bugs #63705 and #67130.
566
567         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
568         method; create a MemberCache for an interface type and cache the
569         result.
570
571         * decl.cs (IMemberContainer.ParentContainer): Removed.
572         (IMemberContainer.ParentCache): New property.
573         (MemberCache.SetupCacheForInterface): Removed.
574         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
575         to create a cache for an interface's "parent".
576
577         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
578         interfaces too.
579
580 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
581
582         * statement.cs: Avoid adding bools to a hashtable.
583
584 2004-11-15  Martin Baulig  <martin@ximian.com>
585
586         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
587
588 2004-11-11  Martin Baulig  <martin@ximian.com>
589
590         * typemanager.cs (TypeManager.GetMethodName): New method.
591
592         * class.cs (MethodData.Define): Include the generic arity in the
593         name of an explicit interface; also add it to the method name.
594
595         * pending.cs (PendingImplementation.InterfaceMethod): The method
596         name now includes the generic arity.
597
598 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
599
600         * expression.cs (Invocation.OverloadResolve): Flag error if we are
601         calling an unsafe method from a safe location.
602
603 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
604
605         Fix #69167
606         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
607
608 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
609
610         * namespace.cs (VerifyUsing): use GetPartialName instead of
611         ToString. 
612
613 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
614
615         * statement.cs (Return.Resolve): Fix regression in typo: if
616         `in_exc', we have to request a NeedReturnLabel, this was a typo
617         introduced in the anonymous method check-in.  Fixes #69131.
618
619         * Indexers were using the ShortName when defining themselves,
620         causing a regression in the compiler bootstrap when applying the
621         patch from 2004-11-02 (first part), now they use their full name
622         and the bug is gone.
623
624 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
625
626         * driver.cs: Strip the path from the names of embedded resources. Fixes
627         #68519.
628
629 2004-11-04  Raja R Harinath  <rharinath@novell.com>
630
631         Fix error message regression: cs0104-2.cs.
632         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
633         (AliasEntry.Resolve): Update.
634         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
635         'silent' flag.
636         (RootContext.LookupType): Update.
637
638 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
639
640         * cs-parser.jay: Add support for handling accessor modifiers
641         * class: Add support port accessor modifiers and error checking,
642         define PropertyMethod.Define as virtual (not abstract anymore)
643         * ecore.cs: Add checking for proeprties access with access modifiers
644         * iterators.cs: Modify Accessor constructor call based in the modified
645         constructor
646 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
647
648         * expression.cs (StringConcat): Handle being called twice,
649         as when we have a concat in a field init with more than two
650         ctors in the class
651
652 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
653
654         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
655         special case explicit implementations, we should always produce
656         the .property or .event declaration.
657         
658         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
659         since it will not return correct data if people use this
660         unresolved in the presence of using statements (see test-313).
661
662         * class.cs (MethodData.Define): If we are an explicit interface
663         implementation, set the method name to the full name of the
664         interface plus the name of the method.  
665
666         Notice that using the method.MethodName.GetFullName() does not
667         work, as it will only contain the name as declared on the source
668         file (it can be a shorthand in the presence of using statements)
669         and not the fully qualifed type name, for example:
670
671         using System;
672
673         class D : ICloneable {
674                 object ICloneable.Clone ()  {
675                 }
676         }
677
678         Would produce a method called `ICloneable.Clone' instead of
679         `System.ICloneable.Clone'.
680
681         * namespace.cs (Alias.Resolve): Use GetPartialName.
682         
683 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
684
685         * cs-parser.jay: Add error 1055 report.
686
687 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
688
689         * assign.cs (Assign.DoResolve): Only do the transform of
690         assignment into a New if the types are compatible, if not, fall
691         through and let the implicit code deal with the errors and with
692         the necessary conversions. 
693
694 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
695
696         * cs-parser.jay: Add error 1031 report.
697
698         * cs-tokenizer.cs: Add location for error 1038.
699
700 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
701
702         * cs-parser.jay: Add error 1016 report.
703
704 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
705
706         * cs-parser.jay: Add errors 1575,1611 report.
707
708 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
709
710         * cs-parser.jay: Add error 1001 report.
711
712 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
713
714         Fix #68850
715         * attribute.cs (GetMarshal): Add method argument for
716         caller identification.
717
718         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
719         agument for GetMarshal and RuntimeMissingSupport.
720
721 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
722
723         * attribute.cs (ExtractSecurityPermissionSet): Removed
724         TypeManager.code_access_permission_type.
725
726         * typemanager.cs: Removed TypeManager.code_access_permission_type.
727
728 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
729
730         * expression.cs (LocalVariableReference.DoResolveLValue): Check
731         for obsolete use of a variable here.   Fixes regression on errors
732         cs0619-25 and cs0619-26.
733
734 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
735
736         Fix #62358, implemented security attribute encoding.
737
738         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
739         Tests permitted SecurityAction for assembly or other types.
740         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
741         data from SecurityPermissionAttribute to PermisionSet class.
742
743         * class.cs (ApplyAttributeBuilder): Added special handling
744         for System.Security.Permissions.SecurityAttribute based types.
745
746         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
747         special handling for System.Security.Permissions.SecurityAttribute
748         based types.
749
750         * enum.cs (ApplyAttributeBuilder): Added special handling
751         for System.Security.Permissions.SecurityAttribute based types.
752
753         * parameter.cs (ApplyAttributeBuilder): Added special handling
754         for System.Security.Permissions.SecurityAttribute based types.
755
756         * rootcontext.cs: Next 2 core types.
757
758         * typemanager.cs (TypeManager.security_permission_attr_type):
759         Built in type for the SecurityPermission Attribute.
760         (code_access_permission_type): Build in type.
761
762 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
763
764         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
765         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
766         all of this information into
767         EmitContext.EmitCapturedVariableInstance.
768         
769         * codegen.cs (EmitCapturedVariableInstance): move here the
770         funcionality of emitting an ldarg.0 in the presence of a
771         remapping.   This centralizes the instance emit code.
772
773         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
774         then emit a load of this: it means that we have reached the
775         topmost ScopeInfo: the one that contains the pointer to the
776         instance of the class hosting the anonymous method.
777
778         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
779         captures to the topmost CaptureContext.
780
781 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
782
783         * expression.cs (LocalVariableReference): Move the knowledge about
784         the iterators into codegen's EmitCapturedVariableInstance.
785
786 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
787
788         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
789         all code paths return a value from an anonymous method (it is the
790         same as the 161 error, but for anonymous methods).
791
792 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
793
794         The introduction of anonymous methods in the compiler changed
795         various ways of doing things in the compiler.  The most
796         significant one is the hard split between the resolution phase
797         and the emission phases of the compiler.
798
799         For instance, routines that referenced local variables no
800         longer can safely create temporary variables during the
801         resolution phase: they must do so from the emission phase,
802         since the variable might have been "captured", hence access to
803         it can not be done with the local-variable operations from the runtime.
804         
805         * statement.cs 
806
807         (Block.Flags): New flag `IsTopLevel' to indicate that this block
808         is a toplevel block.
809
810         (ToplevelBlock): A new kind of Block, these are the blocks that
811         are created by the parser for all toplevel method bodies.  These
812         include methods, accessors and anonymous methods.
813
814         These contain some extra information not found in regular blocks:
815         A pointer to an optional CaptureContext (for tracking captured
816         local variables and parameters).  A pointer to the parent
817         ToplevelBlock.
818         
819         (Return.Resolve): Catch missmatches when returning a value from an
820         anonymous method (error 1662).
821         Invoke NeedReturnLabel from the Resolve phase instead of the emit
822         phase.
823
824         (Break.Resolve): ditto.
825
826         (SwitchLabel): instead of defining the labels during the
827         resolution phase, we now turned the public ILLabel and ILLabelCode
828         labels into methods called GetILLabelCode() and GetILLabel() that
829         only define the label during the Emit phase.
830
831         (GotoCase): Track the SwitchLabel instead of the computed label
832         (its contained therein).  Emit the code by using
833         SwitchLabel.GetILLabelCode ().
834
835         (LocalInfo.Flags.Captured): A new flag has been introduce to track
836         whether the Local has been captured or not.
837
838         (LocalInfo.IsCaptured): New property, used to tell whether the
839         local has been captured.
840         
841         * anonymous.cs: Vastly updated to contain the anonymous method
842         support.
843
844         The main classes here are: CaptureContext which tracks any
845         captured information for a toplevel block and ScopeInfo used to
846         track the activation frames for various local variables.   
847
848         Each toplevel block has an optional capture context associated
849         with it.  When a method contains an anonymous method both the
850         toplevel method and the anonymous method will create a capture
851         context.   When variables or parameters are captured, they are
852         recorded on the CaptureContext that owns them, for example:
853
854         void Demo () {
855              int a;
856              MyDelegate d = delegate {
857                  a = 1;
858              }
859         }
860
861         Here `a' will be recorded as captured on the toplevel
862         CapturedContext, the inner captured context will not have anything
863         (it will only have data if local variables or parameters from it
864         are captured in a nested anonymous method.
865
866         The ScopeInfo is used to track the activation frames for local
867         variables, for example:
868
869         for (int i = 0; i < 10; i++)
870                 for (int j = 0; j < 10; j++){
871                    MyDelegate d = delegate {
872                         call (i, j);
873                    }
874                 }
875
876         At runtime this captures a single captured variable `i', but it
877         captures 10 different versions of the variable `j'.  The variable
878         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
879         recorded on a child.  
880
881         The toplevel ScopeInfo will also track information like the `this'
882         pointer if instance variables were referenced (this is necessary
883         as the anonymous method lives inside a nested class in the host
884         type of the method). 
885
886         (AnonymousMethod): Expanded to track the Toplevel, implement
887         `AnonymousMethod.Compatible' to tell whether an anonymous method
888         can be converted to a target delegate type. 
889
890         The routine now also produces the anonymous method content
891
892         (AnonymousDelegate): A helper class that derives from
893         DelegateCreation, this is used to generate the code necessary to
894         produce the delegate for the anonymous method that was created. 
895
896         * assign.cs: API adjustments for new changes in
897         Convert.ImplicitStandardConversionExists.
898
899         * class.cs: Adjustments to cope with the fact that now toplevel
900         blocks are of type `ToplevelBlock'. 
901
902         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
903         insteda of standard blocks.
904
905         Flag errors if params arguments are passed to anonymous methods.
906
907         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
908         `CurrentAnonymousMethod' which points to the current Anonymous
909         Method.  The variable points to the AnonymousMethod class that
910         holds the code being compiled.  It is set in the new EmitContext
911         created for the anonymous method.
912
913         (EmitContext.Phase): Introduce a variable and an enumeration to
914         assist in enforcing some rules about when and where we are allowed
915         to invoke certain methods (EmitContext.NeedsReturnLabel is the
916         only one that enfonces this right now).
917
918         (EmitContext.HaveCaptureInfo): new helper method that returns
919         whether we have a CapturedContext initialized.
920
921         (EmitContext.CaptureVariable): New method used to register that a
922         LocalInfo must be flagged for capturing. 
923
924         (EmitContext.CapturedParameter): New method used to register that a
925         parameters must be flagged for capturing. 
926         
927         (EmitContext.CapturedField): New method used to register that a
928         field must be flagged for capturing. 
929
930         (EmitContext.HaveCapturedVariables,
931         EmitContext.HaveCapturedFields): Return whether there are captured
932         variables or fields. 
933
934         (EmitContext.EmitMethodHostInstance): This is used to emit the
935         instance for the anonymous method.  The instance might be null
936         (static methods), this (for anonymous methods that capture nothing
937         and happen to live side-by-side with the current method body) or a
938         more complicated expression if the method has a CaptureContext.
939
940         (EmitContext.EmitTopBlock): Routine that drives the emission of
941         code: it will first resolve the top block, then emit any metadata
942         and then emit the code.  The split is done so that we can extract
943         any anonymous methods and flag any captured variables/parameters.
944         
945         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
946         during this phase, the ILGenerator should not be used as labels
947         and local variables declared here might not be accessible to any
948         code that is part of an anonymous method.  
949
950         Exceptions to this include the temporary variables that are
951         created by some statements internally for holding temporary
952         variables. 
953         
954         (EmitContext.EmitMeta): New routine, in charge of emitting all the
955         metadata for a cb
956
957         (EmitContext.TemporaryReturn): This method is typically called
958         from the Emit phase, and its the only place where we allow the
959         ReturnLabel to be defined other than the EmitMeta.  The reason is
960         that otherwise we would have to duplicate a lot of logic in the
961         Resolve phases of various methods that today is on the Emit
962         phase. 
963
964         (EmitContext.NeedReturnLabel): This no longer creates the label,
965         as the ILGenerator is not valid during the resolve phase.
966
967         (EmitContext.EmitThis): Extended the knowledge in this class to
968         work in anonymous methods in addition to iterators. 
969
970         (EmitContext.EmitCapturedVariableInstance): This emits whatever
971         code is necessary on the stack to access the instance to a local
972         variable (the variable will be accessed as a field).
973
974         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
975         EmitContext.EmitAddressOfParameter): Routines to support
976         parameters (not completed at this point). 
977         
978         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
979         will also remove the parameters.
980
981         * convert.cs (Convert): Define a `ConstantEC' which points to a
982         null.  This is just to prefity some code that uses
983         ImplicitStandardConversion code and do not have an EmitContext
984         handy.
985
986         The idea is to flag explicitly that at that point in time, it is
987         known that the conversion will not trigger the delegate checking
988         code in implicit conversions (which requires a valid
989         EmitContext). 
990
991         Everywhere: pass new EmitContext parameter since
992         ImplicitStandardConversionExists now requires it to check for
993         anonymous method conversions. 
994
995         (Convert.ImplicitStandardConversionExists): If the type of an
996         expression is the anonymous_method_type, and the type is a
997         delegate, we invoke the AnonymousMethod.Compatible method to check
998         whether an implicit conversion is possible. 
999
1000         (Convert.ImplicitConversionStandard): Only do implicit method
1001         group conversions if the language level is not ISO_1.
1002
1003         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1004         MethodInfo for the Invoke method.  used by Delegate and
1005         AnonymousDelegate.
1006
1007         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1008         method conversions if the target type is a delegate.
1009
1010         Removed extra debugging nops.
1011
1012         (LocalVariableReference): Turn the `local_info' into a public
1013         field. 
1014
1015         Add `prepared' field, the same hack used for FieldExprs to cope
1016         with composed assignments, as Local variables do not necessarily
1017         operate purely on the stack as they used to: they can be captured
1018         fields. 
1019
1020         Add `temp' for a temporary result, like fields.
1021
1022         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1023
1024         It now copes with Local variables that are captured and emits the
1025         proper instance variable to load it from a field in the captured
1026         case. 
1027
1028         (ParameterReference.DoResolveBase): During the resolve phase,
1029         capture parameters if we are in an anonymous method.
1030
1031         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1032         anonymous method, use the EmitContext helper routines to emit the
1033         parameter reference.
1034
1035         * iterators.cs: Set RemapToProxy to true/false during the
1036         EmitDispose class.
1037
1038         * parameters.cs (GetParameterByName): New helper method. 
1039
1040         * typemanager.cs (anonymous_method_type) a new type that
1041         represents an anonyous method.  This is always an internal type,
1042         used as a fencepost to test against the anonymous-methodness of an
1043         expression. 
1044         
1045 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1046
1047         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1048         561 report.
1049         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1050
1051 2004-11-10  Martin Baulig  <martin@ximian.com>
1052
1053         * expression.cs (Invocation.BetterFunction): If two methods have
1054         equal parameter types, but only one of them is generic, the
1055         non-generic one wins.
1056         (New.DoResolve): Don't set `is_struct' to false if we're a generic
1057         instance; just use `Type.IsValueType' to determine whether
1058         something is a struct or not.
1059         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
1060         so we can be called multiple times.
1061
1062 2004-11-10  Martin Baulig  <martin@ximian.com>
1063
1064         * generic.cs (TypeParameter.DefineConstraints): New public method.
1065         (TypeParameter.CheckAccessLevel): Override this and return true.
1066         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
1067         override ResolveType() anymore.
1068         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
1069
1070 2004-11-10  Martin Baulig  <martin@ximian.com>
1071
1072         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
1073         call DeclSpace.ResolveNestedType() on it.
1074
1075 2004-11-10  Martin Baulig  <martin@ximian.com>
1076
1077         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
1078         non-null, call ParameterModifier() on it.
1079
1080 2004-11-10  Martin Baulig  <martin@ximian.com>
1081
1082         * iterators.cs
1083         (Iterators): Added `current_type' and `this_type' fields.
1084         (Iterators.DefineIterator): Create a new EmitContext and store it
1085         in `ec'; compute `this_type'.
1086
1087 2004-11-10  Martin Baulig  <martin@ximian.com>
1088
1089         * typemanager.cs
1090         (TypeManager.IsPrivateAccessible): New public method.
1091         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
1092
1093 2004-11-10  Martin Baulig  <martin@ximian.com>
1094
1095         * class.cs (TypeContainer.DefineType): Call
1096         TypeBuilder.DefineGenericParameters() before resolving the type
1097         parameters.
1098         (MethodData.parent_method): New protected field.
1099         (MethodData..ctor): Added `MethodInfo parent_method' argument.
1100         (MethodData.Define): Compute `parent_method'.
1101
1102         * decl.cs
1103         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
1104         (MemberCore.GetClsCompliantAttributeValue): Likewise.
1105         (DeclSpace.ec): New protected field; store the EmitContext here.
1106         (DeclSpace.EmitContext): New public property.
1107         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
1108         (DeclSpace.ResolveNestedType): New public method.
1109         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
1110         (DeclSpace.NestedAccessible): Added `Type tb' argument.
1111         (DeclSpace.FamilyAccessible): Likewise.
1112         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
1113         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
1114         EmitContext.
1115
1116         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
1117         field.
1118
1119         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
1120         (Enum.Emit): Don't create a new EmitContext.
1121
1122 2004-10-18  Martin Baulig  <martin@ximian.com>
1123
1124         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1125         `Type' directly, but call ResolveType() on it.
1126         (Catch.Resolve): Likewise.
1127         (Foreach.Resolve): Likewise.
1128
1129 2004-10-18  Martin Baulig  <martin@ximian.com>
1130
1131         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1132         `Type' directly, but call ResolveType() on it.
1133         (Probe.DoResolve): Likewise.
1134         (ArrayCreation.LookupType): Likewise.
1135         (TypeOf.DoResolve): Likewise.
1136         (SizeOf.DoResolve): Likewise.
1137
1138 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1139
1140         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1141         the ResolveType.
1142
1143 2004-10-17  John Luke  <john.luke@gmail.com>
1144
1145         * class.cs (Operator.GetSignatureForError): use CSharpName
1146
1147         * parameter.cs (Parameter.GetSignatureForError): Returns
1148         correct name even if was not defined.
1149
1150 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1151
1152         Fix #65816.
1153         * class.cs (TypeContainer.EmitContext): New property.
1154         (DefineNestedTypes): Create an emitcontext for each part.
1155         (MethodCore.DoDefineParameters): Use container's emitcontext.
1156         Pass type array to InternalParameters.
1157         (MemberBase.DoDefine): Use container's emitcontext.
1158         (FieldMember.Define): Likewise.
1159         (Event.Define): Likewise.
1160         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1161         Pass type array to InternalParameters.
1162         (SetIndexerMethod.GetParameterInfo): Likewise.
1163         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1164         * delegate.cs (Define): Pass emitcontext to
1165         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1166         array to InternalParameters.
1167         * expression.cs (ParameterReference.DoResolveBase): Pass
1168         emitcontext to GetParameterInfo.
1169         (ComposedCast.DoResolveAsTypeStep): Remove check on
1170         ec.ResolvingTypeTree.
1171         * parameter.cs (Parameter.Resolve): Change argument to
1172         EmitContext.  Use ResolveAsTypeTerminal.
1173         (Parameter.GetSignature): Change argument to EmitContext.
1174         (Parameters.ComputeSignature): Likewise.
1175         (Parameters.ComputeParameterTypes): Likewise.
1176         (Parameters.GetParameterInfo): Likewise.
1177         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1178         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1179         * support.cs (InternalParameters..ctor): Remove variant that takes
1180         a DeclSpace.
1181         * typemanager.cs (system_intptr_expr): New.
1182         (InitExpressionTypes): Initialize it.
1183
1184 2004-10-12  Chris Toshok  <toshok@ximian.com>
1185
1186         * cs-parser.jay: fix location for try_statement and catch_clause.
1187
1188 2004-10-18  Martin Baulig  <martin@ximian.com>
1189
1190         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1191         `Type' directly, but call ResolveType() on it.
1192         (MemberBase.DoDefine): Likewise.
1193
1194         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1195         `Type' directly, but call ResolveType() on it.
1196         (ComposedCast.DoResolveAsTypeStep): Likewise.
1197
1198         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1199         `Type' directly, but call ResolveType() on it.
1200
1201 2004-10-17  John Luke  <john.luke@gmail.com>
1202
1203         * class.cs (Operator.GetSignatureForError): use CSharpName
1204
1205         * parameter.cs (Parameter.GetSignatureForError): Returns
1206         correct name even if was not defined.
1207
1208 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1209
1210         Fix #65816.
1211         * class.cs (TypeContainer.EmitContext): New property.
1212         (DefineNestedTypes): Create an emitcontext for each part.
1213         (MethodCore.DoDefineParameters): Use container's emitcontext.
1214         Pass type array to InternalParameters.
1215         (MemberBase.DoDefine): Use container's emitcontext.
1216         (FieldMember.Define): Likewise.
1217         (Event.Define): Likewise.
1218         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1219         Pass type array to InternalParameters.
1220         (SetIndexerMethod.GetParameterInfo): Likewise.
1221         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1222         * delegate.cs (Define): Pass emitcontext to
1223         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1224         array to InternalParameters.
1225         * expression.cs (ParameterReference.DoResolveBase): Pass
1226         emitcontext to GetParameterInfo.
1227         (ComposedCast.DoResolveAsTypeStep): Remove check on
1228         ec.ResolvingTypeTree.
1229         * parameter.cs (Parameter.Resolve): Change argument to
1230         EmitContext.  Use ResolveAsTypeTerminal.
1231         (Parameter.GetSignature): Change argument to EmitContext.
1232         (Parameters.ComputeSignature): Likewise.
1233         (Parameters.ComputeParameterTypes): Likewise.
1234         (Parameters.GetParameterInfo): Likewise.
1235         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1236         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1237         * support.cs (InternalParameters..ctor): Remove variant that takes
1238         a DeclSpace.
1239         * typemanager.cs (system_intptr_expr): New.
1240         (InitExpressionTypes): Initialize it.
1241
1242 2004-10-12  Chris Toshok  <toshok@ximian.com>
1243
1244         * cs-parser.jay: fix location for try_statement and catch_clause.
1245
1246 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1247
1248         More DeclSpace.ResolveType avoidance.
1249         * decl.cs (MemberCore.InUnsafe): New property.
1250         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1251         with newly created EmitContext.
1252         (FieldMember.Define): Likewise.
1253         * delegate.cs (Delegate.Define): Likewise.
1254         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1255         only if normal name-lookup fails.
1256         (TypeExpr.DoResolve): Enable error-checking.
1257         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1258         (SizeOf.DoResolve): Likewise.
1259         (ComposedCast.DoResolveAsTypeStep): Likewise.
1260         (StackAlloc.DoResolve): Likewise.
1261         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1262         (Block.Unsafe): New property.
1263         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1264         (Unsafe): Set 'unsafe' flag of contained block.
1265         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1266         (Fixed.Resolve): Likewise.
1267         (Catch.Resolve): Likewise.
1268         (Using.ResolveLocalVariableDecls): Likewise.
1269         (Foreach.Resolve): Likewise.
1270
1271 2004-10-05  John Luke <john.luke@gmail.com>
1272
1273         * cs-parser.jay: add location to error CS0175
1274
1275 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1276
1277         * ecore.cs (Expression.Constantity): Add support for turning null
1278         into a constant.
1279
1280         * const.cs (Const.Define): Allow constants to be reference types
1281         as long as the value is Null.
1282
1283 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1284
1285         * namespace.cs (NamespaceEntry.Using): No matter which warning
1286         level is set, check if this namespace name has already been added.
1287
1288 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1289
1290         * expression.cs: reftype [!=]= null should always use br[true,false].
1291         # 67410
1292
1293 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1294
1295         Fix #67108
1296         * attribute.cs: Enum conversion moved to 
1297         GetAttributeArgumentExpression to be applied to the all
1298         expressions.
1299
1300 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1301
1302         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1303         * class.c (TypeContainer.DefineType): Flag error if
1304         base types aren't accessible due to access permissions.
1305         * decl.cs (DeclSpace.ResolveType): Move logic to
1306         Expression.ResolveAsTypeTerminal.
1307         (DeclSpace.ResolveTypeExpr): Thin layer over
1308         Expression.ResolveAsTypeTerminal.
1309         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1310         Refactor code into NestedAccess.  Use it.
1311         (DeclSpace.NestedAccess): New.
1312         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1313         argument to silence errors.  Check access permissions.
1314         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1315         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1316         (Cast.DoResolve): Likewise.
1317         (New.DoResolve): Likewise.
1318         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1319         (TypeOf.DoResolve): Likewise.
1320
1321         * expression.cs (Invocation.BetterConversion): Return the Type of
1322         the better conversion.  Implement section 14.4.2.3 more faithfully.
1323         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1324         section 14.4.2.2 explicit.
1325         (Invocation.OverloadResolve): Update.
1326         (Invocation): Remove is_base field.
1327         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1328         (Invocation.Emit): Likewise.
1329
1330 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1331
1332         * cs-parser.jay: Reverted 642 warning fix.
1333
1334 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1335
1336         Fix bug #66615
1337         * decl.cs (FindMemberWithSameName): Indexer can have more than
1338         1 argument.
1339
1340 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1341
1342         * expression.cs (LocalVariableReference.DoResolveLValue):
1343         Do not report warning 219 for out values.
1344         (EmptyExpression.Null): New member to avoid extra allocations.
1345
1346 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1347
1348         * cs-parser.jay: Fix wrong warning 642 report.
1349
1350         * cs-tokenizer.cs (CheckNextToken): New helper;
1351         Inspect next character if is same as expected.
1352
1353 2004-09-23  Martin Baulig  <martin@ximian.com>
1354
1355         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1356         (Convert.ImplicitReferenceConversionExists): Likewise.
1357
1358 2004-11-09  Raja R Harinath  <rharinath@novell.com>
1359
1360         * Makefile (DISTFILES): Comment out a few missing files.
1361
1362 2004-10-29  Raja R Harinath  <rharinath@novell.com>
1363
1364         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
1365         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
1366         (gmcs.exe): Invoke bootstrap-libs.
1367         (clean-local): Clean the net_2_0_bootstrap profile too.
1368         (PROGRAM_INSTALL_DIR): New.
1369         (install-local): Use it.
1370
1371 2004-10-13  Martin Baulig  <martin@ximian.com>
1372
1373         * generic.cs (TypeManager.InflatedConstraints): New nested class.
1374         (TypeParameter.DefineType): If we're a method type parameter and
1375         that method is overriding something, "inflate" its constraints.
1376
1377 2004-10-12  Martin Baulig  <martin@ximian.com>
1378
1379         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
1380         and have type arguments, create and resolve a ConstructedType.
1381
1382 2004-10-12  Martin Baulig  <martin@ximian.com>
1383
1384         * decl.cs (MemberCache.FindMemberToOverride): Use
1385         TypeManager.IsEqual() to compare the parameters and Type.Equals()
1386         to compare the invocationType.
1387
1388         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
1389         When comparing two type parameters, only do the signature-only
1390         comparision for method type parameters.
1391
1392 2004-10-11  Martin Baulig  <martin@ximian.com>
1393
1394         * report.cs: Don't make --fatal abort on warnings, we have
1395         -warnaserror for that.
1396
1397 2004-10-11  Martin Baulig  <martin@ximian.com>
1398
1399         * typemanager.cs
1400         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
1401         (TypeManager.IsEqual): Call ourself recursively instead of using
1402         Type.IsEqual(). 
1403
1404 2004-10-11  Martin Baulig  <martin@ximian.com>
1405
1406         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
1407         on our own type parameters, not on the ones we inherit from a containing
1408         class.
1409
1410         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
1411         the comparision.
1412
1413         * generic.cs (TypeParameter.Define): We may only be called once.
1414
1415         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
1416         instead of TypeManager.IsEqual().
1417
1418 2004-09-28  Martin Baulig  <martin@ximian.com>
1419
1420         * generic.cs
1421         (GenericConstraints.EffectiveBaseClass): New public property.
1422         (TypeParameter.GenericConstraints): New public property.
1423         (ConstructedType.CheckConstraints): Improved.
1424
1425         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
1426         (Convert.TypeParameterConversion): New private method; use this in
1427         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
1428         for all conversions related to type parameters.
1429
1430 2004-09-24  Martin Baulig  <martin@ximian.com>
1431
1432         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
1433         type parameter conversions for type parameters which are known to
1434         be reference types.
1435
1436 2004-09-24  Martin Baulig  <martin@ximian.com>
1437
1438         * generic.cs (GenericConstraints): Added `IsReferenceType' and
1439         `IsValueType' properties.
1440
1441         * support.cs (ReflectionConstraints): Use
1442         Type.GetGenericParameterConstraints() instead of the old hack.
1443
1444 2004-09-24  Martin Baulig  <martin@ximian.com>
1445
1446         * generic.cs (GenericConstraints): Moved here and made it an
1447         abstract class.
1448
1449         * support.cs (GenericConstraints): Moved to generic.cs.
1450
1451 2004-09-24  Martin Baulig  <martin@ximian.com>
1452
1453         * support.cs
1454         (ReflectionConstraints): Un-nested this class and made it public.
1455
1456         * typemanager.cs
1457         (TypeManager.GetTypeParameterConstraints): New public method.
1458         (TypeManager.HasConstructorConstraint): Use the attributes.
1459
1460 2004-09-24  Martin Baulig  <martin@ximian.com>
1461
1462         * support.cs (GenericConstraints): Replaced `HasConstructor',
1463         `IsReferenceType' and `IsValueType' with `Attributes'.
1464         (ReflectionParameters.ReflectionConstraints): Removed the Create()
1465         method and made the .ctor public.
1466
1467         * generic.cs (Constraints.Attributes): New public property.
1468         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
1469         `IsReferenceType' -> `HasReferenceTypeConstraint' and
1470         `IsValueType' -> `HasValueTypeConstraint'.
1471
1472 2004-09-23  Martin Baulig  <martin@ximian.com>
1473
1474         * generic.cs (Constraints): Reflect latest runtime changes.
1475
1476 2004-09-23  Martin Baulig  <martin@ximian.com>
1477
1478         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1479         (Convert.ImplicitReferenceConversionExists): Likewise.
1480
1481 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1482
1483         * class.cs (Operator.Define): Add error 448 and 559 report.
1484         
1485 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1486
1487         * class.cs (MemberBase.IsTypePermitted): New protected
1488         method for checking error CS0610.
1489
1490 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1491
1492         * class.cs (TypeContainer.HasExplicitLayout): New property
1493         Returns whether container has StructLayout attribute set Explicit.
1494         (FieldMember): New abstract class for consts and fields.
1495         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1496         (Field): Reuse FieldMember.
1497
1498         * const.cs (Const): Reuse FieldMember.
1499
1500         * rootcontext.cs: EmitConstants call moved to class.
1501
1502 2004-09-22  Martin Baulig  <martin@ximian.com>
1503
1504         Marek and me just fixed one of our oldest bugs: #28562 :-)
1505
1506         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1507
1508         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1509         we're an EnumConstant, just return that.
1510         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1511         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1512         to get the value which'll actually be written into the attribute.
1513         However, we have to use GetValue() to access the attribute's value
1514         in the compiler.        
1515
1516 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1517
1518         * constant.cs (Constant.IsNegative): New abstract property
1519         IsNegative.
1520
1521         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1522         (StackAlloc.DoResolve): Reused IsNegative.
1523
1524 2004-09-22  Martin Baulig  <martin@ximian.com>
1525
1526         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
1527         public method; like LookupTypeContainer, but also works for
1528         generic instances.
1529
1530         * report.cs (Report.SymbolRelatedToPreviousError): Use
1531         TypeManager.LookupGenericTypeContainer().       
1532
1533 2004-09-22  Martin Baulig  <martin@ximian.com>
1534
1535         Thanks to Peter Sestoft for this bug report.
1536
1537         * expression.cs (Conditional): If both the `trueExpr' and the
1538         `falseExpr' is a NullLiteral, return a NullLiteral.
1539
1540 2004-09-22  Martin Baulig  <martin@ximian.com>
1541
1542         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1543         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1544         for the "get_Current" call.
1545
1546 2004-09-21  Martin Baulig  <martin@ximian.com>
1547
1548         * convert.cs (Convert.ImplicitReferenceConversion): When
1549         converting to an interface type, first check whether we're
1550         converting from a reference type.
1551
1552 2004-09-14  Martin Baulig  <martin@ximian.com>
1553
1554         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1555
1556 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1557
1558         Fixed bug #61902
1559         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1560         called and is obsolete then this member suppress message
1561         when call is inside next [Obsolete] method or type.
1562
1563         * expression.cs: Use TestObsoleteMethodUsage member.
1564
1565 2004-09-14  Martin Baulig  <martin@ximian.com>
1566
1567         * genericparser.cs: Removed.
1568
1569 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1570
1571         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1572
1573 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1574
1575         * attribute.cs (Attribute.Resolve): Add error 653 report.
1576
1577         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1578         report.
1579         (Method.ApplyAttributeBuilder): Add error 685 report.
1580         (Operator.Define): Add error 564 report.
1581
1582         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1583
1584         * expression.cs (Invocation.DoResolve): Add error
1585         245 and 250 report.
1586
1587         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1588         error 674 report.
1589
1590 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1591
1592         * class.cs (ConstructorInitializer.Resolve):
1593         Wrong error number (515->516).
1594
1595 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1596
1597         * class.cs (Indexer.Define): Add error 631 report.
1598
1599 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1600
1601         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1602
1603 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1604
1605         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1606
1607 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1608
1609         * cs-parser.jay: Added error CS0241 report.
1610
1611 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1612
1613         * cs-parser.jay (fixed_statement): Introduce a scope for the
1614         declaration in the 'fixed' statement.
1615
1616 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1617
1618         * cs-parser.jay: Added CS0230 error report.
1619
1620 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1621
1622         * cs-parser.jay: Added errors CS0231 and CS0257 report.
1623
1624 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1625
1626         * expression.cs (Argument.Resolve): Added error CS0192 and
1627         CS0199 report.
1628
1629 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
1630
1631         C# 2.0 #pragma warning feature
1632
1633         * cs-tokenizer.cs (PreProcessPragma): New method; 
1634         Handles #pragma directive.
1635
1636         * report.cs (WarningRegions): New class; Support
1637         class for #pragma warning directive. It tests whether
1638         warning is enabled for a given line.
1639
1640 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
1641
1642         * const.cs: Add more descriptive error report, tahnks to
1643         Sebastien. 
1644
1645 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
1646
1647         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
1648
1649 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
1650
1651         * expression.cs: Apply patch from Ben: Remove dead code from
1652         ArrayCreation, and remove the TurnintoConstant call in const.cs,
1653         as that code just threw an exception anwyays.
1654
1655         * const.cs: Remove the call to the turnintoconstant, for details
1656         see bug: #63144
1657         
1658         * literal.cs: The type of the null-literal is the null type;  So
1659         we use a placeholder type (literal.cs:System.Null, defined here)
1660         for it.
1661
1662         * expression.cs (Conditional.DoResolve): Remove some old code that
1663         is no longer needed, conversions have been fixed.
1664
1665         (ArrayCreationExpression.DoResolve): Return false if we fail to
1666         resolve the inner expression.
1667
1668 2004-09-07  Raja R Harinath  <rharinath@novell.com>
1669
1670         Fix test-290.cs.
1671         * cs-parser.jay (delegate_declaration): Record a delegate
1672         declaration as a type declaration.
1673         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
1674
1675 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
1676
1677         * parameter.cs: Do not crash if the type can not be resolved. 
1678
1679         * expression.cs: Report errors with unsafe pointers, fixes #64896
1680
1681 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
1682
1683         * expression.cs: Pointer arith always needs to do a conv.i
1684         if the operand is a long. fix 65320
1685
1686 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1687
1688         Fixed cs0619-37.cs, cs0619-38.cs
1689
1690         * enum.cs (GetObsoleteAttribute): Removed.
1691
1692         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
1693         on Enum member is double staged. The first is tested member
1694         and then enum.
1695
1696 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
1697
1698         Fixed #56986, #63631, #65231
1699
1700         * class.cs: (TypeContainer.AddToMemberContainer): New method,
1701         adds member to name container.
1702         (TypeContainer.AddToTypeContainer): New method, adds type to
1703         name container.
1704         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
1705         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
1706         AddOperator): Simplified by reusing AddToMemberContainer.
1707         (TypeContainer.UserDefinedStaticConstructor): Changed to property
1708         instead of field.
1709         (Method.CheckForDuplications): Fixed implementation to test all
1710         possibilities.
1711         (MemberBase): Detection whether member is explicit interface
1712         implementation is now in constructor.
1713         (MemberBase.UpdateMemberName): Handles IndexerName.
1714         (Accessor): Changed to keep also location information.
1715         (AbstractPropertyEventMethod): Is derived from MemberCore.
1716         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
1717         will be emited or not.
1718         (PropertyBase.AreAccessorsDuplicateImplementation):
1719         Tests whether accessors are not in collision with some method.
1720         (Operator): Is derived from MethodCore to simplify common
1721         operations.
1722
1723         * decl.cs (Flags.TestMethodDuplication): Test for duplication
1724         must be performed.
1725         (DeclSpace.AddToContainer): Adds the member to defined_names
1726         table. It tests for duplications and enclosing name conflicts.
1727
1728         * enum.cs (EnumMember): Clean up to reuse the base structures
1729
1730 2004-09-03  Martin Baulig  <martin@ximian.com>
1731
1732         Merged latest changes into gmcs.  Please keep this comment in
1733         here, it makes it easier for me to see what changed in MCS since
1734         the last time I merged.
1735
1736 2004-09-03  Martin Baulig  <martin@ximian.com>
1737
1738         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1739         into TypeContainer, to make partial classes work again.
1740
1741 2004-09-03  Martin Baulig  <martin@ximian.com>
1742
1743         * rootcontext.cs (RootContext.V2): Removed.
1744
1745 2004-03-23  Martin Baulig  <martin@ximian.com>
1746
1747         * expression.cs (Invocation.OverloadResolve): Added `bool
1748         may_fail' argument and use it instead of the Location.IsNull() hack.
1749
1750 2004-09-09  Martin Baulig  <martin@ximian.com>
1751
1752         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
1753
1754 2004-09-09  Martin Baulig  <martin@ximian.com>
1755
1756         * generic.cs (TypeParameter.DefineType): Added support for
1757         explicit interface methods.
1758
1759 2004-09-09  Martin Baulig  <martin@ximian.com>
1760
1761         * README.Changes: New document.  Started to list important changes
1762         between MCS and GMCS here.
1763
1764 2004-09-08  Martin Baulig  <martin@ximian.com>
1765
1766         * class.cs
1767         (TypeContainer.CheckRecursiveDefinition): New protected method.
1768         (TypeContainer.DefineType): Move the CS0146 check into
1769         CheckRecursiveDefinition().     
1770
1771 2004-09-06  Martin Baulig  <martin@ximian.com>
1772
1773         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
1774         types for the constructor constraint.
1775
1776 2004-09-03  Martin Baulig  <martin@ximian.com>
1777
1778         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
1779         into TypeContainer, to make partial classes work again.
1780
1781 2004-09-03  Martin Baulig  <martin@ximian.com>
1782
1783         * rootcontext.cs (RootContext.V2): Removed.
1784
1785 2004-03-23  Martin Baulig  <martin@ximian.com>
1786
1787         * expression.cs (Invocation.OverloadResolve): Added `bool
1788         may_fail' argument and use it instead of the Location.IsNull() hack.
1789
1790 2004-09-03  Martin Baulig  <martin@ximian.com>
1791
1792         Merged latest changes into gmcs.  Please keep this comment in
1793         here, it makes it easier for me to see what changed in MCS since
1794         the last time I merged.
1795
1796 2004-09-03  Raja R Harinath  <rharinath@novell.com>
1797
1798         Fix #61128.
1799         * expression.cs (BetterConversion): Don't allow either conversion 
1800         to be null.  Remove redundant implicit conversion test when 'q ==
1801         null' -- when this function is invoked, we already know that the
1802         implicit conversion exists.
1803         (BetterFunction): Assume that 'best' is non-null.  Remove
1804         redundant reimplementation of IsApplicable when 'best' is null.
1805         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
1806         number of arguments.
1807         (IsAncestralType): Extract from OverloadResolve.
1808         (OverloadResolve): Make robust to the MethodGroupExpr being
1809         unsorted.  Implement all the logic of Section 14.5.5.1, and
1810         support overloading of methods from multiple applicable types.
1811         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
1812
1813         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
1814         (RealError, Warning): Append type of report to related symbol.
1815
1816 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
1817
1818         * enum.cs: Fixed CLS-Compliance checks for enum members.
1819         Error tests cs3008-8.cs, cs3014-8.cs
1820
1821 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1822
1823         Fixed bug #62342, #63102
1824         * class.cs: ImplementIndexer uses member.IsExplicitImpl
1825         like ImplementMethod.
1826
1827 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
1828
1829         * attribute.cs (Attribute.GetAttributeArgumentExpression):
1830         Fixed bug #65170.
1831
1832 2004-09-02  Martin Baulig  <martin@ximian.com>
1833
1834         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1835         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1836         on the MethodBase.
1837
1838 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
1839
1840         C# 2.0 Static classes implemented
1841
1842         * class.cs (TypeContainer): instance_constructors,
1843         initialized_fields, initialized_static_fields,
1844         default_constructor, base_inteface_types are protected to be
1845         accessible from StaticClass.
1846         (TypeContainer.DefineDefaultConstructor): New virtual method
1847         for custom default constructor generating
1848         (StaticClass): New class to handle "Static classes" feature.
1849
1850         * cs-parser.jay: Handle static keyword on class like instance
1851         of StaticClass.
1852
1853         * driver.cs: Added "/langversion" command line switch with two
1854         options (iso-1, default).
1855
1856 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
1857
1858         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
1859
1860 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
1861
1862         * delegate.cs: Style.
1863
1864 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
1865
1866         * delegate.cs: Add seperate instance expr field for miguel.
1867
1868 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1869
1870         * PointerArithmetic (Resolve): make sure we are not doing
1871         pointer arith on void*. Also, make sure we are resolved
1872         by not setting eclass until resolve.
1873
1874         All callers: Make sure that PointerArithmetic gets resolved.
1875
1876 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1877
1878         * ArrayCreation (LookupType): If the type does not resolve 
1879         to an array, give an error.
1880
1881 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
1882
1883         * statement.cs (Try.Resolve): Fixed bug #64222
1884
1885 2004-08-27  Martin Baulig  <martin@ximian.com>
1886
1887         * class.cs
1888         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1889         crash here.     
1890
1891 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1892
1893         * ecore.cs (Constantify): Get underlying type via
1894         System.Enum.GetUnderlyingType to avoid StackOverflow on the
1895         Windows in special cases.
1896
1897 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
1898
1899         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
1900         for obtaining also private methods.
1901         (GetRemoveMethod): Used GetRemoveMethod (true)
1902         for obtaining also private methods.
1903
1904 2004-09-02  Martin Baulig  <martin@ximian.com>
1905
1906         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
1907         TypeManager.GetArgumentTypes() rather than calling GetParameters()
1908         on the MethodBase.
1909
1910 2004-08-27  Martin Baulig  <martin@ximian.com>
1911
1912         * class.cs
1913         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
1914         crash here.     
1915
1916 2004-08-25  Martin Baulig  <martin@ximian.com>
1917
1918         * support.cs (ReflectionParameters..ctor): If this is a generic
1919         method, retrieve and store its type parameters.
1920         (InternalParameters..ctor): Added `TypeParameter[]' argument.
1921         (ReflectionParameters.GenericConstraints): The argument specifies
1922         the type parameter, not the method parameter.
1923         (InternalParameters.GenericConstraints): Likewise.
1924
1925         * generic.cs (TypeParameter.DefineType): Correctly handle
1926         constraints wrt. generic methods in interfaces and their
1927         implementations.        
1928
1929 2004-08-24  Martin Baulig  <martin@ximian.com>
1930
1931         * generic.cs (TypeParameter.IsSubclassOf): New public method.
1932         (Constraints.IsSubclassOf): New internal method.
1933
1934         * typemanager.cs (TypeManager.FindMembers): Added special support
1935         for GenericTypeParameterBuilder's.      
1936         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
1937         type parameters.
1938
1939 2004-08-24  Martin Baulig  <martin@ximian.com>
1940
1941         * typemanager.cs
1942         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
1943         this for accessibility checks.
1944         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
1945         IsNestedFamilyAccessible.
1946         (TypeManager.IsSubclassOf): New method, do what the name actually
1947         says.   
1948
1949 2004-08-24  Martin Baulig  <martin@ximian.com>
1950
1951         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
1952         as a SimpleName, include the generic arity.
1953
1954 2004-08-24  Martin Baulig  <martin@ximian.com>
1955
1956         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
1957         MethodAttributes.HideBySig for operators.
1958
1959 2004-08-23  Martin Baulig  <martin@ximian.com>
1960
1961         Back to the old error reporting system :-)
1962
1963         * report.cs (Message): Removed.
1964         (Report.MessageData, ErrorData, WarningData): Removed.
1965         (Report.Error, Warning): Back to the old system.
1966
1967 2004-08-23  Martin Baulig  <martin@ximian.com>
1968
1969         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
1970
1971         * class.cs (TypeContainer.ParentContainer): New public virtual
1972         method; replaces the explicit interface implementation.
1973         (ClassPart.ParentContainer): Override.
1974
1975 2004-08-23  Martin Baulig  <martin@ximian.com>
1976
1977         * statement.cs (Switch): Added support for constant switches; see
1978         #59428 or test-285.cs.
1979
1980 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1981
1982         Fixed bug #62740.
1983         * statement.cs (GetEnumeratorFilter): Removed useless
1984         logic because C# specs is strict. GetEnumerator must be
1985         public.
1986
1987 2004-08-22  Martin Baulig  <martin@ximian.com>
1988
1989         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
1990         a switch and may break, reset the barrier.  Fixes #59867.
1991
1992 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
1993
1994         CLS-Compliance speed up (~5% for corlib)
1995
1996         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
1997         New method. Tests container for CLS-Compliant names
1998
1999         * class.cs (TypeContainer.VerifyClsName): New method.
2000         Checks whether container name is CLS Compliant.
2001         (Constructor): Implements IMethodData.
2002
2003         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2004         low-case table for CLS Compliance test.
2005         (MemberCache.VerifyClsParameterConflict): New method.
2006         Checks method parameters for CS3006 error.
2007
2008         * enum.cs (EnumMember): Is derived from MemberCore.
2009         (Enum.VerifyClsName): Optimized for better performance.
2010
2011 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2012
2013         * report.cs: Renamed Error_T to Error and changed all
2014         references.
2015
2016 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2017
2018         * class.cs (TypeContainer.IndexerArrayList): New inner class
2019         container for indexers.
2020         (TypeContainer.DefaultIndexerName): New constant for default
2021         indexer name. Replaced all "Item" with this constant.
2022         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2023
2024         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2025         DefaultMemberAttribute constructor.
2026
2027 2004-08-05  Martin Baulig  <martin@ximian.com>
2028
2029         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2030         Fix bug #59429.
2031
2032 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2033
2034         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2035         multi platforms problem.
2036
2037         * compiler.csproj: Included shared files.
2038
2039 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2040
2041         Fix bug 60333, 55971 in the more general way
2042         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2043         Added arg_type argument for constant conversion.
2044         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2045
2046 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2047
2048         Fix bug #59760
2049         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2050         OperatorArrayList, MethodCoreArrayList for typecontainer
2051         containers. Changed class member types to these new types.
2052         (MethodArrayList.DefineMembers): Added test for CS0659.
2053
2054 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2055
2056         * cfold.cs: Synchronize the folding with the code in expression.cs
2057         Binary.DoNumericPromotions for uint operands.
2058
2059         * attribute.cs: Revert patch from Raja, it introduced a regression
2060         while building Blam-1.2.1 (hard to isolate a test case).
2061
2062 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2063
2064         Fix for #55382
2065         * class.cs:
2066         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2067         name collision.
2068         (MethodCore.parent_method): New member. The method we're overriding
2069         if this is an override method.
2070         (MethodCore.CheckBase): Moved from Method class and made common.
2071         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2072         private.
2073         (MethodCore.CheckForDuplications): New abstract method. For custom
2074         member duplication search in a container
2075         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2076         method and its return type.
2077         (Event.conflict_symbol): New member. Symbol with same name in the
2078         parent class.
2079
2080         * decl.cs:
2081         (MemberCache.FindMemberWithSameName): New method. The method
2082         is looking for conflict with inherited symbols.
2083
2084 2004-08-04  Martin Baulig  <martin@ximian.com>
2085
2086         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2087
2088         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2089
2090 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2091
2092         * report.cs (Message): New enum for better error, warning reference in
2093         the code.
2094         (MessageData): New inner abstract class. It generally handles printing of
2095         error and warning messages.
2096         Removed unused Error, Warning, Message methods.
2097
2098 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2099
2100         Fix for cs0592-8.cs test
2101         * attribute.cs
2102         (Attributable.ValidAttributeTargets): Made public.
2103         (Attribute.ExplicitTarget): New member for explicit target value.
2104         (Attribute.CheckTargets): Now we translate explicit attribute
2105         target to Target here.
2106
2107 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2108
2109         * ecore.cs (MethodGroupExpr): new IsBase property.
2110
2111         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2112
2113         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2114         rather than an instance expr.
2115
2116         (DelegateCreation.Emit): Use the method group rather than
2117         the instance expression. Also, if you have base.Foo as the
2118         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2119
2120         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2121
2122         (NewDelegate.DoResolve): Only check for the existance of Invoke
2123         if the method is going to be needed. Use MethodGroupExpr.
2124
2125         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2126
2127         * expression.cs: For pointer arith., make sure to use
2128         the size of the type, not the size of the pointer to
2129         the type.
2130
2131 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2132
2133         Fix for #60722
2134         * class.cs (Class): Added error CS0502 test.
2135
2136 2004-08-03  John Luke  <jluke@cfl.rr.com>
2137             Raja R Harinath  <rharinath@novell.com>
2138
2139         Fix for #60997.
2140         * attribute.cs (Attribute.complained_before): New flag.
2141         (Attribute.ResolveType, Attribute.Resolve),
2142         (Attribute.DefinePInvokeMethod): Set it.
2143         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2144         
2145 2004-08-03  Martin Baulig  <martin@ximian.com>
2146
2147         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2148         use a user-defined operator; we still need to do numeric
2149         promotions in case one argument is a builtin type and the other
2150         one has an implicit conversion to that type.  Fixes #62322.
2151
2152 2004-08-18  Martin Baulig  <martin@ximian.com>
2153
2154         * class.cs (Method.Define): Use the correct method name when
2155         creating the MethodBuilder for a generic method.
2156
2157 2004-08-17  Martin Baulig  <martin@ximian.com>
2158
2159         * generic.cs (Constraints): Support type parameter constraints.
2160
2161 2004-08-16  Martin Baulig  <martin@ximian.com>
2162
2163         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
2164         (Token.GENERIC_DIMENSION): New token; this is returned if we
2165         encounter an unbound generic type in a typeof() expression.
2166
2167         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
2168         this token is only generated while parsing a typeof() expression.
2169         (typeof_expression): Removed the old unbound_type hack.
2170
2171         * generic.cs (TypeArguments.IsUnbound): New public property.
2172
2173         * decl.cs (MemberName): Added support for unbound types.
2174
2175 2004-08-14  Martin Baulig  <martin@ximian.com>
2176
2177         * typemanager.cs
2178         (TypeManager.IsEqualGenericInstance): New static method.
2179         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
2180         just used to check accessibility, so follow the rules of 26.1.6.        
2181
2182         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
2183         ConstructedType instead of a TypeExpression if we have type arguments.
2184
2185         * cs-parser.jay (typeof_expression): Support unbound generic types.
2186
2187         * ecore.cs (UnboundTypeExpression): New public class.
2188
2189 2004-08-12  Martin Baulig  <martin@ximian.com>
2190
2191         * typemanager.cs (TypeManager.IsNestedChildOf): Use
2192         TypeManager.IsEqual() rather than `=='.
2193
2194         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
2195         generic instances as well.
2196
2197 2004-08-12  Martin Baulig  <martin@ximian.com>
2198
2199         * expression.cs (Invocation.InferType): We can only infer method
2200         type parameters.  Fixes #62647.
2201
2202 2004-08-11  Martin Baulig  <martin@ximian.com>
2203
2204         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
2205         before resolving the base classes.
2206
2207 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
2208
2209         * Makefile: install .mdb file too.
2210
2211 2004-08-05  Martin Baulig  <martin@ximian.com>
2212
2213         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
2214         initializer, the current type is just the TypeBuilder, not the
2215         instantiated generic type.
2216         (FieldExpr.IsFieldInitializer): New public property.
2217
2218 2004-08-04  Martin Baulig  <martin@ximian.com>
2219
2220         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2221
2222         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2223
2224 2004-08-03  Martin Baulig  <martin@ximian.com>
2225
2226         * class.cs (MethodData.Define): If we're an explicit
2227         implementation, remove the generic arity from the type name.
2228
2229 2004-08-03  Martin Baulig  <martin@ximian.com>
2230
2231         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2232         use a user-defined operator; we still need to do numeric
2233         promotions in case one argument is a builtin type and the other
2234         one has an implicit conversion to that type.  Fixes #62322.
2235
2236 2004-08-02  Martin Baulig  <martin@ximian.com>
2237
2238         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
2239         `TypeExpr[]' array.
2240         (TypeContainer.GetClassBases): Return the unexpanded list of
2241         interfaces; we expand them later.
2242         (TypeContainer.DefineType): After creating the TypeBuilder, call
2243         TypeManager.ExpandInterfaces() to get an expanded and resolved
2244         list of interfaces.
2245
2246         * ecore.cs (TypeExpr.GetInterfaces): Removed
2247
2248         * generics.cs (Constraints.InterfaceConstraints): Remove.
2249         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
2250         register the interface constraints.
2251
2252         * typemanager.cs
2253         (TypeManager.AddUserType): Removed the `ifaces' argument.
2254         (TypeManager.AddTypeParameter): Likewise.
2255         (TypeManager.AddUserInterface): Removed, was unused.
2256         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
2257         `TypeExpr[]' array for the interfaces.
2258         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
2259         has been defined, returns a list of the resolved interfaces types.
2260         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
2261         (TypeManager.GetExplicitInterfaces): Likewise.  
2262
2263 2004-08-02  Martin Baulig  <martin@ximian.com>
2264
2265         * expression.cs (Invocation.EmitCall): If we're invoking a method
2266         on a type parameter, use the new `Constrained' prefix opcode.
2267
2268 2004-08-02  Martin Baulig  <martin@ximian.com>
2269
2270         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2271         (LocalInfo.IsThis): New public property.
2272         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2273
2274 2004-08-01  Martin Baulig  <martin@ximian.com>
2275
2276         * class.cs (TypeContainer.GetClassBases): Don't set the default
2277         here since we may get called from GetPartialBases().
2278         (TypeContainer.DefineType): If GetClassBases() didn't return a
2279         parent, use the default one.
2280
2281 2004-07-30  Martin Baulig  <martin@ximian.com>
2282
2283         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2284
2285         * class.cs (SourceMethod): New public class, derive from the
2286         symbol writer's ISourceMethod.
2287         (Method): Use the new symbol writer API.
2288
2289         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2290         as argument and use the new symbol writer.
2291
2292         * location.cs
2293         (SourceFile): Implement the symbol writer's ISourceFile.
2294         (Location.SymbolDocument): Removed.
2295         (Location.SourceFile): New public property.
2296
2297         * symbolwriter.cs: Use the new symbol writer API.
2298
2299 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2300
2301         * Makefile (install-local): Remove.  Functionality moved to
2302         executable.make.
2303
2304 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2305
2306         * Makefile: Install mcs.exe.config file together with mcs.exe.
2307         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2308         correct runtime version.
2309         
2310 2004-07-25  Martin Baulig  <martin@ximian.com>
2311
2312         * class.cs
2313         (TypeContainer.RegisterOrder): Removed, this was unused.
2314         (TypeContainer, interface_order): Removed.
2315         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2316         TypeContainer as argument since we can also be called with a
2317         `PartialContainer' for a partial class/struct/interface.
2318         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2319         of checking whether we're an `Interface' - we could be a
2320         `PartialContainer'.
2321         (PartialContainer.Register): Override; call
2322         AddClass()/AddStruct()/AddInterface() on our parent.
2323
2324         * cs-parser.jay (interface_member_declaration): Add things to the
2325         `current_container', not the `current_class'.
2326
2327         * rootcontext.cs (RegisterOrder): The overloaded version which
2328         takes an `Interface' was unused, removed.
2329
2330         * typemanager.cs (TypeManager.LookupInterface): Return a
2331         `TypeContainer', not an `Interface'.
2332         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2333         contain a `PartialContainer' for an interface, so check it's
2334         `Kind' to figure out what it is.
2335
2336 2004-07-25  Martin Baulig  <martin@ximian.com>
2337
2338         * class.cs (Class.DefaultTypeAttributes): New public constant.
2339         (Struct.DefaultTypeAttributes): Likewise.
2340         (Interface.DefaultTypeAttributes): Likewise.
2341         (PartialContainer.TypeAttr): Override this and add the
2342         DefaultTypeAttributes.
2343
2344 2004-07-25  Martin Baulig  <martin@ximian.com>
2345
2346         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2347         we can just use the `Parent' field instead.
2348
2349 2004-07-25  Martin Baulig  <martin@ximian.com>
2350
2351         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2352
2353 2004-07-25  Martin Baulig  <martin@ximian.com>
2354
2355         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2356         our parts before defining any methods.
2357         (TypeContainer.VerifyImplements): Make this virtual.
2358         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2359         on our PartialContainer.
2360
2361 2004-07-25  Martin Baulig  <martin@ximian.com>
2362
2363         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2364
2365         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2366         argument, we can just use the `Parent' field instead.
2367
2368         * class.cs
2369         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2370         (MemberBase.DoDefine): Likewise.
2371
2372 2004-07-24  Martin Baulig  <martin@ximian.com>
2373
2374         * decl.cs (MemberCore.Parent): New public field.
2375         (DeclSpace.Parent): Moved to MemberCore.
2376
2377         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2378         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2379         parent's .ctor.
2380         (FieldBase, Field, Operator): Likewise.
2381         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2382         (EventField, Event): Likewise.
2383
2384 2004-07-23  Martin Baulig  <martin@ximian.com>
2385
2386         * class.cs (PartialContainer): New public class.
2387         (ClassPart): New public class.
2388         (TypeContainer): Added support for partial classes.
2389         (TypeContainer.GetClassBases): Splitted some of the functionality
2390         out into GetNormalBases() and GetPartialBases().
2391
2392         * cs-tokenizer.cs (Token.PARTIAL): New token.
2393         (Tokenizer.consume_identifier): Added some hacks to recognize
2394         `partial', but only if it's immediately followed by `class',
2395         `struct' or `interface'.
2396
2397         * cs-parser.jay: Added support for partial clases.
2398
2399 2004-07-23  Martin Baulig  <martin@ximian.com>
2400
2401         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2402         a `DeclSpace' and also made it readonly.
2403         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2404         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2405         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2406
2407         * cs-parser.jay: Pass the `current_class', not the
2408         `current_container' (at the moment, this is still the same thing)
2409         to a new Method, Property, Event, Indexer or Constructor.
2410
2411 2004-07-23  Martin Baulig  <martin@ximian.com>
2412
2413         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2414         and removed the `current_interface' one.
2415         (struct_declaration, class_declaration, interface_declaration):
2416         Set `current_class' to the newly created class/struct/interface;
2417         set their `Bases' and call Register() before parsing their body.
2418
2419 2004-07-23  Martin Baulig  <martin@ximian.com>
2420
2421         * class.cs (Kind): New public enum.
2422         (TypeContainer): Made this class abstract.
2423         (TypeContainer.Kind): New public readonly field.
2424         (TypeContainer.CheckDef): New public method; moved here from
2425         cs-parser.jay.
2426         (TypeContainer.Register): New public abstract method.
2427         (TypeContainer.GetPendingImplementations): New public abstract
2428         method.
2429         (TypeContainer.GetClassBases): Removed the `is_class' and
2430         `is_iface' parameters.
2431         (TypeContainer.DefineNestedTypes): Formerly known as
2432         DoDefineType().
2433         (ClassOrStruct): Made this class abstract.
2434
2435         * tree.cs (RootTypes): New public type. 
2436
2437 2004-07-20  Martin Baulig  <martin@ximian.com>
2438
2439         * tree.cs (Tree.RecordNamespace): Removed.
2440         (Tree.Namespaces): Removed.
2441
2442         * rootcontext.cs (RootContext.IsNamespace): Removed.
2443
2444         * cs-parser.jay (namespace_declaration): Just create a new
2445         NamespaceEntry here.
2446
2447 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
2448
2449         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
2450         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
2451         entry to make sure it runs in the correct runtime version.
2452         
2453 2004-07-18  Martin Baulig  <martin@ximian.com>
2454
2455         * generic.cs (ConstructedType.CheckConstraints): Improved
2456         constraints checking.
2457
2458 2004-07-18  Martin Baulig  <martin@ximian.com>
2459
2460         * expression.cs (Invocation.BetterMethod): Call
2461         TypeManager.TypeToCoreType() on all types and removed my previous
2462         hack; we're already doig the right thing here.
2463
2464 2004-07-17  Martin Baulig  <martin@ximian.com>
2465
2466         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
2467
2468 2004-07-16  Martin Baulig  <martin@ximian.com>
2469
2470         * iterators.cs: Added generics support.
2471
2472 2004-07-16  Martin Baulig  <martin@ximian.com>
2473
2474         * iterators.cs: Rewrote this.  We're now using one single Proxy
2475         class for both the IEnumerable and the IEnumerator interface and
2476         `Iterator' derives from Class so we can use the high-level API.
2477
2478         * class.cs (TypeContainer.AddIterator): New method.
2479         (TypeContainer.DoDefineType): New protected virtual method, which
2480         is called from DefineType().
2481         (TypeContainer.DoDefineMembers): Call DefineType() and
2482         DefineMembers() on all our iterators.
2483         (TypeContainer.Emit): Call Emit() on all our iterators.
2484         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2485
2486         * codegen.cs (EmitContext.CurrentIterator): New public field.
2487
2488 2004-07-15  Martin Baulig  <martin@ximian.com>
2489
2490         * typemanager.cs
2491         (TypeManager.not_supported_exception_type): New type.   
2492
2493 2004-07-14  Martin Baulig  <martin@ximian.com>
2494
2495         * typemanager.cs
2496         (TypeManager.generic_ienumerable_type): New type.
2497         (TypeManager.generic_ienumerator_type): New type.
2498
2499         * rootcontext.cs
2500         (RootContext.interfaces_first_stage): Added
2501         "System.Collections.Generic.IEnumerator`1" and
2502         "System.Collections.Generic.IEnumerable`1".     
2503
2504 2004-07-14  Martin Baulig  <martin@ximian.com>
2505
2506         * iterators.cs: Use real error numbers.
2507
2508 2004-07-14  Martin Baulig  <martin@ximian.com>
2509
2510         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2511         requires this to be a System.Collection.IEnumerable and not a
2512         class implementing that interface.
2513         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2514
2515 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2516
2517         * class.cs: Fixed previous fix, it broke some error tests.
2518
2519 2004-07-12  Martin Baulig  <martin@ximian.com>
2520
2521         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2522         Fixes #61293.
2523
2524 2004-07-14  Martin Baulig  <martin@ximian.com>
2525
2526         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
2527         an exclamation mark (!) for the generic arity to reflect the
2528         latest spec changes; ie. use "System.Collections.Generic.IList`1".
2529
2530 2004-07-13  Martin Baulig  <martin@ximian.com>
2531
2532         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
2533         specifiers being part of a type argument.
2534
2535 2004-07-13  Martin Baulig  <martin@ximian.com>
2536
2537         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
2538         name for generic types.
2539
2540 2004-07-13  Martin Baulig  <martin@ximian.com>
2541
2542         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
2543         bit to fix #60119.
2544
2545 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2546
2547         * assign.cs (LocalTemporary): Add new argument: is_address,If
2548         `is_address' is true, then the value that we store is the address
2549         to the real value, and not the value itself.
2550         
2551         * ecore.cs (PropertyExpr): use the new local temporary
2552         stuff to allow us to handle X.Y += z (where X is a struct)
2553
2554 2004-07-08  Martin Baulig  <martin@ximian.com>
2555
2556         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2557         not always return, just like we're doing in Using.Resolve().
2558
2559 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2560
2561         * cs-parser.jay (fixed_statement): flag this as Pinned.
2562
2563 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2564
2565         * typemanager.cs (TypeManager): Removed MakePinned method, this
2566         mechanism is replaced with the .NET 2.x compatible mechanism of
2567         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2568
2569         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2570         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2571         `IsFixed' property which has a different meaning.
2572
2573 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2574
2575         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2576         visible from inside a nested class, not just the names of the
2577         immediately enclosing class.
2578         Fix for bug #60730.
2579
2580 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2581
2582         * expression.cs (BetterConversion): Remove buggy special-case
2583         handling of "implicit constant expression conversions".  At this
2584         point, we already know that the conversion is possible -- we're
2585         only checking to see which is better.
2586
2587 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2588
2589         * cs-parser.jay: Added error CS0210 test.
2590
2591 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2592
2593         * cs-parser.jay: Added error CS0134 test.
2594
2595 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2596
2597         Fix bug #52507
2598         * cs-parser.jay: Added error CS0145 test.
2599
2600 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2601
2602         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2603
2604 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2605         
2606         * expression.cs (StackAlloc.Resolve): The argument may not
2607         be a constant; deal with this case.
2608         
2609 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2610
2611         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2612         GetIndexerAttributeValue.
2613         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2614
2615         * class.cs (Indexer.Define): Added error tests for CS0415,
2616         CS0609.
2617
2618 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2619
2620         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2621         property code.
2622
2623 2004-06-23  Martin Baulig  <martin@ximian.com>
2624
2625         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2626         neither return nor throw, reset the barrier as well.  Fixes #60457.
2627
2628 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2629
2630         * class.cs : EventAttributes is now set to None by default.
2631           This fixes bug #60459.
2632
2633 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2634
2635         Fix bug #60219
2636         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2637         Don't throw exception but return null (it's sufficient now).
2638
2639 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2640
2641         * typemanager.cs (GetArgumentTypes): Faster implementation.
2642
2643 2004-06-18  Martin Baulig  <martin@ximian.com>
2644
2645         * attribute.cs (Attribute.Resolve): Check whether we're an
2646         EmptyCast which a Constant child.  Fixes #60333.
2647
2648 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2649
2650         * statement.cs (EmitCollectionForeach): Account for the fact that
2651         not all valuetypes are in areas which we can take the address of.
2652         For these variables, we store to a temporary variable. Also, make
2653         sure that we dont emit a `callvirt' on a valuetype method.
2654
2655 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2656
2657         * expression.cs (StackAlloc.DoReSolve): Added test for
2658         negative parameter (CS0247).
2659
2660 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2661
2662         Fix bug #59792
2663         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2664
2665 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2666
2667         Fix bug #59781
2668         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2669         ulong.
2670
2671 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2672
2673         Fix bug #58254 & cs1555.cs, cs1556.cs
2674         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2675
2676 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2677
2678         * cs-parser.jay: Added error CS1669 test for indexers.
2679
2680 2004-06-18  Martin Baulig  <martin@ximian.com>
2681
2682         * generics.cs (GenericMethod.ctor): Don't take an Attributes
2683         argument.  Fixes #60441.
2684
2685 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
2686         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
2687         The name needs to have the actual name of the method in order
2688         for other tests (such as the one in OverloadResolve for Invoke
2689         on a delegate) to work. As well, it does not really help
2690         error reporting because the method group had multiple methods.
2691         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
2692         Make profiling work.
2693         
2694 2004-06-13  Martin Baulig  <martin@ximian.com>
2695
2696         * cs-parser.jay: Don't allow generic attributes.
2697
2698 2004-06-13  Martin Baulig  <martin@ximian.com>
2699
2700         * class.cs (MemberBase.DoDefineBase): New protected method.
2701         (MemberBase.DoDefine): Compute the `flags' in the new
2702         DoDefineBase() which must be called first.
2703         (Method.Define): Call DoDefineBase() first so we have the flags
2704         when defining the generic method.
2705
2706         * cs-parser.jay (interface_method_declaration): Support generic methods.
2707
2708 2004-06-13  Martin Baulig  <martin@ximian.com>
2709
2710         * decl.cs (TypeName): Removed.
2711         (MemberName): Removed TypeName and MemberNow; now we just have
2712         MemberName.
2713
2714         * cs-parser.jay: Don't distinguish between type arguments and type
2715         parameters in the grammar and simplified the rules a bit.  The
2716         reduce/reduce conflicts are now gone (except the one we inherited
2717         from mcs).
2718
2719 2004-06-11  Martin Baulig  <martin@ximian.com>
2720
2721         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2722         call this twice: for params and varargs methods.
2723
2724 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2725
2726         * class.cs:
2727         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2728
2729 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2730
2731         * attribute.cs (Attribute.GetValidTargets): Made public.
2732
2733         * class.cs: 
2734         (AbstractPropertyEventMethod): New class for better code sharing.
2735         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2736         CS1667 report.
2737         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2738
2739 2004-06-09  Martin Baulig  <martin@ximian.com>
2740
2741         * cs-parser.jay: Removed a reduce/reduce conflict.
2742
2743 2004-06-03  Martin Baulig  <martin@ximian.com>
2744
2745         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
2746         GetSimpleName() and return a SimpleName.
2747
2748         * ecore.cs (SimpleName.Arguments): New public field.
2749         (SimpleName): Added overloaded ctor which takes an additional
2750         TypeArguments argument.
2751         (SimpleName.SimpleNameResolve): Added support for generic methods.
2752         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
2753         formerly in MemberAccess.DoResolve(), but we also need it in
2754         SimpleNameResolve().
2755
2756         * expression.cs (MemberAccess.DoResolve): Use the new
2757         MethodGroupExpr.ResolveGeneric().       
2758
2759 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2760
2761         * decl.cs: If possible, use lookuptypedirect here. We can only do
2762         this if there is no `.' after the namespace. Avoids using
2763         LookupType, which does lots of slow processing.
2764         (FindNestedType) New method, does what it says :-).
2765         * namespace.cs: use LookupTypeDirect.
2766         * rootcontext.cs: use membercache, if possible.
2767         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2768
2769 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2770
2771         * expression.cs:
2772         According to the spec, 
2773
2774         In a member access of the form E.I, if E is a single identifier,
2775         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2776         field, property, localvariable, or parameter with the same type as
2777         the meaning of E as a type-name (§3.8), then both possible
2778         meanings of E are permitted.
2779
2780         We did not check that E as a simple-name had the same type as E as
2781         a type name.
2782
2783         This trivial check gives us 5-7% on bootstrap time.
2784
2785 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2786
2787         * expression.cs (Invocation.OverloadResolve): Avoid the
2788         use of hashtables and boxing here by allocating on demand.
2789
2790 2004-05-30  Martin Baulig  <martin@ximian.com>
2791
2792         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2793         we're doing a silent lookup.  Don't try to lookup nested types in
2794         TypeManager.object_type (thanks to Ben Maurer).
2795
2796 2004-05-30  Martin Baulig  <martin@ximian.com>
2797
2798         Committing a patch from Ben Maurer.
2799
2800         * rootcontext.cs (RootContext.LookupType): Cache negative results.
2801
2802 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2803
2804         * convert.cs: add a trivial cache for overload operator resolution.
2805
2806 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
2807
2808         * attribute.cs
2809         (AttributeTester.GetObsoleteAttribute): Returns instance of
2810         ObsoleteAttribute when type is obsolete.
2811
2812         * class.cs
2813         (TypeContainer.VerifyObsoleteAttribute): Override.
2814         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
2815         (MethodCode.VerifyObsoleteAttribute): Override.
2816         (MemberBase.VerifyObsoleteAttribute): Override.
2817
2818         * decl.cs
2819         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
2820         and report proper error.
2821
2822         *delegate.cs
2823         (Delegate.VerifyObsoleteAttribute): Override.
2824
2825         * ecore.cs
2826         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
2827         and report proper error.
2828         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
2829
2830         * enum.cs
2831         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
2832         and enum member.
2833
2834         * expression.cs
2835         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
2836         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
2837         Added test for ObsoleteAttribute.
2838
2839         * statement.cs
2840         (Catch): Derived from Statement.
2841
2842 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2843
2844         * decl.cs: If possible, use lookuptypedirect here. We can only do
2845         this if there is no `.' after the namespace. Avoids using
2846         LookupType, which does lots of slow processing.
2847         (FindNestedType) New method, does what it says :-).
2848         * namespace.cs: use LookupTypeDirect.
2849         * rootcontext.cs: use membercache, if possible.
2850         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
2851
2852 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2853
2854         * expression.cs:
2855         According to the spec, 
2856
2857         In a member access of the form E.I, if E is a single identifier,
2858         and if the meaning of E as a simple-name (§7.5.2) is a constant,
2859         field, property, localvariable, or parameter with the same type as
2860         the meaning of E as a type-name (§3.8), then both possible
2861         meanings of E are permitted.
2862
2863         We did not check that E as a simple-name had the same type as E as
2864         a type name.
2865
2866         This trivial check gives us 5-7% on bootstrap time.
2867
2868 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2869
2870         Fixed bug #59071 & cs0160.cs
2871         * statement.cs (Try.Resolve): Check here whether order of catch
2872         clauses matches their dependencies.
2873
2874 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
2875
2876         Fixed bug #58624
2877         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
2878         unsafe type.
2879
2880 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
2881
2882         * expression.cs (Invocation.OverloadResolve): Avoid the
2883         use of hashtables and boxing here by allocating on demand.
2884
2885 2004-05-30  Martin Baulig  <martin@ximian.com>
2886
2887         * rootcontext.cs (RootContext.LookupType): Don't cache things if
2888         we're doing a silent lookup.  Don't try to lookup nested types in
2889         TypeManager.object_type (thanks to Ben Maurer).
2890
2891 2004-05-30  Martin Baulig  <martin@ximian.com>
2892
2893         Committing a patch from Ben Maurer.
2894
2895         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
2896
2897 2004-05-29  Martin Baulig  <martin@ximian.com>
2898
2899         * class.cs (IMethodData.ShouldIgnore): New method.
2900
2901         * typemanager.cs (TypeManager.MethodFlags): Don't take a
2902         `Location' argument, we don't need it anywhere.  Use
2903         `IMethodData.ShouldIgnore ()' instead of
2904         `MethodData.GetMethodFlags ()'.
2905         (TypeManager.AddMethod): Removed.
2906         (TypeManager.AddMethod2): Renamed to AddMethod.
2907
2908 2004-05-29  Martin Baulig  <martin@ximian.com>
2909
2910         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
2911
2912         * convert.cs (Convert.ImplicitReferenceConversion): If we're
2913         converting from a class type S to an interface type and we already
2914         have an object on the stack, don't box it again.  Fixes #52578.
2915
2916 2004-05-29  Martin Baulig  <martin@ximian.com>
2917
2918         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2919         Added support for `params' parameters.  Fixes #59267.
2920
2921 2004-05-29  Martin Baulig  <martin@ximian.com>
2922
2923         * literal.cs (NullPointer): Provide a private .ctor which sets
2924         `type' to TypeManager.object_type.  Fixes #59048.
2925
2926 2004-05-29  Martin Baulig  <martin@ximian.com>
2927
2928         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
2929         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
2930
2931         * ecore.cs (EventExpr.instance_expr): Make the field private.
2932
2933 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
2934
2935         Fixed bug #50080 & cs0214-2.cs
2936         * expression.cs (Cast.DoResolve): Check unsafe context here.
2937         
2938         * statement.cs (Resolve.DoResolve): Likewise.
2939
2940 2004-05-26  Martin Baulig  <martin@ximian.com>
2941
2942         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
2943
2944         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
2945         (RootContext.LookupType): Pass down the `silent' flag.
2946
2947 2004-05-25  Martin Baulig  <martin@ximian.com>
2948
2949         * expression.cs
2950         (MethodGroupExpr.IdenticalTypeName): New public property.
2951         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
2952         expression actually refers to a type.
2953
2954 2004-05-25  Martin Baulig  <martin@ximian.com>
2955
2956         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
2957         for #56176 and made it actually work.
2958
2959 2004-05-25  Martin Baulig  <martin@ximian.com>
2960
2961         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
2962         (FieldExpr, PropertyExpr): Override and implement
2963         CacheTemporaries.  Fixes #52279.
2964
2965 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
2966
2967         * location.cs: In the new compiler listing a file twice is a
2968         warning, not an error.
2969
2970 2004-05-24  Martin Baulig  <martin@ximian.com>
2971
2972         * enum.cs (Enum.DefineType): For the `BaseType' to be a
2973         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
2974
2975 2004-05-24  Martin Baulig  <martin@ximian.com>
2976
2977         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
2978         walking the `using' list.  Fixes #53921.
2979
2980 2004-05-24  Martin Baulig  <martin@ximian.com>
2981
2982         * const.cs (Const.LookupConstantValue): Added support for
2983         EmptyCast's; fixes #55251.
2984
2985 2004-05-24  Martin Baulig  <martin@ximian.com>
2986
2987         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
2988         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
2989         which does the CS0135 check.  The reason is that we first need to
2990         check whether the variable actually exists.
2991
2992 2004-05-24  Martin Baulig  <martin@ximian.com>
2993
2994         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
2995         than RootContext.LookupType() to find the explicit interface
2996         type.  Fixes #58584.
2997
2998 2004-05-24  Raja R Harinath  <rharinath@novell.com>
2999
3000         * Makefile: Simplify.  Use executable.make.
3001         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3002
3003 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3004
3005         * decl.cs:
3006         * enum.cs:
3007         Use the invariant culture when doing String.Compare for CLS case
3008         sensitivity.
3009         
3010 2004-05-23  Martin Baulig  <martin@ximian.com>
3011
3012         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3013         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3014
3015         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3016
3017 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3018
3019         * class.cs (MemberBase.Define): Reuse MemberType member for 
3020         resolved type. Other methods can use it too.
3021
3022 2004-05-23  Martin Baulig  <martin@ximian.com>
3023
3024         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3025         the variable also exists in the current block (otherwise, we need
3026         to report a CS0103).  Fixes #58670.
3027
3028 2004-05-23  Martin Baulig  <martin@ximian.com>
3029
3030         * flowanalysis.cs (Reachability.Reachable): Compute this
3031         on-the-fly rather than storing it as a field.
3032
3033 2004-05-23  Martin Baulig  <martin@ximian.com>
3034
3035         * flowanalysis.cs (Reachability.And): Manually compute the
3036         resulting `barrier' from the reachability.      
3037        
3038 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3039
3040         Fix bug #57835
3041         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3042         instance of ObsoleteAttribute when symbol is obsolete.
3043
3044         * class.cs
3045         (IMethodData): Extended interface for ObsoleteAttribute support.
3046
3047 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3048
3049         * attribute.cs: Fix bug #55970
3050
3051 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3052
3053         Fix bug #52705
3054         * attribute.cs
3055         (GetObsoleteAttribute): New method. Creates the instance of
3056         ObsoleteAttribute.
3057         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3058         ObsoleteAttribute when member is obsolete.
3059         (AttributeTester.Report_ObsoleteMessage): Common method for
3060         Obsolete error/warning reporting.
3061
3062         * class.cs
3063         (TypeContainer.base_classs_type): New member for storing parent type.
3064
3065         * decl.cs
3066         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3067         for this MemberCore.
3068
3069 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3070
3071         * attribute.cs, const.cs: Fix bug #58590
3072
3073 2004-05-21  Martin Baulig  <martin@ximian.com>
3074
3075         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3076         out parameters if the end of the method is unreachable.  Fixes
3077         #58098. 
3078
3079 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3080
3081         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3082         Hari was right, why extra method.
3083
3084 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3085
3086         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3087
3088 2004-05-20  Martin Baulig  <martin@ximian.com>
3089
3090         * delegate.cs: Convert this file to Unix mode - like the original
3091         version in mcs is.
3092
3093 2004-05-20  Martin Baulig  <martin@ximian.com>
3094
3095         * attribute.cs: Convert this file to Unix mode - like the original
3096         version in mcs is.
3097
3098 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3099
3100        Fix bug #58688 (MCS does not report error when the same attribute
3101        is assigned twice)
3102
3103        * attribute.cs (Attribute.Emit): Distinction between null and default.
3104
3105 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3106
3107        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3108        of a top-level attribute without an attribute target.
3109        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3110        Make non-static.
3111        (Attribute.Conditional_GetConditionName), 
3112        (Attribute.Obsolete_GetObsoleteMessage): Update.
3113        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3114        part of ScanForIndexerName.
3115        (Attribute.CanIgnoreInvalidAttribute): New function.
3116        (Attribute.ScanForIndexerName): Move to ...
3117        (Attributes.ScanForIndexerName): ... here.
3118        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3119        (Attributes.Search): New internal variant that can choose not to
3120        complain if types aren't resolved.  The original signature now
3121        complains.
3122        (Attributes.GetClsCompliantAttribute): Use internal variant, with
3123        complaints suppressed.
3124        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3125        only if it not useful.
3126        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3127        top-level for attributes that are shared between the assembly
3128        and a top-level class.
3129        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3130        * class.cs: Update to reflect changes.
3131        (DefineIndexers): Fuse loops.
3132        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3133        a couple more variants of attribute names.
3134
3135 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3136
3137         Fix bug #52585 (Implemented explicit attribute declaration)
3138
3139         * attribute.cs:
3140         (Attributable.ValidAttributeTargets): New abstract method. It gets
3141         list of valid attribute targets for explicit target declaration.
3142         (Attribute.Target): It holds target itself.
3143         (AttributeSection): Removed.
3144         (Attribute.CheckTargets): New method. It checks whether attribute
3145         target is valid for the current element.
3146
3147         * class.cs:
3148         (EventProperty): New class. For events that are declared like
3149         property (with add and remove accessors).
3150         (EventField): New class. For events that are declared like field.
3151         class.cs
3152
3153         * cs-parser.jay: Implemented explicit attribute target declaration.
3154
3155         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3156         Override ValidAttributeTargets.
3157
3158         * parameter.cs:
3159         (ReturnParameter): Class for applying custom attributes on 
3160         the return type.
3161         (ParameterAtribute): New class. Class for applying custom
3162         attributes on the parameter type.
3163
3164 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3165
3166         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3167         definitions. 
3168
3169         (Method): Allow UNSAFE here.
3170
3171         * modifiers.cs: Support unsafe reporting.
3172
3173 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3174
3175         * decl.cs: Fix bug #58478.
3176
3177 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3178
3179         * statement.cs: When checking for unreachable code on an EmptyStatement,
3180         set the location. Fixes bug #58488.
3181
3182 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3183
3184         * driver.cs: Add -pkg handling.
3185
3186         From Gonzalo: UseShelLExecute=false
3187
3188 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3189
3190         * attribute.cs:
3191         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3192         for attribute.
3193         (Attribute.IsClsCompliaceRequired): Moved to base for better
3194         accesibility.
3195         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3196         when attribute is AttributeUsageAttribute.
3197         (Attribute.GetValidTargets): Simplified.
3198         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3199         attribute for this type.
3200         (Attribute.ApplyAttributes): Method renamed to Emit and make
3201         non-static.
3202         (GlobalAttributeSection): New class for special handling of global
3203         attributes (assembly, module).
3204         (AttributeSection.Emit): New method.
3205
3206         * class.cs: Implemented Attributable abstract methods.
3207         (MethodCore.LabelParameters): Moved to Parameter class.
3208         (Accessor): Is back simple class.
3209         (PropertyMethod): Implemented Attributable abstract class.
3210         (DelegateMethod): Implemented Attributable abstract class.
3211         (Event): New constructor for disctintion between normal Event
3212         and Event with accessors.
3213
3214         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3215
3216         * codegen.cs, const.cs, decl.cs, delegate.cs:
3217         (CommonAssemblyModulClass): Implemented Attributable abstract class
3218         and simplified.
3219
3220         * enum.cs: Implement IAttributeSupport interface.
3221         (EnumMember): New class for emum members. Implemented Attributable
3222         abstract class
3223
3224         * parameter.cs:
3225         (ParameterBase): Is abstract.
3226         (ReturnParameter): New class for easier [return:] attribute handling.
3227
3228         * typemanager.cs: Removed builder_to_attr.
3229
3230 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3231
3232         Fix bug #57151.
3233         * attribute.cs (Attribute.GetPositionalValue): New function.
3234         * class.cs (TypeContainer.VerifyMembers): New function.
3235         (TypeContainer.Emit): Use it.
3236         (ClassOrStruct): New base class for Class and Struct.
3237         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3238         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3239         class.
3240         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3241         then each non-static field should have a FieldOffset attribute.
3242         Otherwise, none of the fields should have a FieldOffset attribute.
3243         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3244         and FieldOffset attributes.
3245         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3246         (TypeManager.field_offset_attribute_type): New core types.
3247         (TypeManager.InitCoreTypes): Initialize them.
3248
3249 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3250
3251         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3252         Return correct type.
3253         From bug #58270.
3254
3255 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3256
3257         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3258         be implicitly converted to ulong.
3259         
3260         * expression.cs: The logic for allowing operator &, | and ^ worked
3261         was wrong, it worked before because we did not report an error in
3262         an else branch.  Fixes 57895.
3263
3264         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3265         allow volatile fields to be reference types.
3266
3267 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3268
3269         * driver.cs: Add support for /debug-
3270
3271 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3272
3273         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3274         Add a 'complain' parameter to silence errors.
3275         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3276         silently overlooked type-resolutions.
3277         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3278         to reflect changes.
3279         (Attributes.Search): New function.
3280         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3281         (Attributes.GetAttributeFullName): Remove hack.
3282         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3283         Update to reflect changes.
3284         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3285         Use Attributes.Search instead of nested loops.
3286
3287 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3288
3289         * decl.cs:
3290         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3291         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3292         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3293
3294         * report.cs: (Report.Warning): Renamed to Warning_T because of
3295         parameter collision.
3296
3297 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3298
3299         * expression.cs (MemberAccess.ResolveMemberAccess):
3300         Exit with non-zero status after Report.Error.
3301         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3302         Likewise.
3303         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3304
3305 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3306
3307         * support.cs: Don't hang when the file is empty.
3308
3309 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3310
3311         * support.cs: In SeekableStreamReader, compute the preamble size of the
3312           underlying stream. Position changes should take into account that initial
3313           count of bytes.
3314
3315 2004-05-03  Todd Berman  <tberman@sevenl.net>
3316
3317         * driver.cs: remove unused GetSysVersion function.
3318
3319 2004-05-03  Todd Berman  <tberman@sevenl.net>
3320
3321         * driver.cs: Remove the hack from saturday, as well as the hack
3322         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3323         link_paths to get that bit proper.
3324
3325 2004-05-01  Todd Berman  <tberman@sevenl.net>
3326
3327         * driver.cs: Try a LoadFrom before a Load, this checks the current
3328         path. This is currently a bug in mono that is be fixed, however, this
3329         provides a workaround for now. This will be removed when the bug
3330         is fixed.
3331
3332 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3333
3334         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3335         incomplete key pairs (#57941).
3336
3337 2004-05-01  Todd Berman  <tberman@sevenl.net>
3338
3339         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3340         from the GAC
3341
3342 2004-04-30  Jackson Harper  <jackson@ximian.com>
3343
3344         * codegen.cs: Open keys readonly.
3345         
3346 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3347
3348         * typemanager.cs: don't report cyclic struct layout when a struct
3349         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3350         which has 2 Pango.Rectangle fields.
3351
3352 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3353
3354         * expression.cs: Handle IntPtr comparisons with IL code
3355         rather than a method call.
3356
3357 2004-04-29  Martin Baulig  <martin@ximian.com>
3358
3359         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3360         the list of PropertyInfo's in class hierarchy and find the
3361         accessor.  Fixes #56013.
3362
3363 2004-04-29  Martin Baulig  <martin@ximian.com>
3364
3365         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3366
3367 2004-04-29  Martin Baulig  <martin@ximian.com>
3368
3369         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3370
3371         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3372
3373 2004-04-29  Martin Baulig  <martin@ximian.com>
3374
3375         * class.cs (ConstructorInitializer.Resolve): Check whether the
3376         parent .ctor is accessible.  Fixes #52146.
3377
3378 2004-04-29  Martin Baulig  <martin@ximian.com>
3379
3380         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3381
3382         * statement.cs (Using.EmitLocalVariableDecls): Use
3383         TypeManager.idisposable_type, not typeof (IDisposable).
3384         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3385
3386 2004-04-29  Martin Baulig  <martin@ximian.com>
3387
3388         * class.cs (Event.Define): Don't emit the field and don't set
3389         RTSpecialName and SpecialName for events on interfaces.  Fixes
3390         #57703. 
3391
3392 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3393
3394         Refactor Attribute.ApplyAttributes.
3395         * attribute.cs (Attributable): New base class for objects that can
3396         have Attributes applied on them.
3397         (Attribute): Make AttributeUsage fields public.
3398         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3399         (Attribute.IsInternalCall): New property.
3400         (Attribute.UsageAttr): Convert to a public read-only property.
3401         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3402         (Attribute.ResolveType, Attribute.Resolve)
3403         (Attribute.ScanForIndexerName): Update to reflect changes.
3404         (Attribute.CheckAttributeTarget): Re-format.
3405         (Attribute.ApplyAttributes): Refactor, to various
3406         Attributable.ApplyAttributeBuilder methods.
3407         * decl.cs (MemberCore): Make Attributable.
3408         * class.cs (Accessor): Make Attributable.
3409         (MethodData.ApplyAttributes): Use proper attribute types, not
3410         attribute names.
3411         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3412         (TypeContainer.ApplyAttributeBuilder)
3413         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3414         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3415         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3416         (Operator.ApplyAttributeBuilder): New factored-out methods.
3417         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3418         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3419         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3420         * parameter.cs (ParameterBase): New Attributable base class
3421         that can also represent Return types.
3422         (Parameter): Update to the changes.
3423
3424 2004-04-29  Jackson Harper  <jackson@ximian.com>
3425
3426         * driver.cs: Prefer the corlib system version when looking for
3427         assemblies in the GAC. This is still a hack, but its a better hack
3428         now.
3429         
3430 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3431
3432         * decl.cs, enum.cs: Improved error 3005 reporting.
3433   
3434         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3435         (related_symbols): New private member for list of symbols
3436         related to reported error/warning.
3437         
3438         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3439
3440 2004-04-29  Martin Baulig  <martin@ximian.com>
3441
3442         * ecore.cs (Expression.Constantify): If we're an enum and
3443         TypeManager.TypeToCoreType() doesn't give us another type, use
3444         t.UnderlyingSystemType.  Fixes #56178.  
3445
3446 2004-04-29  Martin Baulig  <martin@ximian.com>
3447
3448         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3449         interfaces and for each interface, only add members directly
3450         declared in that interface.  Fixes #53255.
3451
3452 2004-04-28  Martin Baulig  <martin@ximian.com>
3453
3454         * expression.cs (ConditionalLogicalOperator): Use a temporary
3455         variable for `left' to avoid that we evaluate it more than once;
3456         bug #52588.
3457
3458 2004-04-28  Martin Baulig  <martin@ximian.com>
3459
3460         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3461         `void[]' (CS1547).
3462
3463 2004-04-28  Martin Baulig  <martin@ximian.com>
3464
3465         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3466         void (CS1547).
3467
3468         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3469         whether the type is not void (CS1547).
3470
3471 2004-04-28  Martin Baulig  <martin@ximian.com>
3472
3473         * expression.cs (Unary.DoResolveLValue): Override this and report
3474         CS0131 for anything but Operator.Indirection.
3475
3476 2004-04-28  Martin Baulig  <martin@ximian.com>
3477
3478         Committing a patch from Ben Maurer; see bug #50820.
3479
3480         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3481         check for classes.
3482
3483         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3484         classes.        
3485
3486 2004-04-28  Martin Baulig  <martin@ximian.com>
3487
3488         Committing a patch from Ben Maurer; see bug #50820.
3489
3490         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3491         check for classes.
3492
3493         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3494         classes.        
3495
3496 2004-04-28  Martin Baulig  <martin@ximian.com>
3497
3498         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3499         (Block.AddLabel): Call DoLookupLabel() to only search in the
3500         current block.
3501
3502 2004-04-28  Martin Baulig  <martin@ximian.com>
3503
3504         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3505         comparing StringConstants and NullLiterals in Equality and Inequality.
3506
3507 2004-04-28  Jackson Harper  <jackson@ximian.com>
3508
3509         * driver.cs: Attempt to load referenced assemblies from the
3510         GAC. This is the quick and dirty version of this method that
3511         doesnt take into account versions and just takes the first
3512         canidate found. Will be good enough for now as we will not have more
3513         then one version installed into the GAC until I update this method.
3514
3515 2004-04-28  Martin Baulig  <martin@ximian.com>
3516
3517         * typemanager.cs (TypeManager.CheckStructCycles): New public
3518         static method to check for cycles in the struct layout.
3519
3520         * rootcontext.cs (RootContext.PopulateTypes): Call
3521         TypeManager.CheckStructCycles() for each TypeContainer.
3522         [Note: We only need to visit each type once.]
3523
3524 2004-04-28  Martin Baulig  <martin@ximian.com>
3525
3526         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3527
3528         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3529         success and added `out object value'.  Use a `bool resolved' field
3530         to check whether we've already been called rather than
3531         `ConstantValue != null' since this breaks for NullLiterals.
3532
3533 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3534
3535         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3536         setting of this flag, since the 'set' method may be non-public.
3537
3538 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3539
3540         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3541         check on current_vector.Block.
3542
3543 2004-04-27  Martin Baulig  <martin@ximian.com>
3544
3545         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3546         a field initializer.  Fixes #56459.
3547
3548 2004-04-27  Martin Baulig  <martin@ximian.com>
3549
3550         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3551         we're not attempting to use an indexer.  Fixes #52154.
3552
3553 2004-04-27  Martin Baulig  <martin@ximian.com>
3554
3555         * statement.cs (Return): Don't create a return label if we don't
3556         need it; reverts my change from January 20th.  Thanks to Ben
3557         Maurer for this.
3558
3559 2004-04-27  Martin Baulig  <martin@ximian.com>
3560
3561         According to the spec, `goto' can only leave a nested scope, but
3562         never enter it.
3563
3564         * statement.cs (Block.LookupLabel): Only lookup in the current
3565         block, don't recurse into parent or child blocks.
3566         (Block.AddLabel): Check in parent and child blocks, report
3567         CS0140/CS0158 if we find a duplicate.
3568         (Block): Removed this indexer for label lookups.
3569         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3570         this already does the error reporting for us.
3571
3572         * flowanalysis.cs
3573         (FlowBranching.UsageVector.Block): New public variable; may be null.
3574         (FlowBranching.CreateSibling): Added `Block' argument.
3575         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3576         label for the target of a `goto' and check whether we're not
3577         leaving a `finally'.
3578
3579 2004-04-27  Martin Baulig  <martin@ximian.com>
3580
3581         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3582         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3583         just for returns).
3584
3585 2004-04-27  Martin Baulig  <martin@ximian.com>
3586
3587         * statement.cs (Block.AddLabel): Also check for implicit blocks
3588         and added a CS0158 check.
3589
3590 2004-04-27  Martin Baulig  <martin@ximian.com>
3591
3592         * flowanalysis.cs (FlowBranchingLoop): New class.
3593         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3594         UsageVector's instead of an ArrayList.
3595         (FlowBranching.Label): Likewise.
3596         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3597         (FlowBranching.AddBreakVector): New method.
3598
3599 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3600
3601         * attribute.cs: Small regression fix: only convert the type if we
3602         the type is different, fixes System.Drawing build.
3603
3604 2004-04-27  Martin Baulig  <martin@ximian.com>
3605
3606         * attribute.cs (Attribute.Resolve): If we have a constant value
3607         for a named field or property, implicity convert it to the correct
3608         type.
3609
3610 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3611
3612         * statement.cs (Block.Block): Implicit blocks share
3613         'child_variable_names' fields with parent blocks.
3614         (Block.AddChildVariableNames): Remove.
3615         (Block.AddVariable): Mark variable as "used by a child block" in
3616         every surrounding block.
3617         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3618         been used in a child block, complain about violation of "Invariant
3619         meaning in blocks" rule.
3620         * cs-parser.jay (declare_local_variables): Don't use
3621         AddChildVariableNames.
3622         (foreach_statement): Don't create an implicit block: 'foreach'
3623         introduces a scope.
3624
3625 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3626
3627         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3628         converting from 0L to ulong.  Fixes 57522.
3629
3630 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3631
3632         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3633         derived class hides via 'new' keyword field from base class (test-242.cs).
3634         TODO: Handle this in the more general way.
3635         
3636         * class.cs (CheckBase): Ditto.
3637
3638 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3639
3640         * decl.cs (caching_flags): New member for storing cached values
3641         as bit flags.
3642         (MemberCore.Flags): New enum where bit flags for caching_flags
3643         are defined.
3644         (MemberCore.cls_compliance): Moved to caching_flags.
3645         (DeclSpace.Created): Moved to caching_flags.
3646
3647         * class.cs: Use caching_flags instead of DeclSpace.Created
3648         
3649 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3650
3651         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3652         if we are only a derived class, not a nested class.
3653
3654         * typemanager.cs: Same as above, but do this at the MemberLookup
3655         level (used by field and methods, properties are handled in
3656         PropertyExpr).   Allow for the qualified access if we are a nested
3657         method. 
3658
3659 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3660
3661         * class.cs: Refactoring.
3662         (IMethodData): New inteface; Holds links to parent members
3663         to avoid member duplication (reduced memory allocation).
3664         (Method): Implemented IMethodData interface.
3665         (PropertyBase): New inner classes for get/set methods.
3666         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3667         (Event): New inner classes for add/remove methods.
3668         (Event.DelegateMethod): Implemented IMethodData interface.
3669
3670         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3671         EmitContext (related to class.cs refactoring).
3672
3673 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3674
3675         * delegate.cs (Delegate.VerifyApplicability): If the number of
3676         arguments are the same as the number of parameters, first try to
3677         verify applicability ignoring  any 'params' modifier on the last
3678         parameter.
3679         Fixes #56442.
3680
3681 2004-04-08  Martin Baulig  <martin@ximian.com>
3682
3683         Merged latest changes into gmcs.  Please keep this comment in
3684         here, it makes it easier for me to see what changed in MCS since
3685         the last time I merged.
3686
3687 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3688
3689         * class.cs (TypeContainer.AddIndexer): Use
3690         'ExplicitInterfaceName' to determine if interface name was
3691         explicitly specified.  'InterfaceType' is not initialized at this time.
3692         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3693         Indexers array is already in the required order.  Initialize
3694         'IndexerName' only if there are normal indexers.
3695         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3696         (TypeContainer.Emit): Emit DefaultMember attribute only if
3697         IndexerName is initialized.
3698         Fixes #56300.
3699
3700 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3701
3702         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3703         Fixes #57007
3704
3705 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3706
3707         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3708         attributes.
3709         Fix for #56456.
3710
3711         * attribute.cs (Attribute.Resolve): Check for duplicate named
3712         attributes.
3713         Fix for #56463.
3714
3715 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3716
3717         * iterators.cs (MarkYield): track whether we are in an exception,
3718         and generate code accordingly.  Use a temporary value to store the
3719         result for our state.
3720
3721         I had ignored a bit the interaction of try/catch with iterators
3722         since their behavior was not entirely obvious, but now it is
3723         possible to verify that our behavior is the same as MS .NET 2.0
3724
3725         Fixes 54814
3726
3727 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
3728
3729         * iterators.cs: Avoid creating temporaries if there is no work to
3730         do. 
3731
3732         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
3733         Enumerations, use TypeManager.EnumToUnderlying and call
3734         recursively. 
3735
3736         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
3737         bug #57013
3738
3739         (This.Emit): Use EmitContext.EmitThis to emit our
3740         instance variable.
3741
3742         (This.EmitAssign): Ditto.
3743
3744         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
3745         codepaths, we will move all the functionality into
3746         Mono.CSharp.This 
3747
3748         (FieldExpr.EmitAssign): Ditto.
3749
3750         This fixes several hidden bugs that I uncovered while doing a code
3751         review of this today.
3752
3753         * codegen.cs (EmitThis): reworked so the semantics are more clear
3754         and also support value types "this" instances.
3755
3756         * iterators.cs: Changed so that for iterators in value types, we
3757         do not pass the value type as a parameter.  
3758
3759         Initialization of the enumerator helpers is now done in the caller
3760         instead of passing the parameters to the constructors and having
3761         the constructor set the fields.
3762
3763         The fields have now `assembly' visibility instead of private.
3764
3765 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
3766
3767         * expression.cs (Argument.Resolve): Check if fields passed as ref
3768         or out are contained in a MarshalByRefObject.
3769
3770         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
3771         another compiler type.
3772
3773 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3774
3775         * class.cs (Indexer.Define): use the new name checking method.
3776         Also, return false on an error.
3777         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
3778         (is_identifier_[start/part]_character): make static.
3779
3780 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
3781
3782         * expression.cs (Binary.ResolveOperator): Do no append strings
3783         twice: since we can be invoked more than once (array evaluation)
3784         on the same concatenation, take care of this here.  Based on a fix
3785         from Ben (bug #56454)
3786
3787 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3788
3789         * codegen.cs: Fix another case where CS1548 must be reported (when 
3790         delay-sign isn't specified and no private is available #56564). Fix
3791         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3792         error when MCS is used on the MS runtime and we need to delay-sign 
3793         (which seems unsupported by AssemblyBuilder - see #56621).
3794
3795 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
3796
3797         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
3798         (TypeManager.ComputeNamespaces): Faster implementation for
3799         Microsoft runtime.
3800
3801         * compiler.csproj: Updated AssemblyName to mcs.
3802
3803 2004-05-11  Jackson Harper  <jackson@ximian.com>
3804
3805         * Makefile: Preserve MONO_PATH
3806         
3807 2004-05-11  Jackson Harper  <jackson@ximian.com>
3808
3809         * Makefile: Use mono and mcs to build gmcs
3810         
3811 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
3812
3813         * codegen.cs: Add patch from Robert Shade
3814         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
3815         sync with mcs.
3816
3817 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
3818
3819         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3820         incomplete key pairs (#57941).
3821
3822 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
3823
3824         * codegen.cs: Fix another case where CS1548 must be reported (when 
3825         delay-sign isn't specified and no private is available #56564). Fix
3826         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
3827         error when MCS is used on the MS runtime and we need to delay-sign 
3828         (which seems unsupported by AssemblyBuilder - see #56621).
3829
3830 2004-04-29  Jackson Harper  <jackson@ximian.com>
3831
3832         * Makefile: Set MONO_PATH to use the bootstrap corlib
3833         * driver.cs: Check the GAC for referenced assemblies.
3834                 
3835 2004-04-29  Martin Baulig  <martin@ximian.com>
3836
3837         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
3838
3839 2004-04-07  Martin Baulig  <martin@ximian.com>
3840
3841         * expression.cs (Binary.ResolveOperator): Added special case for
3842         Equality/Inequality between a type parameter and a null literal.
3843
3844 2004-04-07  Martin Baulig  <martin@ximian.com>
3845
3846         * convert.cs: Check null literal -> type parameter conversions.
3847
3848 2004-04-07  Martin Baulig  <martin@ximian.com>
3849
3850         * generic.cs (ConstructedType.CheckConstraints): Enforce the
3851         `class' and `struct' constraints.
3852
3853 2004-04-07  Martin Baulig  <martin@ximian.com>
3854
3855         * generic.cs (SpecialConstraint): New public enum.
3856         (Constraints.Resolve): Added support for the `class' and `struct'
3857         constraints.
3858
3859         * cs-parser.jay (type_parameter_constraint): Added support for the
3860         `class' and `struct' constraints.
3861
3862 2004-04-07  Martin Baulig  <martin@ximian.com>
3863
3864         * support.cs (GenericConstraints): Replaced `Types' by
3865         `ClassConstraint' and `InterfaceConstraints'; added
3866         `HasClassConstraint'.   
3867
3868 2004-04-07  Martin Baulig  <martin@ximian.com>
3869
3870         * generic.cs
3871         (Constraints.InterfaceConstraints): New public property.
3872         (Constraints.Types): Make this property public
3873         (TypeParameter): Implement IMemberContainer.
3874         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
3875         instead of a TypeBuilder/MethodBuilder; pass the interface
3876         constraints to TypeManager.AddTypeParameter().
3877         (TypeParameter.DefineType): Just take an EmitContext and no
3878         TypeBuilder/MethodBuilder.  Use the new public API.
3879
3880         * typemanager.cs (TypeManager.AddTypeParameter): Added
3881         `TypeExpr[]' argument; add the interfaces to the
3882         `builder_to_ifaces' hash.
3883         (TypeManager.LookupMemberContainer): For
3884         GenericTypeParameterBuilders, get the TypeParameter from the
3885         `builder_to_type_param'.
3886         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
3887         the TypeParameter and call FindMembers on it.
3888
3889 2004-04-07  Martin Baulig  <martin@ximian.com>
3890
3891         * class.cs
3892         (MethodCore.GenericMethod): Moved this field here from Method.
3893         (MethodCore.IsDuplicateImplementation): Take the number of type
3894         parameters into account if we're a generic method.
3895
3896         * expression.cs (Invocation.InferTypeArguments): Don't return true
3897         if `arguments' is null; we still need to check whether we actually
3898         don't need to infer anything in this case.
3899         (MemberAccess): Merged the functionality from GenericMemberAccess
3900         into this class.
3901
3902         * generic.cs (GenericMemberAccess): Removed.
3903
3904 2004-04-05  Martin Baulig  <martin@ximian.com>
3905
3906         * decl.cs (MemberCore): For generic classes, interfaces and
3907         structs, `Name' now includes the number of type parameters
3908         ("Stack!1.Node!1").
3909         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
3910         encode the number of type arguments in the type name.
3911
3912         * expression.cs (Expression.MemberLookup): Removed the
3913         `num_type_args' argument; we now encode the number of type
3914         arguments in the type name.
3915
3916         * ecore.cs (SimpleName): Encode the number of type arguments in
3917         the type name itself.
3918
3919         * generic.cs (ConstructedType): Likewise.
3920
3921         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
3922         `MemberName'; we now include the number of type parameters in the
3923         type name.
3924
3925         * typemanager.cs (TypeManager.CheckGeneric): Removed.
3926         (TypeManager.MemberLookup): Removed the
3927         `num_type_args' argument; we now encode the number of type
3928         arguments in the type name.     
3929
3930 2004-04-03  Martin Baulig  <martin@ximian.com>
3931
3932         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
3933         (MemberCore.MemberName): Moved here from MemberBase.
3934         (DeclSpace.SetParameterInfo): Just take the constraints as an
3935         ArrayList; we already have the type parameters in our
3936         `MemberName'; also do the CS0080 reporting here.
3937
3938         * cs-parser.jay (struct_declaration): Use `member_name' instead of
3939         `IDENTIFIER opt_type_parameter_list'; when constructing our
3940         `MemberName', it'll already include our type parameters.
3941         (class_declaration, interface_declaration): Likewise.
3942         (delegate_declaration): Likewise.
3943         (MakeName): Take a MemberName and return a MemberName.
3944         The following two changes are required to avoid shift/reduce conflicts:
3945         (member_name): Don't include a TypeName anymore; ie. this is now
3946         just 'IDENTIFIER opt_type_parameter_list'.
3947         (property_declaration, event_declaration): Use a
3948         `namespace_or_type_name' instead of a `member_name'.            
3949
3950 2004-04-03  Martin Baulig  <martin@ximian.com>
3951
3952         * decl.cs (MemberName): Renamed to `TypeName' and created a new
3953         `MemberName' class.
3954         (TypeName): Formerly known as MemberName.
3955
3956         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
3957         instead of a `MemberName'.
3958
3959         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
3960         (member_name): New rule; create a MemberName.
3961
3962 2004-04-02  Martin Baulig  <martin@ximian.com>
3963
3964         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
3965         (CS0305 and CS0308).
3966
3967 2004-04-02  Martin Baulig  <martin@ximian.com>
3968
3969         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
3970         support for nested types.
3971
3972 2004-04-02  Martin Baulig  <martin@ximian.com>
3973
3974         * ecore.cs (IAlias): New public interface.
3975         (TypeExpr, TypeExpression): Implement IAlias.
3976         (TypeAliasExpression): New public class.
3977
3978         * namespace.cs (Namespace): Implement IAlias.
3979         (Namespace.Lookup): Return an IAlias instead on an object.
3980         (Namespace.DefineName): Take an IAlias instead of an object.
3981         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
3982         an object.
3983         (NamespaceEntry.UsingAlias): Take a Membername instead of an
3984         Expression.
3985         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
3986         object.
3987         (NamespaceEntry.Lookup): Likewise.
3988
3989         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
3990         instead of a Type.      
3991
3992         * decl.cs (DeclSpace): Implement IAlias.
3993         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
3994
3995         * generic.cs (ConstructedType): Improved error checking.
3996
3997 2004-04-02  Martin Baulig  <martin@ximian.com>
3998
3999         * convert.cs: Added type parameter conversions.
4000
4001         * ecore.cs
4002         (UnboxCast.Emit): Emit an `unbox.any' for type params.
4003         (ClassCast.Emit): If the source type is a type parameter, box it.
4004         If the target type is a type parameter, emit an `unbox.any'
4005         instead of a `classcast'.1      
4006
4007 2004-04-01  Martin Baulig  <martin@ximian.com>
4008
4009         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
4010
4011 2004-04-01  Martin Baulig  <martin@ximian.com>
4012
4013         * generic.cs (ConstructedType.CheckConstraints): Use
4014         Convert.ImplicitStandardConversionExists(); user-defined implicit
4015         conversions are not allowed according to the spec.
4016
4017 2004-03-30  Martin Baulig  <martin@ximian.com>
4018
4019         * expression.cs (New): Added support for type parameters.
4020
4021         * typemanager.cs
4022         (TypeManager.activator_type): New public static field.
4023         (TypeManager.activator_create_instance): Likewise.
4024
4025 2004-03-30  Martin Baulig  <martin@ximian.com>
4026
4027         * typemanager.cs (TypeManager.HasConstructorConstraint): New
4028         public method.
4029
4030 2004-03-30  Martin Baulig  <martin@ximian.com>
4031
4032         * generic.cs (ConstructedType.CheckConstraints): Actually follow
4033         the spec here: the argument type must be convertible to the
4034         constraints.
4035
4036 2004-03-30  Martin Baulig  <martin@ximian.com>
4037
4038         * generic.cs
4039         (TypeParameter.Define, TypeParameter.DefineMethod): Call
4040         TypeManager.AddTypeParameter().
4041         (ConstructedType.CheckConstraints): Re-enable this and actually
4042         check whether we have a constructor constraint.
4043
4044         * typemanager.cs
4045         (TypeManager.builder_to_type_param): New static field.
4046         (TypeManager.AddTypeParameter): New static method.
4047         (TypeManager.LookupTypeParameter): New public method.
4048
4049 2004-03-30  Martin Baulig  <martin@ximian.com>
4050
4051         * generic.cs (TypeParameter.DefineType): Return a boolean and use
4052         the new API to actually define the constructor constraint.
4053
4054         * typemanager.cs
4055         (TypeManager.new_constraint_attr_type): New static field.
4056         (TypeManager.InitCoreTypes): Initialize it.
4057
4058 2004-03-30  Martin Baulig  <martin@ximian.com>
4059
4060         * generic.cs (Constraints): Completed error checking, use correct
4061         error numbers.
4062
4063 2004-03-29  Martin Baulig  <martin@ximian.com>
4064
4065         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
4066
4067         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4068         public version which takes a `ParameterData pd' instead of an
4069         `ArrayList args'.
4070
4071 2004-03-29  Martin Baulig  <martin@ximian.com>
4072
4073         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
4074         not a MethodInfo.       
4075
4076 2004-03-29  Martin Baulig  <martin@ximian.com>
4077
4078         * expression.cs (Argument.ResolveMethodGroup): If we're a
4079         ConstructedType, call GetMemberAccess() on it.  
4080
4081 2004-03-29  Martin Baulig  <martin@ximian.com>
4082
4083         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
4084         (MethodCore.CheckGenericOverride): When overriding a generic
4085         method, check whether the constraints match.
4086
4087         * support.cs (GenericConstraints): New public interface.
4088         (ParameterData.GenericConstraints): New public method.
4089
4090         * parameter.cs (Parameter.Resolve): Check whether we're a generic
4091         method parameter and compute our constraints if appropriate.
4092         (Parameter.GenericConstraints): New public property.
4093
4094         * generic.cs (Constraints): Implement GenericConstraints.
4095
4096 2004-03-29  Martin Baulig  <martin@ximian.com>
4097
4098         * decl.cs (MemberCache.FindMemberToOverride): Use
4099         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
4100
4101 2004-03-29  Martin Baulig  <martin@ximian.com>
4102
4103         * generic.cs (GenericMethod.Define): Resolve our type parameters.
4104
4105 2004-03-29  Martin Baulig  <martin@ximian.com>
4106
4107         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
4108         not allowed on non-generic declarations").
4109
4110 2004-03-29  Martin Baulig  <martin@ximian.com>
4111
4112         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4113         public version of this method.
4114
4115         * class.cs (MethodCore.IsDuplicateImplementation): Use
4116         Invocation.InferTypeArguments() to check this.
4117
4118 2004-03-29  Martin Baulig  <martin@ximian.com>
4119
4120         * convert.cs: Use TypeManager.IsDelegateType() instead of
4121         comparing types correctly.
4122
4123 2004-03-29  Martin Baulig  <martin@ximian.com>
4124
4125         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
4126         types directly to make it work for generic instances.
4127
4128         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
4129
4130 2004-03-29  Martin Baulig  <martin@ximian.com>
4131
4132         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
4133         support for arrays.     
4134
4135 2004-03-24  Martin Baulig  <martin@ximian.com>
4136
4137         * decl.cs (DeclSpace.FindType): Also use
4138         TypeManager.CheckGeneric() for types from the using clauses.
4139
4140 2004-03-23  Martin Baulig  <martin@ximian.com>
4141
4142         * expression.cs (Invocation.OverloadResolve): Added `bool
4143         may_fail' argument and use it instead of the Location.IsNull() hack.
4144
4145 2004-03-23  Martin Baulig  <martin@ximian.com>
4146
4147         * expression.cs (Invocation.InferType): Use correct type inference
4148         rules here.     
4149
4150 2004-03-23  Martin Baulig  <martin@ximian.com>
4151
4152         * ecore.cs (MethodGroupExpr.Name): Use
4153         TypeManager.CSharpSignature() instead of just the name.
4154
4155         * expression.cs (Invocation.OverloadResolve): Provide better error
4156         reporting.
4157         (Invocation.DoResolve): OverloadResolve() never returns null
4158         without reporting an error, so removed the error -6 reporting here.
4159
4160 2004-03-23  Martin Baulig  <martin@ximian.com>
4161
4162         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
4163         generic methods.
4164
4165         * cs-parser.jay (delegate_declaration): Support generic delegates.
4166
4167         * delegate.cs: Support generic delegates.
4168
4169 2004-03-22  Martin Baulig  <martin@ximian.com>
4170
4171         * expression.cs (Invocation.InferParamsTypeArguments): New static
4172         method; does type inference for params arguments.
4173
4174 2004-03-21  Martin Baulig  <martin@ximian.com>
4175
4176         * typemanager.cs (TypeManager.IsGenericMethod): New public static
4177         method; checks whether a method is a generic method.    
4178
4179         * expression.cs (Invocation.InferTypeArguments): New static method;
4180         infer type arguments for generic method invocation.
4181
4182         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
4183         property; we set this to true if we're resolving a generic method
4184         invocation and the user specified type arguments, ie. we're not
4185         doing type inference.
4186
4187 2004-03-20  Martin Baulig  <martin@ximian.com>
4188
4189         * class.cs (MethodData.DeclaringType): New public property.
4190         (MethodData.Define): Set DeclaringType here.
4191         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
4192         instead of OperatorMethodBuilder.DeclaringType.
4193
4194 2004-03-20  Martin Baulig  <martin@ximian.com>
4195
4196         * cs-tokenizer.cs (xtoken): Return a special
4197         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
4198
4199         * cs-parser.jay (default_value_expression): Switch to the new
4200         syntax (14.5.13).
4201
4202 2004-03-19  Martin Baulig  <martin@ximian.com>
4203
4204         * decl.cs (MemberName): New class.  We use this to "construct"
4205         namespace_or_type_name's.
4206
4207         * generics.cs (TypeArguments.GetDeclarations): New public method;
4208         returns the type arguments as a string[] and reports a CS0081 if
4209         one of them is not an identifier.
4210
4211         * class.cs (MemberBase): The .ctor now takes the name as a
4212         MemberName instead of a string.
4213         (MemberBase.ExplicitInterfaceName): Changed type from string to
4214         Expression.
4215         (MemberBase.DoDefine): If we're an explicit implementation, the
4216         InterfaceType may be a generic instance.
4217
4218         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
4219         (namespace_name): Call MemberName.GetName () to transform the
4220         MemberName into a string and ensure we don't have any type
4221         arguments.
4222         (type_name): Call MemberName.GetTypeExpression() to transfrom the
4223         MemberName into an expression.
4224         (method_header): Use namespace_or_type_name instead of member_name.     
4225
4226 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
4227
4228         * rootcontext.cs: Add new types to the boot resolution.
4229
4230         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
4231         MulticastDelegate is not allowed.
4232
4233         * typemanager.cs: Add new types to lookup: System.TypedReference
4234         and ArgIterator.
4235
4236         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
4237         check for TypedReference or ArgIterator, they are not allowed. 
4238
4239         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
4240         makes us properly catch 1510 in some conditions (see bug 56016 for
4241         details). 
4242
4243 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
4244
4245         * CryptoConvert.cs: update from corlib version
4246         with endian fixes.
4247
4248 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
4249
4250         * class.cs (Indexer.Define): Check indexername declaration
4251
4252 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
4253
4254         * attribute.cs (IsClsCompliant): Fixed problem with handling
4255         all three states (compliant, not-compliant, undetected).
4256
4257 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
4258
4259         * attribute.cs (Attribute): Location is now public.
4260         (Resolve): Store resolved arguments (pos_values) in attribute class.
4261         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
4262         (GetClsCompliantAttributeValue): New method that gets
4263         CLSCompliantAttribute value.
4264         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
4265         if exists else null.
4266         (AttributeTester): New class for CLS-Compliant verification routines.
4267
4268         * class.cs (Emit): Add CLS-Compliant verification.
4269         (Method.GetSignatureForError): Implemented.
4270         (Constructor.GetSignatureForError): Implemented
4271         (Constructor.HasCompliantArgs): Returns if constructor has
4272         CLS-Compliant arguments.
4273         (Constructor.Emit): Override.
4274         (Construcor.IsIdentifierClsCompliant): New method; For constructors
4275         is needed to test only parameters.
4276         (FieldBase.GetSignatureForError): Implemented.
4277         (TypeContainer): New member for storing base interfaces.
4278         (TypeContainer.FindMembers): Search in base interfaces too.
4279
4280         * codegen.cs (GetClsComplianceAttribute): New method that gets
4281         assembly or module CLSCompliantAttribute value.
4282         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
4283         for assembly.
4284         (ModuleClass.Emit): Add error 3012 test.
4285
4286         * const.cs (Emit): Override and call base for CLS-Compliant tests.
4287
4288         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
4289         state for all decl types.
4290         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4291         if CLS-Compliant tests are required.
4292         (IsClsCompliaceRequired): New method. Analyze whether code
4293         must be CLS-Compliant.
4294         (IsExposedFromAssembly): New method. Returns true when MemberCore
4295         is exposed from assembly.
4296         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4297         value or gets cached value.
4298         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4299         is explicitly marked with CLSCompliantAttribute.
4300         (IsIdentifierClsCompliant): New abstract method. This method is
4301         used to testing error 3005.
4302         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4303         for identifier and parameters CLS-Compliant testing.
4304         (VerifyClsCompliance): New method. The main virtual method for
4305         CLS-Compliant verifications.
4306         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4307         null. I don't know why is null (too many public members !).
4308         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4309         and get value of first CLSCompliantAttribute that found.
4310
4311         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4312         (VerifyClsCompliance): Override and add extra tests.
4313
4314         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4315         clscheck- disable CLS-Compliant verification event if assembly is has
4316         CLSCompliantAttribute(true).
4317
4318         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4319         ApllyAttribute is now called in emit section as in the other cases.
4320         Possible future Emit integration.
4321         (IsIdentifierClsCompliant): New override.
4322         (VerifyClsCompliance): New override.
4323         (GetEnumeratorName): Returns full enum name.
4324
4325         * parameter.cs (GetSignatureForError): Implemented.
4326
4327         * report.cs (WarningData): New struct for Warning message information.
4328         (LocationOfPreviousError): New method.
4329         (Warning): New method. Reports warning based on the warning table.
4330         (Error_T): New method. Reports error based on the error table.
4331
4332         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4333         verifications are done here.
4334
4335         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4336
4337         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4338         CLSCompliantAttribute.
4339         (all_imported_types): New member holds all imported types from other
4340         assemblies.
4341         (LoadAllImportedTypes): New method fills static table with exported types
4342         from all referenced assemblies.
4343         (Modules): New property returns all assembly modules.
4344
4345 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4346
4347         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4348         throwing a parser error.
4349
4350         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4351         which removes the hardcoded get_/set_ prefixes for properties, as
4352         IL allows for the properties to be named something else.  
4353
4354         Bug #56013
4355
4356         * expression.cs: Do not override operand before we know if it is
4357         non-null.  Fix 56207
4358
4359 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4360
4361         * typemanager.cs: support for pinned variables.
4362
4363 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4364
4365         * decl.cs, typemanager.cs: Avoid using an arraylist
4366         as a buffer if there is only one result set.
4367
4368 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4369
4370         * expression.cs: Make sure you cant call a static method
4371         with an instance expression, bug #56174.
4372
4373 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4374
4375         * class.cs (IsDuplicateImplementation): Improve error reporting to
4376         flag 663 (method only differs in parameter modifier).
4377
4378         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4379         in preprocessor directives.
4380
4381         * location.cs (LookupFile): Allow for the empty path.
4382
4383         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4384         better approach for some of that patch, but its failing with the
4385         CharSet enumeration.  For now try/catch will do.
4386
4387         * typemanager.cs: Do not crash if a struct does not have fields.
4388         Fixes 56150.
4389
4390 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4391
4392         * expression.cs: cs0213, cant fix a fixed expression.
4393         fixes 50231.
4394
4395 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4396
4397         * cs-parser.jay: detect invalid embeded statements gracefully.
4398         bug #51113.
4399
4400 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4401
4402         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4403         As a regex:
4404         s/
4405         the invocation type may not be a subclass of the tye of the item/
4406         The type of the item must be a subclass of the invocation item.
4407         /g
4408
4409         Fixes bug #50820.
4410
4411 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4412
4413         * attribute.cs: Added methods to get a string and a bool from an
4414         attribute. Required to information from AssemblyKeyFileAttribute,
4415         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4416         * codegen.cs: Modified AssemblyName creation to include support for
4417         strongnames. Catch additional exceptions to report them as CS1548.
4418         * compiler.csproj: Updated include CryptoConvert.cs.
4419         * compiler.csproj.user: Removed file - user specific configuration.
4420         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4421         Mono.Security assembly. The original class is maintained and tested in
4422         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4423         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4424         like CSC 8.0 (C# v2) supports.
4425         * Makefile: Added CryptoConvert.cs to mcs sources.
4426         * rootcontext.cs: Added new options for strongnames.
4427
4428 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4429
4430         * driver.cs: For --expect-error, report error code `2'
4431         if the program compiled with no errors, error code `1' if
4432         it compiled with an error other than the one expected.
4433
4434 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4435
4436         * compiler.csproj: Updated for Visual Studio .NET 2003.
4437         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4438         * compiler.sln: Updated for Visual Studio .NET 2003.
4439
4440 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4441
4442         * expression.cs: Fix bug #47234. We basically need to apply the
4443         rule that we prefer the conversion of null to a reference type
4444         when faced with a conversion to 'object' (csc behaviour).
4445
4446 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4447
4448         * statement.cs: Shorter form for foreach, eliminates
4449         a local variable. r=Martin.
4450
4451 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4452
4453         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4454         checks if we can use brtrue/brfalse to test for 0.
4455         * expression.cs: use the above in the test for using brtrue/brfalse.
4456         cleanup code a bit.
4457
4458 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4459
4460         * expression.cs: Rewrite string concat stuff. Benefits:
4461
4462         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4463         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4464         rather than a concat chain.
4465
4466         * typemanager.cs: Add lookups for more concat overloads.
4467
4468 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4469
4470         * expression.cs: Emit shorter il code for array init.
4471
4472         newarr
4473         dup
4474         // set 1
4475
4476         // set 2
4477
4478         newarr
4479         stloc.x
4480
4481         ldloc.x
4482         // set 1
4483
4484         ldloc.x
4485         // set 2
4486
4487 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4488
4489         * statement.cs: Before, two switch blocks would be merged if the
4490         total size of the blocks (end_item - begin_item + 1) was less than
4491         two times the combined sizes of the blocks.
4492
4493         Now, it will only merge if after the merge at least half of the
4494         slots are filled.
4495
4496         fixes 55885.
4497
4498 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4499
4500         * class.cs : csc build fix for GetMethods(). See bug #52503.
4501
4502 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4503
4504         * expression.cs: Make sure fp comparisons work with NaN.
4505         This fixes bug #54303. Mig approved this patch a long
4506         time ago, but we were not able to test b/c the runtime
4507         had a related bug.
4508
4509 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4510
4511         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4512
4513 2004-03-19  Martin Baulig  <martin@ximian.com>
4514
4515         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
4516         two overloads may unify for some type parameter substitutions and
4517         report a CS0408 if appropriate.
4518
4519 2004-03-19  Martin Baulig  <martin@ximian.com>
4520
4521         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4522         error here and not in our caller.
4523
4524 2004-03-19  Martin Baulig  <martin@ximian.com>
4525
4526         * interface.cs: Completely killed this file.
4527         (Interface): We're now a TypeContainer and live in class.cs.
4528
4529         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4530         argument; we're now also called for interfaces.
4531         (TypeContainer.DefineMembers): Allow this method being called
4532         multiple times.
4533         (TypeContainer.GetMethods): New public method; formerly known as
4534         Interface.GetMethod().  This is used by PendingImplementation.
4535         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4536         it's now private and non-static.
4537         (Interface): Moved this here; it's now implemented similar to
4538         Class and Struct.
4539         (Method, Property, Event, Indexer): Added `bool is_interface'
4540         argument to their .ctor's.
4541         (MemberBase.IsInterface): New public field.
4542
4543         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4544         instances instead of InterfaceMethod, InterfaceProperty, etc.
4545         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4546         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4547
4548 2004-03-19  Martin Baulig  <martin@ximian.com>
4549
4550         * class.cs (MethodCore.IsDuplicateImplementation): New private
4551         method which does the CS0111 checking.
4552         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4553         Use IsDuplicateImplementation().
4554
4555 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4556
4557         * decl.cs (FindMemberToOverride): New method to find the correct
4558         method or property to override in the base class.
4559         * class.cs
4560             - Make Method/Property use the above method to find the
4561               version in the base class.
4562             - Remove the InheritableMemberSignatureCompare as it is now
4563               dead code.
4564
4565         This patch makes large code bases much faster to compile, as it is
4566         O(n) rather than O(n^2) to do this validation.
4567
4568         Also, it fixes bug 52458 which is that nested classes are not
4569         taken into account when finding the base class member.
4570
4571         Reviewed/Approved by Martin.
4572
4573 2004-03-17  Martin Baulig  <martin@ximian.com>
4574
4575         * expression.cs (MemberAccess.DoResolve): Take the parent's number
4576         of type arguments into account; use the `real_num_type_args'
4577         approach like in DoResolveAsTypeStep().
4578
4579         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
4580         nested types.
4581
4582 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4583
4584         * interface.cs: In all interface classes removed redundant
4585         member initialization.
4586
4587 2004-03-16  Martin Baulig  <martin@ximian.com>
4588
4589         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4590
4591 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4592
4593         * decl.cs (DefineTypeAndParents): New helper method to define a
4594         type's containers before the type itself is defined;  This is a
4595         bug exposed by the recent changes to Windows.Forms when an
4596         implemented interface was defined inside a class that had not been
4597         built yet.   
4598
4599         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4600
4601         (Check): Loop correctly to report errors modifiers
4602         (UNSAFE was not in the loop, since it was the same as TOP).
4603
4604         * interface.cs: Every interface member now takes a ModFlags,
4605         instead of a "is_new" bool, which we set on the base MemberCore. 
4606
4607         Every place where we called "UnsafeOk" in the interface, now we
4608         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4609         the unsafe settings from the member declaration instead of the
4610         container interface. 
4611
4612         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4613
4614         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4615         `set_indexer_name' to the pending bits (one per type).
4616
4617         We fixed a bug today that was picking the wrong method to
4618         override, since for properties the existing InterfaceMethod code
4619         basically ignored the method name.  Now we make sure that the
4620         method name is one of the valid indexer names.
4621
4622 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4623  
4624         * support.cs (SeekableStreamReader): Keep track of stream byte
4625         positions and don't mix them with character offsets to the buffer.
4626
4627         Patch from Gustavo Giráldez
4628
4629 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4630
4631         * interface.cs (InterfaceSetGetBase): Removed double member
4632         initialization, base class does it as well.
4633
4634 2004-03-13  Martin Baulig  <martin@ximian.com>
4635
4636         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4637         when compiling corlib.
4638
4639 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4640
4641         * convert.cs (ExplicitConversion): We were reporting an error on
4642         certain conversions (object_type source to a value type, when the
4643         expression was `null') before we had a chance to pass it through
4644         the user defined conversions.
4645
4646         * driver.cs: Replace / and \ in resource specifications to dots.
4647         Fixes 50752
4648
4649         * class.cs: Add check for duplicate operators.  Fixes 52477
4650
4651 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4652
4653         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4654         that are in the middle of the statements, not only at the end.
4655         Fixes #54987
4656
4657         * class.cs (TypeContainer.AddField): No longer set the
4658         `HaveStaticConstructor' flag, now we call it
4659         `UserDefineStaticConstructor' to diferentiate the slightly
4660         semantic difference.
4661
4662         The situation is that we were not adding BeforeFieldInit (from
4663         Modifiers.TypeAttr) to classes that could have it.
4664         BeforeFieldInit should be set to classes that have no static
4665         constructor. 
4666
4667         See:
4668
4669         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4670
4671         And most importantly Zoltan's comment:
4672
4673         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4674
4675         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4676          before its static fields are used', i.e. initialization does not need
4677          to be triggered by the first access to the type. Setting this flag
4678          helps the JIT to compile better code, since it can run the static
4679          constructor at JIT time, and does not need to generate code to call it
4680          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4681          this flag for lots of classes like String. 
4682          
4683          csc sets this flag if the type does not have an explicit static 
4684          constructor. The reasoning seems to be that if there are only static
4685          initalizers for a type, and no static constructor, then the programmer
4686          does not care when this initialization happens, so beforefieldinit
4687          can be used.
4688          
4689          This bug prevents the AOT compiler from being usable, since it 
4690          generates so many calls to mono_runtime_class_init that the AOT code
4691          is much slower than the JITted code. The JITted code is faster, 
4692          because it does not generate these calls if the vtable is type is
4693          already initialized, which is true in the majority of cases. But the
4694          AOT compiler can't do this."
4695
4696 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4697
4698         * class.cs (MethodData.Emit): Refactor the code so symbolic
4699         information is generated for destructors;  For some reasons we
4700         were taking a code path that did not generate symbolic information
4701         before. 
4702
4703 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4704
4705         * class.cs: Create a Constructor.CheckBase method that
4706         takes care of all validation type code. The method
4707         contains some code that was moved from Define.
4708
4709         It also includes new code that checks for duplicate ctors.
4710         This fixes bug #55148.
4711
4712 2004-03-09  Joshua Tauberer <tauberer@for.net>
4713
4714         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4715         a { ... }-style array creation invokes EmitStaticInitializers
4716         which is not good for reference-type arrays.  String, decimal
4717         and now null constants (NullCast) are not counted toward
4718         static initializers.
4719
4720 2004-03-05  Martin Baulig  <martin@ximian.com>
4721
4722         * location.cs (SourceFile.HasLineDirective): New public field;
4723         specifies whether the file contains or is referenced by a "#line"
4724         directive.
4725         (Location.DefineSymbolDocuments): Ignore source files which
4726         either contain or are referenced by a "#line" directive.        
4727
4728 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4729
4730         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4731         direct access to our parent, so check the method inline there.
4732
4733 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4734
4735         * expression.cs (Invocation.EmitCall): Miguel's last commit
4736         caused a regression. If you had:
4737
4738             T t = null;
4739             t.Foo ();
4740
4741         In Foo the implict this would be null.
4742
4743 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4744
4745         * expression.cs (Invocation.EmitCall): If the method is not
4746         virtual, do not emit a CallVirt to it, use Call.
4747
4748         * typemanager.cs (GetFullNameSignature): Improve the method to
4749         cope with ".ctor" and replace it with the type name.
4750
4751         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4752         as an argument the ConstructorBuilder where it is being defined,
4753         to catch the recursive constructor invocations.
4754
4755 2004-03-16  Martin Baulig  <martin@ximian.com>
4756
4757         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
4758         ConstructedType, call ResolveType() on it to get the type rather
4759         than just using `expr.Type'.
4760
4761 2004-03-16  Martin Baulig  <martin@ximian.com>
4762
4763         * generics.cs (ConstructedType.GetMemberAccess): Take the
4764         EmitContext instead on the TypeExpr and use
4765         ec.TypeContainer.CurrentType/ec.ContainerType.
4766
4767 2004-03-16  Martin Baulig  <martin@ximian.com>
4768
4769         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
4770         parameters before aliases.
4771
4772 2004-03-16  Martin Baulig  <martin@ximian.com>
4773
4774         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
4775         New oublic function; checks whether two generic instances may become
4776         equal under some instantiations (26.3.1).
4777
4778         * class.cs (TypeContainer.Define): Call
4779         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
4780         error.
4781
4782 2004-03-16  Martin Baulig  <martin@ximian.com>
4783
4784         * class.cs (TypeContainer.GetClassBases): Moved
4785         Error_TypeParameterAsBase() here and also check whether the base
4786         class is not an attribute.
4787
4788 2004-03-16  Martin Baulig  <martin@ximian.com>
4789
4790         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4791
4792 2004-03-16  Martin Baulig  <martin@ximian.com>
4793
4794         * class.cs (Error_TypeParameterAsBase): Use correct error number
4795         here (CS0689).  
4796
4797 2004-03-16  Martin Baulig  <martin@ximian.com>
4798
4799         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
4800         for generics.
4801
4802         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
4803         error reporting.
4804
4805 2004-03-15  Martin Baulig  <martin@ximian.com>
4806
4807         * typemanager.cs (TypeManager.GetFullName): New public method.
4808         (TypeManager.MemberLookup): Added `int_num_type_arguments'
4809         argument; only return members with the correct number of type
4810         arguments.
4811         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
4812         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
4813         whether the number of type arguments matches.
4814
4815         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
4816         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
4817
4818         * expression.cs (MemberAccess): Added public `NumTypeArguments'
4819         field; it's set by the protected .ctor when we're actually a
4820         GenericMemberAccess.
4821         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
4822         arguments and pass it to MemberLookupFinal ().
4823
4824         * ecore.cs (Expression.MemberLookup): Added `int
4825         num_type_arguments' argument; only return members with the correct
4826         number of type arguments.
4827         (Expression.MemberLookupFailed): Check whether the MemberLookup
4828         failed because we did not have the correct number of type
4829         arguments; report CS0305 in this case.
4830
4831         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
4832         `e.ResolveAsTypeTerminal()' already did so.
4833
4834 2004-03-15  Martin Baulig  <martin@ximian.com>
4835
4836         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
4837         we're a ConstructedType; in this case, the caller must report an
4838         error (for instance CS0131).
4839
4840         * generic.cs (TypeArguments): Added Location argument to the .ctor.
4841         (TypeArguments.Resolve): Actually report errors here.
4842
4843 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4844
4845         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4846         `set_indexer_name' to the pending bits (one per type).
4847
4848         We fixed a bug today that was picking the wrong method to
4849         override, since for properties the existing InterfaceMethod code
4850         basically ignored the method name.  Now we make sure that the
4851         method name is one of the valid indexer names.
4852
4853 2004-03-15  Martin Baulig  <martin@ximian.com>
4854
4855         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
4856         for generic instances.
4857
4858 2004-03-13  Martin Baulig  <martin@ximian.com>
4859
4860         * class.cs (TypeContainer.DefineType): Call
4861         TypeManager.AddUserType() immediately after creating the
4862         TypeBuilder; pass all type parameters when creating the
4863         CurrentType.
4864
4865         * decl.cs (DeclSpace.FindNestedType): New public method.
4866         (DeclSpace.FindType): Added `int num_type_args' argument; only
4867         return types with the correct number of type parameters.
4868         (DeclSpace.CountTypeParams): New public property.
4869
4870         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
4871         the number of type parameters; defaults to zero.
4872
4873         * generic.cs (TypeArguments.Count): New public property.
4874         (ConstructedType.DoResolveAsTypeStep): First call
4875         ds.FindNestedType() to find out whether we're nested in the
4876         current generic type; in this case, we inherit all type parameters
4877         from the current class.
4878
4879         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
4880         num_type_args' argument.
4881         (RootContext.LookupType): Added overloaded version which takes the
4882         number of type arguments; only return types with the correct
4883         number of type arguments.
4884
4885         * typemanager.cs (TypeManager.CheckGeneric): New public function;
4886         checks whether `Type t' has `int num_type_args'.
4887
4888 2004-03-13  Martin Baulig  <martin@ximian.com>
4889
4890         * generic.cs (GenericMethod.DefineType): New method; calls
4891         DefineType() on all the type parameters.
4892
4893         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
4894         (MethodData.Define): If we're a generic method, call
4895         GenericMethod.DefineType() to define the type parameters.       
4896
4897 2004-03-10  Martin Baulig  <martin@ximian.com>
4898
4899         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
4900         instead of IsAssignableFrom.    
4901
4902 2004-03-10  Martin Baulig  <martin@ximian.com>
4903
4904         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
4905
4906         * support.cs (ParameterData.HasArrayParameter): New property.
4907         (ReflectionParameters.ctor): Take a MethodBase instead of a
4908         ParameterInfo[].  If we have any type parameters, get the generic
4909         method definition and ask it whether we have variable arguments.
4910
4911 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4912
4913         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4914         routines to check if a type is an enumerable/enumerator allow
4915         classes that implement the IEnumerable or IEnumerator interfaces.
4916
4917         * class.cs (Property, Operator): Implement IIteratorContainer, and
4918         implement SetYields.
4919
4920         (Property.Define): Do the block swapping for get_methods in the
4921         context of iterators.   We need to check if Properties also
4922         include indexers or not.
4923
4924         (Operator): Assign the Block before invoking the
4925         OperatorMethod.Define, so we can trigger the Iterator code
4926         replacement. 
4927
4928         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4929         Property and Operator classes are not created when we parse the
4930         declarator but until we have the block completed, so we use a
4931         singleton SimpleIteratorContainer.Simple to flag whether the
4932         SetYields has been invoked.
4933
4934         We propagate this setting then to the Property or the Operator to
4935         allow the `yield' to function.
4936
4937 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4938
4939         * codegen.cs: Implemented attribute support for modules.
4940         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4941         Assembly/Module functionality.
4942
4943         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4944         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4945         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4946
4947 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4948
4949         * interface.cs (FindMembers): The operation is performed on all base
4950         interfaces and not only on the first. It is required for future CLS Compliance patch.
4951
4952 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4953
4954         * statement.cs, codegen.cs:
4955         This patch deals with patterns such as:
4956
4957         public class List : IEnumerable {
4958
4959                 public MyEnumerator GetEnumerator () {
4960                         return new MyEnumerator(this);
4961                 }
4962
4963                 IEnumerator IEnumerable.GetEnumerator () {
4964                         ...
4965                 }
4966                 
4967                 public struct MyEnumerator : IEnumerator {
4968                         ...
4969                 }
4970         }
4971
4972         Before, there were a few things we did wrong:
4973         1) we would emit callvirt on a struct, which is illegal
4974         2) we emited ldarg when we needed to emit ldarga
4975         3) we would mistakenly call the interface methods on an enumerator
4976         type that derived from IEnumerator and was in another assembly. For example:
4977
4978         public class MyEnumerator : IEnumerator
4979
4980         Would have the interface methods called, even if there were public impls of the
4981         method. In a struct, this lead to invalid IL code.
4982
4983 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4984
4985         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4986           renamed to Emit.
4987
4988         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4989
4990 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4991
4992         * cs-parser.jay: Fix small regression: we were not testing V2
4993         compiler features correctly.
4994
4995         * interface.cs: If the emit context is null, then create one
4996
4997 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4998
4999         * decl.cs (GetSignatureForError): New virtual method to get full name
5000           for error messages.
5001
5002         * attribute.cs (IAttributeSupport): New interface for attribute setting.
5003           Now it is possible to rewrite ApplyAttributes method to be less if/else.
5004
5005         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
5006           Duplicated members and code in these classes has been removed.
5007           Better encapsulation in these classes.
5008
5009 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
5010
5011         * assign.cs (Assign.DoResolve): When dealing with compound
5012         assignments, there is a new rule in ECMA C# 2.4 (might have been
5013         there before, but it is documented here) that states that in:
5014
5015         a op= b;
5016
5017         If b is of type int, and the `op' is a shift-operator, then the
5018         above is evaluated as:
5019
5020         a = (int) a op b 
5021
5022         * expression.cs (Binary.ResolveOperator): Instead of testing for
5023         int/uint/long/ulong, try to implicitly convert to any of those
5024         types and use that in pointer arithmetic.
5025
5026         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
5027         method to print information for from the type, not from the
5028         null-method we were given.
5029
5030 2004-02-01  Duncan Mak  <duncan@ximian.com>
5031
5032         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
5033         parsing for cmd, fixes bug #53694.
5034
5035 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
5036
5037         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
5038         in the member name duplication tests. Property and operator name duplication
5039         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
5040
5041 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
5042
5043         * interface.cs (PopulateMethod): Fixed crash when interface method
5044         returns not existing type (error test cs0246-3.cs).
5045
5046 2004-02-02  Ravi Pratap M <ravi@ximian.com>
5047
5048         * cs-parser.jay (interface_accessors): Re-write actions to also
5049         store attributes attached to get and set methods. Fix spelling
5050         while at it.
5051
5052         (inteface_property_declaration): Modify accordingly.
5053
5054         (InterfaceAccessorInfo): New helper class to store information to pass
5055         around between rules that use interface_accessors.
5056
5057         * interface.cs (Emit): Apply attributes on the get and set
5058         accessors of properties and indexers too.
5059
5060         * attribute.cs (ApplyAttributes): Modify accordingly to use the
5061         right MethodBuilder when applying attributes to the get and set accessors.
5062
5063 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
5064
5065         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
5066
5067 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
5068
5069         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
5070
5071 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
5072
5073         * cs-parser.jay: Remove YIELD token, instead use the new grammar
5074         changes that treat `yield' specially when present before `break'
5075         or `return' tokens.
5076
5077         * cs-tokenizer.cs: yield is no longer a keyword.
5078
5079 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
5080
5081         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
5082         setting for default constructors.
5083         For default constructors are almost every time set wrong Modifier. The
5084         generated IL code has been alright. But inside mcs this values was
5085         wrong and this was reason why several of my CLS Compliance tests
5086         failed.
5087
5088 2004-02-27  Martin Baulig  <martin@ximian.com>
5089
5090         * generics.cs (ConstructedType.ResolveType): Make the nested type
5091         stuff actually work.
5092
5093 2004-02-25  Martin Baulig  <martin@ximian.com>
5094
5095         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
5096         property; returns the type parameters just from the current type,
5097         ie. with the ones from outer classes.
5098         (DeclSpace.LookupGeneric): First search in the current class, then
5099         in outer classes.
5100         (DeclSpace.initialize_type_params): When hiding a type parameter
5101         from an outer class, put it into the `type_param_list' anyways.
5102
5103         * expression.cs (MemberAccess.expr): Made this field protected.
5104
5105         * class.cs (TypeContainer.Define): The `CurrentType' just contains
5106         the type parameters from the current class.
5107
5108         * generic.cs (ConstructedType.ResolveType): Support nested generic
5109         types by taking the type parameters which we inherit from outer
5110         classes into account.
5111         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
5112         support for nested generic types.
5113
5114 2004-02-23  Martin Baulig  <martin@ximian.com>
5115
5116         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
5117         field and check whether we're nested inside a generic type.
5118         (DeclSpace.ResolveType): If we're resolving to a generic type
5119         definition, create a ConstructedType and return its resolved type.
5120         (DeclSpace.initialize_type_params): New private method;
5121         initializes the `type_param_list' field from the type parameters
5122         from this and all enclosing classes.
5123         (DeclSpace.TypeParameters): Call initialize_type_params() unless
5124         we're already initialized.
5125
5126 2004-02-23  Martin Baulig  <martin@ximian.com>
5127
5128         * class.cs (Method.Define): Create the generic method before
5129         calling DoDefine().
5130         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
5131         the TypeContainer one); we use this for generic methods.
5132
5133         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
5134         parent's TypeBuilder.
5135
5136 2004-02-18  Martin Baulig  <martin@ximian.com>
5137
5138         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
5139         to check for equality.
5140
5141 2004-02-05  Martin Baulig  <martin@ximian.com>
5142
5143         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
5144         `ec.TypeContainer.CurrentType', use it instead of
5145         `ec.ContainerType' to check whether we're in the type's ctor.
5146
5147 2004-01-29  Martin Baulig  <martin@ximian.com>
5148
5149         * expression.cs (Invocation.DoResolve): If we're a
5150         `ConstructedType', then we're actually a generic method, so
5151         rewrite the expr as a GenericMemberAccess.
5152
5153         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
5154         here; manually parse it into a string.
5155
5156 2004-01-28  Martin Baulig  <martin@ximian.com>
5157
5158         * typemanager.cs (TypeManager.IsEqual): New static method.
5159         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
5160         check for equality instead of using `=='.
5161
5162 2004-01-26  Martin Baulig  <martin@ximian.com>
5163
5164         * decl.cs (DeclSpace.CurrentType): New public field.
5165
5166         * expression.cs (This.ResolveBase): If we have an
5167         `ec.TypeContainer.CurrentType', use it instead of
5168         `ec.ContainerType'.
5169
5170         * class.cs (TypeContainer.DefineType): If we're a generic type,
5171         create the `CurrentType' (unresolved).
5172         (TypeContainer.GenericType): New private field.
5173         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
5174         it and store it in `GenericType' before creating the MemberCache.
5175         (TypeContainer.GetMembers): If we have a `GenericType', call
5176         TypeManager.FindMembers() on it.
5177
5178         * interface.cs (Interface.GenericType): New private field.
5179         (Interface.DefineType): If we're a generic type, create the
5180         `CurrentType' (unresolved).
5181         (Interface.DefineMembers): If we have a `CurrentType', resolve it
5182         and store it in `GenericType' before creating the MemberCache.
5183         (Interface.GetMembers): If we have a `GenericType', call
5184         TypeManager.FindMembers() on it.
5185
5186 2004-01-22  Martin Baulig  <martin@ximian.com>
5187
5188         * cs-parser.jay (namespace_or_type_name): Return an Expression,
5189         not a QualifiedIdentifier.  This is what `type_name_expression'
5190         was previously doing.
5191         (type_name_expression): Removed; the code is now in
5192         `namespace_or_type_name'.
5193         (qualified_identifier): Removed, use `namespace_or_type_name'
5194         instead.
5195         (QualifiedIdentifier): Removed this class.      
5196
5197 2004-01-22  Martin Baulig  <martin@ximian.com>
5198
5199         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
5200         not a string as alias name.
5201
5202 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
5203
5204         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
5205         #52730 bug, and instead compute correctly the need to use a
5206         temporary variable when requesting an address based on the
5207         static/instace modified of the field and the constructor.
5208  
5209 2004-01-21  Martin Baulig  <martin@ximian.com>
5210
5211         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
5212         class and namespace before looking up aliases.  Fixes #52517.
5213
5214 2004-01-21  Martin Baulig  <martin@ximian.com>
5215
5216         * flowanalysis.cs (UsageVector.Merge): Allow variables being
5217         assinged in a 'try'; fixes exception4.cs.
5218
5219 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5220         * class.cs : Implemented parameter-less constructor for TypeContainer
5221
5222         * decl.cs: Attributes are now stored here. New property OptAttributes
5223
5224         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
5225
5226         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
5227
5228 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5229
5230         * typemanager.cs (CSharpSignature): Now reports also inner class name.
5231           (CSharpSignature): New method for indexer and property signature.
5232
5233 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5234
5235         * pending.cs (IsVirtualFilter): Faster implementation.
5236
5237 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5238
5239         * typemanager.cs: Avoid inclusion of same assembly more than once.
5240
5241 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5242
5243         * cs-parser.jay: Fixed problem where the last assembly attribute
5244           has been applied also to following declaration (class, struct, etc.)
5245           
5246 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5247
5248         * class.cs: Added error CS0538, CS0539 reporting.
5249         Fixed crash on Microsoft runtime when field type is void.
5250
5251         * cs-parser.jay: Added error CS0537 reporting.
5252
5253         * pending.cs: Added error CS0535 reporting.
5254         Improved error report for errors CS0536, CS0534.
5255
5256 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
5257
5258         Merge a few bits from the Anonymous Method MCS tree.
5259
5260         * statement.cs (ToplevelBlock): New class for toplevel methods,
5261         will hold anonymous methods, lifted variables.
5262
5263         * cs-parser.jay: Create toplevel blocks for delegates and for
5264         regular blocks of code. 
5265
5266 2004-01-20  Martin Baulig  <martin@ximian.com>
5267
5268         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
5269         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
5270         and `NeedExplicitReturn'; added `IsLastStatement'.
5271         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
5272         have a `ReturnLabel' or we're not unreachable.
5273
5274         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
5275         child's reachability; don't just override ours with it.  Fixes
5276         #58058 (lluis's example).
5277         (FlowBranching): Added public InTryOrCatch(), InCatch(),
5278         InFinally(), InLoop(), InSwitch() and
5279         BreakCrossesTryCatchBoundary() methods.
5280
5281         * statement.cs (Return): Do all error checking in Resolve().
5282         Unless we are the last statement in a top-level block, always
5283         create a return label and jump to it.
5284         (Break, Continue): Do all error checking in Resolve(); also make
5285         sure we aren't leaving a `finally'.
5286         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
5287         statement in a top-level block.
5288         (Block.Flags): Added `IsDestructor'.
5289         (Block.IsDestructor): New public property.
5290
5291 2004-01-20  Martin Baulig  <martin@ximian.com>
5292
5293         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
5294
5295 2004-01-20  Martin Baulig  <martin@ximian.com>
5296
5297         * statement.cs (Statement.ResolveUnreachable): New public method.
5298         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
5299         (Block.Resolve): Resolve unreachable statements.
5300
5301 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5302
5303         * expression.cs: We need to fix the case where we do
5304         not have a temp variable here.
5305
5306         * assign.cs: Only expression compound assignments need
5307         temporary variables.
5308
5309 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5310
5311         * flowanalysis.cs: Reduce memory allocation in a few ways:
5312           - A block with no variables should not allocate a bit
5313             vector for itself.
5314           - A method with no out parameters does not need any tracking
5315             for assignment of the parameters, so we need not allocate
5316             any data for it.
5317           - The arrays:
5318                 public readonly Type[] VariableTypes;
5319                 public readonly string[] VariableNames;
5320             Are redundant. The data is already stored in the variable
5321             map, so we need not allocate another array for it.
5322           - We need to add alot of checks for if (params | locals) == null
5323             due to the first two changes.
5324
5325 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
5326
5327         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
5328         implement IMemoryLocation, we store a copy on a local variable and
5329         take the address of it.  Patch from Benjamin Jemlich
5330
5331         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
5332         to use a special "type_name_expression" rule which reduces the
5333         number of "QualifiedIdentifier" classes created, and instead
5334         directly creates MemberAccess expressions.
5335
5336 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
5337
5338         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
5339         that fixes #52853.  Null literal assignment to ValueType
5340
5341         * class.cs (MethodData.Emit): Instead of checking the name of the
5342         method to determine if its a destructor, create a new derived
5343         class from Method called Destructor, and test for that.  
5344
5345         * cs-parser.jay: Create a Destructor object instead of a Method.  
5346
5347         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
5348
5349         Fixes: 52933
5350
5351 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
5352
5353         * expression.cs (Binary.ResolveOperator): Perform an implicit
5354         conversion from MethodGroups to their delegate types on the
5355         Addition operation.
5356
5357         * delegate.cs: Introduce a new class DelegateCreation that is the
5358         base class for `NewDelegate' and `ImplicitDelegateCreation',
5359         factor some code in here.
5360
5361         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
5362         conversion from MethodGroups to compatible delegate types. 
5363
5364         * ecore.cs (Expression.Resolve): Do not flag error 654
5365         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
5366         we allow conversions from MethodGroups to delegate types now.
5367
5368         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
5369         assignments in v2 either.
5370
5371 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
5372
5373         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
5374         static read-only fields in ctors.
5375
5376         Applied patch from Benjamin Jemlich 
5377
5378         * expression.cs (UnaryMutator): Avoid leaking local variables. 
5379
5380 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
5381
5382         * cs-tokenizer.cs (IsCastToken): Allow the various native types
5383         here to return true, as they can be used like this:
5384
5385                 (XXX) int.MEMBER ()
5386
5387         Fixed 49836 and all the other dups
5388
5389 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
5390
5391         * driver.cs: Implement /win32res and /win32icon.
5392
5393 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
5394
5395         * cs-parser.jay: Add a rule to improve error handling for the
5396         common mistake of placing modifiers after the type.
5397
5398 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
5399
5400         * cs-parser.jay (interface_event_declaration): Catch
5401         initialization of events on interfaces, and report cs0068
5402
5403         * cs-parser.jay (interface_event_declaration): Catch
5404         initialization of events. 
5405
5406         * ecore.cs: Better report missing constructors.
5407
5408         * expression.cs (Binary.ResolveOperator): My previous bug fix had
5409         the error reporting done in the wrong place.  Fix.
5410
5411         * expression.cs (Binary.ResolveOperator): Catch the 
5412         operator + (E x, E y) error earlier, and later allow for implicit
5413         conversions in operator +/- (E e, U x) from U to the underlying
5414         type of E.
5415
5416         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
5417         52596, if the container class is abstract, the default constructor
5418         is protected otherwise its public (before, we were always public).
5419
5420         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
5421         fixed statement.
5422
5423         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
5424         Jemlich that fixes bug #52597, MCS was generating invalid code for
5425         idisposable structs.   Thanks to Ben for following up with this
5426         bug as well.
5427
5428 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
5429
5430         * driver.cs: Allow assemblies without code to be generated, fixes
5431         52230.
5432
5433 2004-01-07  Nick Drochak <ndrochak@gol.com>
5434
5435         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
5436
5437 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
5438
5439         * cs-parser.jay: Add rules to improve error reporting if fields or
5440         methods are declared at the namespace level (error 116)
5441
5442         * Add rules to catch event add/remove
5443
5444 2004-01-04  David Sheldon <dave-mono@earth.li>
5445
5446   * expression.cs: Added matching ")" to error message for 
5447   CS0077
5448
5449 2004-01-03 Todd Berman <tberman@gentoo.org>
5450
5451         * ecore.cs, attribute.cs:
5452         Applying fix from #52429.
5453
5454 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5455
5456         * ecore.cs, expression.cs, statement.cs:
5457         Total rewrite of how we handle branching. We
5458         now handle complex boolean expressions with fewer
5459         jumps. As well if (x == 0) no longer emits a ceq.
5460
5461         if (x is Foo) is much faster now, because we generate
5462         better code.
5463
5464         Overall, we get a pretty big improvement on our benchmark
5465         tests. The code we generate is smaller and more readable.
5466
5467         I did a full two-stage bootstrap. The patch was reviewed
5468         by Martin and Miguel.
5469
5470 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5471
5472         * cs-parser.jay: Make primary_expression not take a QI.
5473         we dont need this because the member_access rule covers
5474         us here. So we replace the rule with just IDENTIFIER.
5475
5476         This has two good effects. First, we remove a s/r conflict.
5477         Second, we allocate many fewer QualifiedIdentifier objects.
5478
5479 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5480
5481         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5482         set the correct information via SRE. This prevents
5483         hanging on the MS runtime. Fixes #29374.
5484
5485 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5486
5487         * convert.cs: correctly handle conversions to value types
5488         from Enum and ValueType as unboxing conversions.
5489
5490         Fixes bug #52569. Patch by Benjamin Jemlich.
5491
5492 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5493
5494         * expression.cs (BetterConversion): Prefer int -> uint
5495         over int -> ulong (csc's behaviour). This fixed bug #52046.
5496
5497 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5498
5499         * decl.cs (MemberCache.FindMembers): now returns a
5500         MemberInfo [].
5501
5502         * typemanager.cs: In general, go with with ^^.
5503         (CopyNewMethods): take an IList.
5504         (RealMemberLookup): Only allocate an arraylist
5505         if we copy from two sets of methods.
5506
5507         This change basically does two things:
5508         1) Fewer array lists allocated due to CopyNewMethods.
5509         2) the explicit cast in MemberList costed ALOT.
5510
5511 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
5512
5513         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
5514         a hashtable to avoid needless string allocations when an identifier is
5515         used more than once (the common case).
5516
5517 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5518
5519         * pending.cs: MS's TypeBuilder.GetInterfaces ()
5520         is broken, it will not return anything. So, we
5521         have to use the information we have in mcs to
5522         do the task.
5523
5524         * typemanager.cs: Add a cache for GetInterfaces,
5525         since this will now be used more often (due to ^^)
5526
5527         (GetExplicitInterfaces) New method that gets the
5528         declared, not effective, interfaces on a type
5529         builder (eg, if you have interface IFoo, interface
5530         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
5531         { IBar }.
5532
5533         This patch makes MCS able to bootstrap itself on
5534         Windows again.
5535
5536 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5537
5538         * expression.cs: Remove the Nop's that Miguel put
5539         in by mistake.
5540
5541 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5542
5543         * report.cs, codegen.cs: Give the real stack trace to
5544         the error when an exception is thrown.
5545
5546 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5547
5548         * decl.cs: only allocate hashtables for ifaces if 
5549         it is an iface!
5550
5551 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5552
5553         * expression.cs: fix the error from cs0121-2.cs
5554         (a parent interface has two child interfaces that
5555         have a function with the same name and 0 params
5556         and the function is called through the parent).
5557
5558 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
5559
5560         * class.cs, rootcontext.cs, typmanager.cs: do not
5561         leak pointers.
5562
5563 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5564
5565         * codegen.cs: remove stack for the ec flow branching.
5566         It is already a linked list, so no need.
5567
5568 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5569
5570         * Makefile: Allow custom profiler here.
5571
5572 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5573
5574         * typemanager.cs (LookupType):
5575           - Use a static char [], because split takes
5576             a param array for args, so it was allocating
5577             every time.
5578           - Do not store true in a hashtable, it boxes.
5579
5580 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5581
5582         * flowanalysis.cs: bytify common enums.
5583
5584 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5585
5586         * modifiers.cs: Add a new set of flags for the
5587         flags allowed on explicit interface impls.
5588         * cs-parser.jay: catch the use of modifiers in
5589         interfaces correctly.
5590         * class.cs: catch private void IFoo.Blah ().
5591
5592         All related to bug #50572.
5593
5594 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5595
5596         * decl.cs: Rewrite the consistant accessability checking.
5597         Accessability is not linear, it must be implemented in
5598         a tableish way. Fixes #49704.
5599
5600 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5601
5602         * expression.cs: Handle negation in a checked context.
5603         We must use subtraction from zero. Fixes #38674.
5604
5605 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5606
5607         * class.cs: Ignore static void main in DLLs.
5608         * rootcontext.cs: Handle the target type here,
5609         since we are have to access it from class.cs
5610         * driver.cs: account for the above.
5611
5612 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5613
5614         * report.cs: Give line numbers and files if available.
5615
5616 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5617
5618         * driver.cs: Implement /addmodule.
5619
5620         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5621         ModuleBuilders.
5622
5623 2003-12-20  Martin Baulig  <martin@ximian.com>
5624
5625         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5626         (FieldBase.IsAssigned): Removed this field.
5627         (FieldBase.SetAssigned): New public method.
5628         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5629
5630 2003-12-20  Martin Baulig  <martin@ximian.com>
5631
5632         * expression.cs (LocalVariableReference.DoResolve): Don't set
5633         `vi.Used' if we're called from DoResolveLValue().
5634
5635         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5636         returns the usage vector it just merged into the current one -
5637         pass this one to UsageWarning().
5638         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5639         of the `EmitContext', don't call this recursively on our children.
5640
5641 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5642
5643         * driver.cs: Implement /target:module.
5644
5645 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5646
5647         * support.cs (CharArrayHashtable): New helper class.
5648
5649         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5650         char arrays, not strings, so we can avoid creating a string in
5651         consume_identifier if the identifier is a keyword.
5652
5653 2003-12-16  Martin Baulig  <martin@ximian.com>
5654
5655         * statement.cs (LocalInfo.Assigned): Removed this property.
5656         (LocalInfo.Flags): Removed `Assigned'.
5657         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5658         and uses flow analysis.
5659         (Block.UsageWarning): Made this method private.
5660         (Block.Resolve): Call UsageWarning() if appropriate.
5661
5662         * expression.cs (LocalVariableReference.DoResolve): Always set
5663         LocalInfo.Used here.
5664
5665 2003-12-13  Martin Baulig  <martin@ximian.com>
5666
5667         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5668         any value here; we're now using flow analysis to figure out
5669         whether a statement/block returns a value.
5670
5671 2003-12-13  Martin Baulig  <martin@ximian.com>
5672
5673         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5674         working again.
5675         (FlowBranching.MergeFinally): Don't call
5676         `branching.CheckOutParameters()' here, this is called in
5677         MergeTopBlock().
5678         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5679         when adding the `finally' vector.       
5680
5681 2003-12-13  Martin Baulig  <martin@ximian.com>
5682
5683         * flowanalysis.cs
5684         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5685         actually work and also fix #48962.
5686
5687 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5688
5689         * decl.cs: Do not check System.Object for nested types,
5690         since we know it does not have any. Big bang for buck:
5691
5692         BEFORE:
5693            Run 1:   8.35 seconds
5694            Run 2:   8.32 seconds
5695            corlib:  17.99 seconds
5696         AFTER:
5697            Run 1:   8.17 seconds
5698            Run 2:   8.17 seconds
5699            corlib:  17.39 seconds
5700
5701 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5702
5703         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5704         time we are returning 0 members, so we save alot here.
5705
5706 2003-12-11  Martin Baulig  <martin@ximian.com>
5707
5708         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5709         `MergeChild()', also just take the `FlowBranching' as argument;
5710         call Merge() on it and return the result.
5711         (FlowBranching.Merge): We don't need to do anything if we just
5712         have one sibling.
5713
5714 2003-12-11  Martin Baulig  <martin@ximian.com>
5715
5716         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5717         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5718         Maurer for this idea.
5719
5720 2003-12-11  Martin Baulig  <martin@ximian.com>
5721
5722         * flowanalysis.cs (MergeResult): This class is now gone; we now
5723         use the `UsageVector' for this.  The reason for this is that if a
5724         branching just has one sibling, we don't need to "merge" them at
5725         all - that's the next step to do.
5726         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5727         `MergeResult'.
5728
5729 2003-12-11  Martin Baulig  <martin@ximian.com>
5730
5731         Reworked flow analyis and made it more precise and bug-free.  The
5732         most important change is that we're now using a special `Reachability'
5733         class instead of having "magic" meanings of `FlowReturns'.  I'll
5734         do some more cleanups and optimizations and also add some more
5735         documentation this week.
5736
5737         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5738         largely reworked this class.
5739         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5740         the new `Reachability' class instead of having "magic" values here.
5741         (FlowBranching): We're now using an instance of `Reachability'
5742         instead of having separate `Returns', `Breaks' etc. fields.
5743
5744         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5745         based on flow analysis; ignore the return value of block.Emit ().
5746
5747 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5748
5749         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5750         if they are private.
5751
5752 2003-12-09  Martin Baulig  <martin@ximian.com>
5753
5754         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5755         call them directly on the UsageVector.
5756
5757 2003-12-09  Martin Baulig  <martin@ximian.com>
5758
5759         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5760         Changed return type from `FlowReturns' to `Reachability'.
5761
5762 2003-12-09  Martin Baulig  <martin@ximian.com>
5763
5764         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5765         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5766         `Reachable' fields with a single `Reachability' one.
5767
5768 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5769
5770         * class.cs (FindMembers): Remove foreach's.
5771
5772         Bootstrap times:
5773
5774         BEFORE
5775                 Run 1:   8.74 seconds
5776                 Run 2:   8.71 seconds
5777
5778         AFTER
5779                 Run 1:   8.64 seconds
5780                 Run 2:   8.58 seconds
5781
5782
5783 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5784
5785         * cs-parser.jay:
5786         * gen-treedump.cs:
5787         * statement.cs:
5788         This patch does a few things:
5789                 1. EmptyStatement is now a singleton, so it is never reallocated.
5790                 2. All blah is EmptyStatement constructs have been changed to
5791                    blah == EmptyStatement.Value, which is much faster and valid
5792                    now that EmptyStatement is a singleton.
5793                 3. When resolving a block, rather than allocating a new array for
5794                    the non-empty statements, empty statements are replaced with
5795                    EmptyStatement.Value
5796                 4. Some recursive functions have been made non-recursive.
5797         Mainly the performance impact is from (3), however (1) and (2) are needed for
5798         this to work. (4) does not make a big difference in normal situations, however
5799         it makes the profile look saner.
5800
5801         Bootstrap times:
5802
5803         BEFORE
5804         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5805         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5806         Total memory allocated: 56397 KB
5807
5808         AFTER
5809         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5810         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5811         Total memory allocated: 55666 KB
5812
5813 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5814
5815         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5816         than the hashtable in a hashtable version
5817
5818         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5819         we always end up concating a string. This results in a huge perf
5820         loss, because many strings have to be tracked by the GC. In this
5821         patch, we first use a hashtable that works with two keys, so that
5822         the strings do not need to be concat'ed.
5823
5824         Bootstrap times:
5825         BEFORE
5826                 Run 1:   8.74 seconds
5827                 Run 2:   8.71 seconds
5828
5829         AFTER
5830                 Run 1:   8.65 seconds
5831                 Run 2:   8.56 seconds
5832
5833 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5834
5835         * Makefile: Add a new target `do-time' that does a quick and simple
5836         profile, leaving easy to parse output.
5837
5838 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5839
5840         * codegen.cs (Init): Create the dynamic assembly with 
5841         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5842
5843 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5844
5845         * support.cs: Make the PtrHashtable use only one
5846         instance of its comparer.
5847
5848 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5849
5850         * typemanager.cs: Fix lookup of GetNamespaces.
5851
5852 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5853
5854         * expression.cs: Removed redundant line.
5855
5856         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5857         ArrayLists, use for loops with bounds.  
5858
5859         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5860         arraylist.
5861
5862         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5863         arraylists, use for loop with bounds.
5864
5865         The above three changes give us a 0.071 second performance
5866         improvement out of 3.294 seconds down to 3.223.  On my machine
5867         the above changes reduced the memory usage by 1,387 KB during
5868         compiler bootstrap.
5869
5870         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5871         QualifiedIdentifiers.  Before we created a new string through
5872         concatenation, and mostly later on, the result would be
5873         manipulated by DecomposeQI through string manipulation.
5874
5875         This reduced the compiler memory usage for bootstrapping from
5876         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5877         compile times in 0.05 seconds.
5878
5879 2003-11-28  Dick Porter  <dick@ximian.com>
5880
5881         * support.cs: Do string compares with the Invariant culture.
5882
5883         * rootcontext.cs: 
5884         * gen-treedump.cs: 
5885         * expression.cs: 
5886         * driver.cs: 
5887         * decl.cs: 
5888         * codegen.cs: 
5889         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5890         the comparison is done with the Invariant culture.
5891
5892 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5893
5894         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5895         GetEnumerator method.
5896
5897         (ProbeCollectionType): Iterate starting at the most specific type
5898         upwards looking for a GetEnumerator
5899
5900         * expression.cs: Shift count can be up to 31 for int/uint and 63
5901         for long/ulong.
5902
5903 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5904
5905         * statement.cs (Block.LookupLabel): Also look for the label on the
5906         children blocks.  Use a hash table to keep track of visited
5907         nodes. 
5908
5909         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5910         we actually did transform the other operand, otherwise fall back
5911         to the common codepath that casts to long.
5912
5913         * cs-tokenizer.cs: Use the same code pattern as the int case.
5914         Maybe I should do the parsing myself, and avoid depending on the
5915         Parse routines to get this done.
5916
5917 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5918
5919         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5920         which fixes bug 51347.  This time test it.
5921
5922         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5923         attributes for example can not tell the difference between these.
5924         The difference was only a syntax feature of the language. 
5925
5926         * attribute.cs: Apply attributes to delegates.
5927
5928         * delegate.cs: Call the apply attributes method.
5929
5930 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5931
5932         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5933         comparing 0 vs Byte.MinValue, not the value
5934
5935         (ImplicitConversionRequired): When reporting a conversion error,
5936         use error 31 to print out the constant error instead of the
5937         simpler 29.
5938
5939         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5940         which fixes bug 51347.
5941
5942 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5943
5944         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5945         which fixes the -warnaserror command line option.
5946
5947 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5948
5949         * cfold.cs (DoNumericPromotions): During constant folding of
5950         additions on UIntConstant, special case intconstants with
5951         IntConstants like we do on the expression binary operator. 
5952
5953 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5954
5955         * convert.cs (ImplicitReferenceConversion): We were missing a case
5956         (System.Enum are not value types or class types, so we need to
5957         classify them separatedly).
5958
5959         * driver.cs: We do not support error 2007.
5960
5961 2003-11-12 Jackson Harper <jackson@ximian.com>
5962
5963         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5964         system directory. Also use the full file name so users can
5965         libraries names mscorlib-o-tron.dll in a non system dir.
5966         
5967 2004-01-04  David Sheldon <dave-mono@earth.li>
5968
5969         * expression.cs: Added matching ")" to error message for CS0077.
5970
5971 2003-12-19  Martin Baulig  <martin@ximian.com>
5972
5973         * typemanager.cs (TypeManager.IsEqualGenericType): New public
5974         static method; see documentation in the method.
5975         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
5976
5977         * convert.cs (Convert.ImplicitReferenceConversion,
5978         Convert.ImplicitReferenceConversionExists): Add support for
5979         generic type declarations; see gen-36.cs.
5980
5981 2003-12-19  Martin Baulig  <martin@ximian.com>
5982
5983         * pending.cs (Pending.InterfaceMethod): Use
5984         `Type.IsAssignableFrom()' instead of `=='.
5985
5986 2003-12-18  Martin Baulig  <martin@ximian.com>
5987
5988         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
5989         byref types first.
5990
5991         * convert.cs (Convert.ImplicitStandardConversionExists): Use
5992         `expr_type.Equals (target_type)' instead of `=='.
5993
5994 2003-12-08  Martin Baulig  <martin@ximian.com>
5995
5996         * generics.cs (Constraints.Types): Removed.
5997         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
5998         to Type's.
5999         (Constraints.ResolveTypes): New public method; resolves the
6000         TypeExpr's to Type's.
6001         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
6002         longer takes the constraints.
6003         (TypeParameter.DefineMethod): Likewise.
6004         (TypeParameter.DefineType): New public method.  Calls
6005         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
6006         the constraints.
6007
6008 2003-12-08  Martin Baulig  <martin@ximian.com>
6009
6010         * convert.cs (Convert.ImplicitConversionStandard): Use
6011         `expr_type.Equals (target_type)' instead of `=='.
6012
6013 2003-12-08  Martin Baulig  <martin@ximian.com>
6014
6015         * typemanager.cs (TypeManager.GetReferenceType): Call
6016         `Type.MakeByRefType ()'.
6017
6018 2003-12-08  Martin Baulig  <martin@ximian.com>
6019
6020         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
6021         just has some special meaning in some situations.  For instance,
6022         it is allowed to use `where' as the name of a variable etc.
6023
6024 2003-12-04  Martin Baulig  <martin@ximian.com>
6025
6026         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
6027         `Type.MakeArrayType()' for array types.
6028
6029 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
6030
6031         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
6032         debugging message.
6033
6034         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
6035         corlib to compile.
6036
6037 2003-11-16  Martin Baulig  <martin@ximian.com>
6038
6039         * codegen.cs (EmitContext.IsGeneric): Removed.
6040
6041         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
6042         ResolveGeneric() on the DeclSpace.
6043
6044 2003-11-16  Martin Baulig  <martin@ximian.com>
6045
6046         * generic.cs (TypeArguments.Resolve):
6047         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
6048         `ResolveType()' on it to get the Type.
6049
6050 2003-11-15  Martin Baulig  <martin@ximian.com>
6051
6052         * generic.cs (ConstructedType.GetInterfaces): Override this.
6053
6054 2003-11-14  Martin Baulig  <martin@ximian.com>
6055
6056         * interface.cs (Interface.DefineType): Define all type parameters
6057         before adding the interfaces we inherit.
6058
6059 2003-11-11  Martin Baulig  <martin@ximian.com>
6060
6061         * generic.cs (ConstructedType.ResolveType): Always call
6062         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
6063
6064 2003-11-10  Martin Baulig  <martin@ximian.com>
6065
6066         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
6067         (TypeManager.InitCoreTypes): Initialize them here, but instead of
6068         calling `ResolveType()' on them, directly assign their `Type'.
6069
6070 2003-11-08  Martin Baulig  <martin@ximian.com>
6071
6072         * generic.cs (ConstructedType): Override `IsClass' etc.
6073
6074 2003-11-08  Martin Baulig  <martin@ximian.com>
6075
6076         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
6077         return value and the `out parent' parameter.
6078         (TypeContainer.DefineType): Moved the CS0644 check into
6079         GetClassBases().  Don't pass the interface types to the
6080         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
6081         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
6082
6083         * ecore.cs (TypeExpr.IsAttribute): New property.
6084         (TypeExpr.GetInterfaces): New method.
6085
6086         * interface.cs (Interface.GetInterfaceTypeByName): Return a
6087         TypeExpr instead of a Type.
6088         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
6089         (Interface.DefineType): Don't pass the interface types to the
6090         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
6091         them later and then call `TypeBulider.AddInterfaceImplementation()'.
6092
6093         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
6094         instead of a `Type[]'.
6095         (TypeManager.RegisterBuilder): Likewise.
6096         (TypeManager.AddUserInterface): Likewise.
6097         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
6098         `Type[]' and also return a `TypeExpr[]'.
6099         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
6100
6101 2003-11-08  Martin Baulig  <martin@ximian.com>
6102
6103         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
6104         Expression.     
6105
6106 2003-11-08  Martin Baulig  <martin@ximian.com>
6107
6108         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
6109         TypeManager.ResolveExpressionTypes().
6110
6111         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
6112         instead of an Expression.
6113         (TypeExpr): This is now an abstract base class for `TypeExpression'.
6114         (TypeExpression): New public class; formerly known as `TypeExpr'.
6115
6116         * expression.cs (ComposedCast): Derive from TypeExpr.
6117
6118         * typemanager.cs (TypeManager.system_*_expr): These are now
6119         TypExpr's instead of Expression's.
6120         (TypeManager.ResolveExpressionTypes): New public static function;
6121         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
6122         of them.        
6123
6124 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
6125
6126         * expression.cs (New.DoResolve): Do not dereference value that
6127         might be a null return.
6128
6129         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
6130         sure that the constant value has the right type.  Fixes an
6131         unreported bug, similar to 50425.
6132
6133         * const.cs (Const.LookupConstantValue): Call
6134         ImplicitStandardConversionExists before doing a conversion to
6135         avoid havng the TypeManager.ChangeType do conversions.
6136
6137         Reduced the number of casts used
6138
6139         (Const.ChangeType): New routine to enable reuse of the constant
6140         type changing code from statement.
6141
6142         * typemanager.cs (ChangeType): Move common initialization to
6143         static global variables.
6144
6145         Fixes #50425.
6146
6147         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
6148         every value type to go through, even if it was void.  Fix that. 
6149
6150         * cs-tokenizer.cs: Use is_identifier_start_character on the start
6151         character of the define, and the is_identifier_part_character for
6152         the rest of the string.
6153
6154 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
6155
6156         * expression.cs (UnaryMutator.EmitCode): When I updated
6157         LocalVariableReference.DoResolve, I overdid it, and dropped an
6158         optimization done on local variable references.
6159
6160 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
6161
6162         * ecore.cs: Convert the return from Ldlen into an int.
6163
6164 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
6165
6166         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
6167         the accessibility, this is a special case for toplevel non-public
6168         classes (internal for instance).
6169
6170 2003-10-20  Nick Drochak <ndrochak@gol.com>
6171
6172         * ecore.cs: Fix typo and build.  Needed another right paren.
6173
6174 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
6175
6176         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
6177         `internal' case regular and protected, but not allowing protected
6178         to be evaluated later.  Bug 49840
6179
6180 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
6181
6182         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
6183         to kb.Nlast, and not the kb.nFirst to isolate the switch
6184         statement.
6185
6186         Extract the underlying type, so enumerations of long/ulong are
6187         treated like long/ulong.
6188
6189 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
6190
6191         * expression.cs (New): Overload the meaning of RequestedType to
6192         track the possible creation of the NewDelegate type, since
6193         DoResolve is invoked more than once for new constructors on field
6194         initialization.
6195
6196         See bugs: #48800 and #37014
6197
6198         * cs-parser.jay (declare_local_constants): Take an arraylist
6199         instead of a single constant.
6200
6201         (local_constant_declaration): It should take a
6202         constant_declarators, not a constant_declarator.  Fixes 49487
6203
6204         * convert.cs: Fix error report.
6205
6206 2003-10-13 Jackson Harper <jackson@ximian.com>
6207
6208         * typemanager.cs (TypeToCoreType): Add float and double this fixes
6209         bug #49611
6210         
6211 2003-11-03  Martin Baulig  <martin@ximian.com>
6212
6213         * expression.cs (ArrayAccess.GetStoreOpcode): Added
6214         `out bool has_type_arg'; if set, we need to pass the type to
6215         ig.Emit().
6216         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
6217         Stelem_Any/Ldelem_Any for generic parameters.   
6218
6219 2003-11-02  Martin Baulig  <martin@ximian.com>
6220
6221         * expression.cs (Invocation.EmitCall): Use
6222         `TypeManager.IsValueType()' to check whether it's a value type.
6223         Don't set `struct_call' when calling a method on a type parameter.
6224
6225 2003-11-02  Martin Baulig  <martin@ximian.com>
6226
6227         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
6228         and removed the TypeBuilder argument.
6229
6230         * typemanager.cs (TypeManager.IsValueType): Return
6231         `t.IsGenericParameter || t.IsValueType'.
6232
6233 2003-10-25  Martin Baulig  <martin@ximian.com>
6234
6235         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
6236         call ConstructedType.Resolve() on it.
6237
6238         * generic.cs (ConstructedType.Resolve): Set `type' on success.
6239
6240 2003-10-25  Martin Baulig  <martin@ximian.com>
6241
6242         * class.cs (TypeContainer.GetClassBases): Changed
6243         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
6244         CS8214 reporting here.
6245         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
6246         instead of a `Type' for our parent.  In case of a recursive
6247         declaration (see tests/gen-23.cs for an example), our parent is a
6248         ConstructedType and it doesn't have its type set.  So, first
6249         create our own TypeBuilder, then call constructed.Resolve() to get
6250         the parent's type and finally TypeBuilder.SetParent() it.
6251
6252         * ecore.cs (TypeExpr.Name): New public virtual property.
6253
6254         * generic.cs
6255         (ConstructedType): We're now a TypeExpr and not just an Expression.
6256         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
6257         arguments here; this is done later.
6258         (ConstructedType.Resolve): New public method to resolve the type
6259         arguments and bind them.
6260
6261 2003-10-21  Martin Baulig  <martin@ximian.com>
6262
6263         * convert.cs: Use `TypeManager.IsValueType' instead of
6264         'type.IsValueType' everywhere.
6265
6266         * typemanager.cs (TypeManager.IsValueType): Return true for type
6267         parameters.  The reason for this is that we need to box a type
6268         parameter when converting it to a reference type.
6269
6270         * cs-parser.jay: Added support for default value expressions.
6271
6272         * generics.cs (DefaultValueExpression): New public class.       
6273
6274 2003-10-17  Martin Baulig  <martin@ximian.com>
6275
6276         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
6277         TypeContainer so we can also use this for Interfaces.
6278         (TypeParameter.Resolve): Likewise.
6279
6280         * interface.cs (Interface.DefineType): Added support for generic
6281         interfaces.
6282
6283         * cs-parser.jay: Added support for generic structs and interfaces.
6284
6285 2003-10-17  Martin Baulig  <martin@ximian.com>
6286
6287         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
6288         call generic methods :-)
6289
6290 2003-10-16  Martin Baulig  <martin@ximian.com>
6291
6292         * cs-parser.jay (namespace_or_type_name): Only create a
6293         GenericMemberAccess if we actually have type arguments.
6294
6295 2003-10-13  Martin Baulig  <martin@ximian.com>
6296
6297         * class.cs (Method.Define): If we're a generic method, call
6298         TypeBuilder.DefineGenericMethod () before resolving
6299         the parameters.
6300         (MethodData): Added .ctor which takes an additional MethodBuilder
6301         argument; this is used for generic methods.
6302         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
6303         we already have a MethodBuilder.
6304
6305 2003-10-10  Martin Baulig  <martin@ximian.com>
6306
6307         * class.cs (Method): Added .ctor which takes a `GenericMethod'
6308         instead of a `DeclSpace'.  This is used for generic methods.
6309
6310         * cs-parser.jay (method_header): Added support for generic
6311         methods; create a `GenericMethod' instance and pass it to the
6312         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
6313         parameters and locals.
6314
6315         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
6316         since we already have the location.  Check whether we're a generic
6317         type declaration or a generic method and create the correct type
6318         parameter.
6319
6320         * generic.cs (TypeParameter.DefineMethod): New public method.
6321         (GenericMethod): New public class; derives from DeclSpace and is
6322         used for generic methods.       
6323
6324 2003-10-09  Martin Baulig  <martin@ximian.com>
6325
6326         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
6327         to the .ctor.
6328         (MethodCore.DoDefineParameters): Removed the TypeContainer
6329         argument; use the DeclSpace which was passed to the .ctor instead.
6330         (MethodCore.CheckParameter): Take a DeclSpace instead of a
6331         TypeContainer; we only need a DeclSpace here.
6332
6333 2003-10-09  Martin Baulig  <martin@ximian.com>
6334
6335         * class.cs (MethodData): Added additional `DeclSpace ds' argument
6336         to the .ctor.
6337         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
6338         EmitContext's .ctor.    
6339
6340 2003-10-09  Martin Baulig  <martin@ximian.com>
6341
6342         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
6343         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
6344         AsAccessible(), moved them as well.
6345
6346         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
6347
6348 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
6349
6350         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
6351         generation for >=, as spotted by Paolo, bug 48679.  
6352         Patch from David Waite.
6353
6354         * cs-tokenizer.cs: Add handling for #pragma.
6355
6356         * cs-parser.jay: Allow for both yield and yield return in the
6357         syntax.  The anti-cobolization of C# fight will go on!
6358
6359         * class.cs (TypeBuilder.DefineType): Catch error condition here
6360         (Parent.DefineType erroring out and returning null).
6361
6362         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6363         coping with enumerations variables, we were mistakenly processing
6364         them as a regular value type instead of built-in types.  Fixes the
6365         bug #48063
6366
6367         * typemanager.cs (IsBuiltinOrEnum): New method.
6368
6369 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
6370
6371         * cs-parser.jay: Upgrade: yield now needs the return clause.
6372
6373 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6374
6375         * cs-parser.jay : Renamed yyName to yyNames related to jay.
6376
6377 2003-09-29  Martin Baulig  <martin@ximian.com>
6378
6379         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
6380         inflated generic methods.
6381
6382         * generics.cs (ConstructedType): Distinguish between open and
6383         closed constructed types; correctly resolve the arguments.
6384
6385 2003-09-22  Martin Baulig  <martin@ximian.com>
6386
6387         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
6388         all type arguments meet their constraints.
6389
6390 2003-09-19  Martin Baulig  <martin@ximian.com>
6391
6392         * decl.cs (MemberCache.SetupCacheForInterface): Take a
6393         `MemberCache parent' argument.  Normally, an interface doesn't
6394         have a parent type except System.Object, but we use this in gmcs
6395         for generic type parameters.
6396
6397 2003-09-18  Martin Baulig  <martin@ximian.com>
6398
6399         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
6400         on `type.IsInterface'; don't check whether the type has a parent
6401         to determine whether it's an interface.
6402
6403 2003-09-17  Martin Baulig  <martin@ximian.com>
6404
6405         * generic.cs (ConstructedType.ToString): Always use `name' as the
6406         type name.
6407
6408 2003-09-15  Martin Baulig  <martin@ximian.com>
6409
6410         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
6411
6412         * generic.cs (Constraints.Resolve): New public method; this is
6413         called to resolve the constraint types and to check whether all
6414         the constraints are correct.
6415         (Constraints.Types): New public property.
6416         (TypeParameter.Resolve): New public method; resolves all the
6417         type's constraints.
6418
6419         * class.cs (TypeContainer.DefineType): Call
6420         TypeParameter.Resolve() before actually defining the type.
6421
6422 2003-09-15  Martin Baulig  <martin@ximian.com>
6423
6424         * class.cs (TypeContainer.DefineType): Added an error flag to
6425         avoid reporting duplicate CS0146's ("class definition is
6426         circular.").
6427
6428         * driver.cs (Driver.MainDriver): Abort if
6429         RootContext.ResolveTree() reported any errors.
6430
6431 2003-09-07  Martin Baulig  <martin@ximian.com>
6432
6433         * report.cs (Error, Warning): Added overloaded versions which take
6434         a `params object[] args' and call String.Format().
6435
6436 2003-09-07  Martin Baulig  <martin@ximian.com>
6437
6438         * decl.cs (DeclSpace..ctor): Don't call
6439         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
6440         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
6441         (DeclSpace.RecordDecl): New method.
6442
6443         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
6444
6445 2003-09-02  Ravi Pratap  <ravi@ximian.com>
6446
6447         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
6448         value attributes to be applied to ParameterBuilders.
6449
6450         * class.cs (MethodCore.LabelParameters): Make static and more
6451         generic so that it can be used from other places - like interface
6452         methods, for instance.
6453
6454         * interface.cs (Interface.Emit): Call LabelParameters before
6455         emitting attributes on the InterfaceMethod.
6456
6457 2003-09-07  Martin Baulig  <martin@ximian.com>
6458
6459         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
6460         if the number of type parameters doesn't match.
6461
6462 2003-09-04  Martin Baulig  <martin@ximian.com>
6463
6464         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
6465         for arrays of generic type params (ie. `!0[]').
6466
6467 2003-09-04  Martin Baulig  <martin@ximian.com>
6468
6469         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
6470         for the moment.
6471
6472 2003-09-04  Martin Baulig  <martin@ximian.com>
6473
6474         * decl.cs (DeclSpace.LookupGeneric): New method.
6475         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
6476         moment.
6477
6478         * generic.cs (TypeParameterExpr): Take a TypeParameter as
6479         argument, not just a string.
6480         (TypeParameter.Define): New public method; this is called to
6481         actually define the generic parameter; after this, you can use the
6482         new `Type' property to get the type.
6483
6484 2003-09-04  Martin Baulig  <martin@ximian.com>
6485
6486         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
6487         is now an ArrayList; initialize the result of the `TypeParameters'
6488         property here.
6489         (DeclSpace.GetGenericData): Removed.
6490         (DeclSpace.LookupGeneric): Temporarily removed; we need to
6491         implement this in a different way.
6492         (DeclSpace.GetTypeParameters): Removed; there's now a
6493         `TypeParameters' property.
6494         (DeclSpace.TypeParameters): New public property.
6495
6496         * generic.cs (Constraints): Make this class public.
6497         (TypeParameter): New public class.
6498
6499 2003-09-04  Martin Baulig  <martin@ximian.com>
6500
6501         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
6502         generic parameters.
6503
6504         * class.cs (TypeContainer.DefineType): Call
6505         TypeBuilder.DefineGenericParameter () on all generic parameters if
6506         this is a generic type.
6507
6508 2003-08-28  Martin Baulig  <martin@ximian.com>
6509
6510         * sample-stack.il: Compile this with ilasm: "ilasm /dll
6511         sample-stack.il".
6512
6513         * sample-hello.cs: Compile this with gmcs: "gmcs
6514         /r:sample-stack.dll sample-hello.cs".
6515
6516 2003-08-28  Martin Baulig  <martin@ximian.com>
6517
6518         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
6519         the parameters to the generic type.
6520
6521 2003-08-28  Martin Baulig  <martin@ximian.com>
6522
6523         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
6524
6525 2003-08-28  Martin Baulig  <martin@ximian.com>
6526
6527         * cs-parser.jay (opt_type_argument_list): Use
6528         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
6529         (primary_expression): Replace `qualified_identifier' with `type_name'.
6530         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
6531
6532         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
6533         parser to check whether it is syntactically a type parameter list;
6534         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
6535         this case.
6536
6537 2003-08-26  Martin Baulig  <martin@ximian.com>
6538
6539         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
6540         resolving aliases; fixes #47927.
6541
6542 2003-08-26  Martin Baulig  <martin@ximian.com>
6543
6544         * statement.cs (Using.DoResolve): This is internally emitting a
6545         try/finally clause, so we need to set ec.NeedExplicitReturn if we
6546         do not always return.  Fixes #47681.
6547
6548 2003-08-26  Martin Baulig  <martin@ximian.com>
6549
6550         * decl.cs (MemberCore): Moved WarningNotHiding(),
6551         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
6552         into MemberBase.
6553         (AdditionResult): Make this nested in DeclSpace.
6554         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
6555         argument; call NamespaceEntry.Define() unless we're nested in a
6556         class or struct.
6557
6558         * namespace.cs (Namespace.DefineName): New public function.  This
6559         is called from DeclSpace's .ctor to add 
6560         (Namespace.Lookup): Include DeclSpaces in the lookup.
6561
6562         * class.cs (Operator): Derive from MemberBase, not MemberCore.
6563
6564         * const.cs (Const): Derive from MemberBase, not MemberCore.     
6565
6566 2003-08-25  Martin Baulig  <martin@ximian.com>
6567
6568         * convert.cs (Convert.ExplicitReferenceConversion): When
6569         converting from an interface type to a class, unbox if the target
6570         type is a struct type.  Fixes #47822.
6571
6572 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6573
6574         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
6575         #47854.
6576
6577 2003-08-22  Martin Baulig  <martin@ximian.com>
6578
6579         * class.cs (TypeManager.DefineType): When defining a nested type,
6580         call DefineType() on our parent; fixes #47801.
6581
6582 2003-08-22  Martin Baulig  <martin@ximian.com>
6583
6584         * class.cs (MethodData.Define): While checking if a method is an
6585         interface implementation, improve the test a bit more to fix #47654.
6586
6587 2003-08-22  Martin Baulig  <martin@ximian.com>
6588
6589         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
6590         correctly; fixes #47722.
6591
6592 2003-08-22  Martin Baulig  <martin@ximian.com>
6593
6594         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
6595         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
6596
6597         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
6598
6599 2003-08-22  Martin Baulig  <martin@ximian.com>
6600
6601         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
6602         can only be assigned in static constructors.  Fixes #47161.
6603
6604 2003-08-22  Martin Baulig  <martin@ximian.com>
6605
6606         Rewrote and improved the flow analysis code.
6607
6608         * flowbranching.cs (FlowBranching): Make this class abstract.
6609         (FlowBranching.CreateBranching): New static function to create a
6610         new flow branching.
6611         (FlowBranchingBlock, FlowBranchingException): New classes.
6612         (FlowBranching.UsageVector.Type): New public readonly field.
6613         (FlowBranching.UsageVector.Breaks): Removed the setter.
6614         (FlowBranching.UsageVector.Returns): Removed the setter.
6615         (FlowBranching.UsageVector): Added Break(), Return(),
6616         NeverReachable() and Throw() methods to modify the reachability.
6617         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
6618         done by FlowBranching.Merge().
6619         (FlowBranching.UsageVector.MergeChild): New method; merges the
6620         merge result into the current vector.
6621         (FlowBranching.Merge): New abstract method to merge a branching.
6622
6623 2003-08-12  Martin Baulig  <martin@ximian.com>
6624
6625         * expression.cs (Indirection.CacheTemporaries): Create the
6626         LocalTemporary with the pointer type, not its element type.
6627
6628 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
6629
6630         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
6631         token was a keyword or not.
6632
6633         Add `error' options where an IDENTIFIER was expected;  Provide
6634         CheckToken and CheckIdentifierToken convenience error reporting
6635         functions. 
6636
6637         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
6638
6639         * decl.cs: Rename `NamespaceEntry Namespace' public field into
6640         NameSpaceEntry NameSpaceEntry.
6641
6642         (LookupInterfaceOrClass): Avoid creating a full qualified name
6643         from namespace and name: avoid doing lookups when we know the
6644         namespace is non-existant.   Use new Tree.LookupByNamespace which
6645         looks up DeclSpaces based on their namespace, name pair.
6646
6647         * driver.cs: Provide a new `parser verbose' to display the
6648         exception thrown during parsing.  This is turned off by default
6649         now, so the output of a failure from mcs is more graceful.
6650
6651         * namespace.cs: Track all the namespaces defined in a hashtable
6652         for quick lookup.
6653
6654         (IsNamespace): New method
6655
6656 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
6657
6658         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
6659         we know that we need to concatenate (full typename can never be
6660         null). 
6661
6662         * class.cs: ditto.
6663
6664         * statement.cs: Use a bitfield;  Do not initialize to null things
6665         which are done by the constructor by default.
6666
6667         * cs-parser.jay: bug fix, parameter was 4, not 3.
6668
6669         * expression.cs: Just use the property;
6670
6671         * statement.cs: No need for GetVariableInfo method.
6672
6673 2003-08-08  Martin Baulig  <martin@ximian.com>
6674
6675         * flowanalysis.cs (FlowReturns): This is now nested in the
6676         `FlowBranching' class.
6677         (MyBitVector): Moved this here from statement.cs.
6678         (FlowBranching.SiblingType): New enum type.
6679         (FlowBranching.CreateSibling): Added `SiblingType' argument.
6680
6681 2003-08-07  Martin Baulig  <martin@ximian.com>
6682
6683         * flowanalysis.cs (FlowBranchingType): This is now nested in the
6684         `FlowBranching' class and called `BranchingType'.
6685
6686 2003-08-07  Martin Baulig  <martin@ximian.com>
6687
6688         * flowanalysis.cs: Moved all the control flow analysis code into
6689         its own file.
6690
6691 2003-08-07  Martin Baulig  <martin@ximian.com>
6692
6693         * assign.cs (Assign.DoResolve): `target' must either be an
6694         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
6695         #37319.
6696
6697 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
6698
6699         * expression.cs (BinaryMethod): This kind of expression is created by the
6700         Binary class if it determines that the operator has to be handled
6701         by a method.
6702
6703         (BinaryDelegate): This kind of expression is created if we are
6704         dealing with a + or - operator on delegates.
6705
6706         (Binary): remove method, argumetns, and DelegateOperator: when
6707         dealing with methods, 
6708
6709         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
6710
6711         * statement.cs (Block): use bitfields for the three extra booleans
6712         we had in use.   Remove unused topblock parameter.
6713
6714         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
6715
6716         * assign.cs: Drop extra unneeded tests.
6717
6718 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
6719
6720         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
6721
6722         * statement.cs (Foreach): Use VariableStorage instead of
6723         LocalBuilders.   
6724
6725         * codegen.cs (VariableStorage): New class used by clients that
6726         require a variable stored: locals or fields for variables that
6727         need to live across yield.
6728
6729         Maybe provide a convenience api for EmitThis+EmitLoad?
6730
6731         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
6732         these bad boys.
6733
6734 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
6735
6736         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6737         RemapParameterLValue): New methods that are used to turn a
6738         precomputed FieldInfo into an expression like this:
6739
6740                 instance.FieldInfo
6741
6742         The idea is to use this instead of making LocalVariableReference
6743         have more than one meaning.
6744
6745         * cs-parser.jay: Add error production to BASE.
6746
6747         * ecore.cs: Deal with TypeManager.GetField returning null, which
6748         is now a valid return value.
6749
6750         (FieldExprNoAddress): New expression for Fields whose address can
6751         not be taken.
6752
6753         * expression.cs (LocalVariableReference): During the resolve
6754         phases, create new expressions if we are in a remapping context.
6755         Remove code that dealt with remapping here.
6756
6757         (ParameterReference): same.
6758
6759         (ProxyInstance): New expression, like the `This' expression, but
6760         it is born fully resolved.  We know what we are doing, so remove
6761         the errors that are targeted to user-provided uses of `this'.
6762
6763         * statement.cs (Foreach): our variable is now stored as an
6764         Expression;  During resolution, follow the protocol, dont just
6765         assume it will return this.
6766
6767 2003-08-06  Martin Baulig  <martin@ximian.com>
6768
6769         * support.cs (SeekableStreamReader.cs): New public class.
6770
6771         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6772         SeekableStreamReader instead of the normal StreamReader.
6773
6774 2003-08-04  Martin Baulig  <martin@ximian.com>
6775
6776         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6777         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6778         deambiguate casts and delegate invocations.
6779         (parenthesized_expression): Use the new tokens to ensure this is
6780         not a cast of method invocation.
6781
6782         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6783         when reading a `)' and Deambiguate_CloseParens () was previously
6784         called.
6785
6786         * expression.cs (ParenthesizedExpression): New class.  This is
6787         just used for the CS0075 test.
6788         (Binary.DoResolve): Check for CS0075.   
6789
6790 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6791
6792         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6793         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6794         reference comparison.
6795
6796         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6797         examine the ReturnType for equality - this is necessary in the
6798         cases of implicit and explicit operators whose signature also
6799         includes the return type.
6800
6801 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6802
6803         * namespace.cs: Cache the result of the namespace computation,
6804         instead of computing it every time.
6805
6806 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6807
6808         * decl.cs: Use a global arraylist that we reuse over invocations
6809         to avoid excesive memory consumption.  Reduces memory usage on an
6810         mcs compile by one meg (45 average).
6811
6812         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6813         private, work around that.
6814
6815 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6816
6817         * literal.cs (IntLiteral): Define Zero and One static literals. 
6818
6819         * cs-parser.jay (integer_literal): use static literals to reduce
6820         memory usage for the most used literals (0, 1 and -1).  211kb
6821         reduced in memory usage.
6822
6823         Replace all calls to `new ArrayList' with `new
6824         ArrayList(4)' which is a good average number for most allocations,
6825         and also requires only 16 bytes of memory for its buffer by
6826         default. 
6827
6828         This reduced MCS memory usage in seven megabytes for the RSS after
6829         bootstrapping.
6830
6831 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6832
6833         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6834         handle params methods the correct way by forming only one
6835         applicable set with params and normal methods in them. Earlier we
6836         were looking at params methods only if we found no normal methods
6837         which was not the correct thing to do.
6838
6839         (Invocation.BetterFunction): Take separate arguments indicating
6840         when candidate and the best method are params methods in their
6841         expanded form.
6842
6843         This fixes bugs #43367 and #46199.
6844
6845         * attribute.cs: Documentation updates.
6846
6847         (CheckAttribute): Rename to CheckAttributeTarget.
6848         (GetValidPlaces): Rename to GetValidTargets.
6849
6850         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6851         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6852
6853         Fixes bug #44468.
6854
6855 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
6856
6857         * codegen.cs: Compute IsGeneric correctly.
6858
6859         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
6860         resolution. 
6861
6862         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
6863         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
6864         regressions, and I was chasing more bugs than I required.
6865
6866         * interface.cs: Use expressions for base type names (like classes
6867         and structs have been doing for a while now), and resolve that.
6868         This patch should probably go into head as well.
6869
6870         This makes it one less user of FindType.
6871
6872 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6873
6874         This compiler can not self host currently.  Need to fix that.
6875         
6876         * Makefile: compile to `gmcs.exe'
6877
6878         * driver.cs: Turn on v2 by default on gmcs.
6879
6880         * generic.cs (ConstructedType): Does no longer take a container
6881         type argument;  That will be taken care of later.
6882
6883         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
6884         Use SimpleName to resolve for now, so we can continue the work on
6885         the parser, until we get Type.GetType that understands generics.
6886
6887         (ConstructedType.ToString): Implement
6888
6889         (TypeArguments.Resolve): Resolve the child expressions as types. 
6890         
6891         * cs-parser.jay: Rename interface_constraints to
6892         type_parameter_constraints
6893
6894         (namespace_or_type_name): Only use constructed types for the basic
6895         construction, we will deal with identifier<...> later.
6896
6897         (type/type_name): No longer call DecomposeQI, as
6898         namespace_or_type_name is always decoded now.
6899         
6900 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6901
6902         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6903         closely: we eliminate methods in base types when we have an
6904         applicable method in a top-level type.
6905
6906         Please see section 14.5.5.1 for an exact description of what goes
6907         on. 
6908
6909         This fixes bug #45127 and a host of other related to corlib compilation.
6910
6911         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6912         array is the method corresponding to the top-level type (this is
6913         because of the changes made to icall.c) so we change this
6914         accordingly.
6915
6916         (MethodGroupExpr.Name): This too.
6917
6918         * typemanager.cs (GetElementType): New method which does the right
6919         thing when compiling corlib. 
6920
6921         * everywhere: Make use of the above in the relevant places.
6922
6923 2003-07-22  Martin Baulig  <martin@ximian.com>
6924
6925         * cs-parser.jay (invocation_expression): Moved
6926         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6927         `cast_expression', but create a InvocationOrCast which later
6928         resolves to either an Invocation or a Cast.
6929
6930         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6931         method; call this before EmitStatement() to make sure that this
6932         expression can be used as a statement.
6933
6934         * expression.cs (InvocationOrCast): New class; resolves to either
6935         an Invocation or a Cast.
6936
6937         * statement.cs (StatementExpression): Call ResolveStatement() on
6938         the ExpressionStatement before emitting it.
6939
6940 2003-07-21  Martin Baulig  <martin@ximian.com>
6941
6942         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6943         `ref' and `out' attributes match; fixes #46220.
6944         (MemberAccess.ResolveMemberAccess): You can't reference a type
6945         through an expression; fixes #33180.
6946         (Indexers.GetIndexersForType): Don't return the indexers from
6947         interfaces the class implements; fixes #46502.
6948
6949 2003-07-21  Martin Baulig  <martin@ximian.com>
6950
6951         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6952         CS0661 checks; fixes bug #30442.
6953
6954 2003-07-21  Martin Baulig  <martin@ximian.com>
6955
6956         * decl.cs (AdditionResult): Added `Error'.
6957
6958         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6959
6960         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
6961         cs0031.cs actually work.
6962
6963  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6964  
6965         * cs-parser.jay (namespace_name): do not use
6966         namespace_or_type_name, use qualified_identifier, because
6967         namespace_or_type_name will soon return a composed expression
6968         instead of a string.
6969  
6970         (namespace_or_type_name): Instead of returning a string, now this
6971         production returns an expression.
6972  
6973         * codegen.cs (EmitContext): Setup IsGeneric property based on
6974         whether our DeclSpace is generic, our the method is generic.
6975  
6976         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
6977         the method is generic.
6978  
6979         * cs-parser.jay (type_arguments, opt_type_argument_list,
6980         type_parameters, type_parameter_list, opt_type_parameter_list,
6981         type_parameter,, opt_type_parameter_constraints_clauses,
6982         type_parameter_constraints_clauses,
6983         type_parameter_constraint_clause, type_parameter_constraint,
6984         interface_constraints): Add new production
6985  
6986         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
6987         DeclSpace is generic or not.
6988  
6989         (DeclSpace.SetParameterInfo): New routine, used to set the
6990         parameter info for a type.
6991  
6992         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
6993         returns a GenericTypeExpr
6994  
6995         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
6996         generic, lookup the generic argument.
6997  
6998         * attribute.cs: Do not allow TypeParameterExpressions in
6999         Attributes.
7000  
7001         * class.cs: Do not allow the Main method to be defined in a
7002         Generic container.
7003  
7004         * expression.cs (SizeOf): Do not allow generic types to be used as
7005         arguments to sizeof.
7006  
7007         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
7008         it: whether a type is generic or not.  Only works for types we are
7009         currently building for now.
7010         
7011 2003-07-20  Martin Baulig  <martin@ximian.com>
7012
7013         * namespace.cs: Fixed that bug which caused a crash when compiling
7014         the debugger's GUI.
7015
7016 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7017
7018         * typemanager.cs (LookupTypeReflection): Never expose types which
7019         are NotPublic, NestedPrivate, NestedAssembly, or
7020         NestedFamANDAssem.  We used to return these, and later do a check
7021         that would report a meaningful error, but the problem is that we
7022         would not get the real match, if there was a name override.
7023
7024 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
7025
7026         * namespace.cs (Namespace, Name): Do not compute the namespace
7027         name dynamically, compute it in the constructor.  This reduced
7028         memory usage by 1697 KB.
7029
7030         * driver.cs: Use --pause to pause at the end.
7031
7032 2003-07-17  Peter Williams  <peter@newton.cx>
7033
7034         * Makefile: Change the name of the test target so that it doesn't
7035         conflict with the recursive test target.
7036
7037 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
7038
7039         * expression.cs (LocalVariableReference.Emit, EmitAssign,
7040         AddressOf): Do not use EmitThis, that was wrong, use the actual
7041         this pointer.
7042
7043 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
7044
7045         * class.cs (MethodData.Define): While checking if a method is an
7046         interface implementation, improve the test: If we are not public
7047         (use new test here: use the computed MethodAttributes directly,
7048         instead of the parsed modifier flags) check if the `implementing'
7049         method comes from an interface or not.
7050
7051         * pending.cs (VerifyPendingMethods): Slightly better error
7052         message.
7053
7054         * makefile: add test target that does the mcs bootstrap.
7055
7056 2003-07-16  Ravi Pratap  <ravi@ximian.com>
7057
7058         * interface.cs (Define): Do nothing here since there are no
7059         members to populate etc. Move the attribute emission out of here
7060         since this was just totally the wrong place to put it. Attribute
7061         application happens during the 'Emit' phase, not in the 'Define'
7062         phase.
7063
7064         (Emit): Add this method and move the attribute emission here
7065
7066         * rootcontext.cs (EmitCode): Call the Emit method on interface
7067         types too.
7068
7069 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7070
7071         * expression.cs (OverloadResolve): Report error only if Location
7072         is not 'Null' which means that there was a probe going on.
7073
7074 2003-07-14  Martin Baulig  <martin@ximian.com>
7075
7076         * expression.cs (ConditionalLogicalOperator): New public class to
7077         implement user defined conditional logical operators.
7078         This is section 14.11.2 in the spec and bug #40505.
7079
7080 2003-07-14  Martin Baulig  <martin@ximian.com>
7081
7082         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
7083
7084 2003-07-14  Martin Baulig  <martin@ximian.com>
7085
7086         * codegen.cs (EmitContext.InFixedInitializer): New public field.
7087
7088         * ecore.cs (IVariable.VerifyFixed): New interface method.
7089
7090         * expression.cs (Unary.ResolveOperator): When resolving the `&'
7091         operator, check whether the variable is actually fixed.  Fixes bug
7092         #36055.  Set a variable definitely assigned when taking its
7093         address as required by the spec.
7094
7095         * statement.cs (LocalInfo.IsFixed): New field.
7096         (LocalInfo.MakePinned): Set `IsFixed' to true.
7097
7098 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7099
7100         * attribute.cs (Attribute.Resolve): While doing a Member lookup
7101         for .ctors, ensure that we only ask for members declared in the
7102         attribute type (BindingFlags.DeclaredOnly).
7103
7104         Fixes bug #43632.
7105
7106         * expression.cs (Error_WrongNumArguments): Report error 1501
7107         correctly the way CSC does.
7108
7109 2003-07-13  Martin Baulig  <martin@ximian.com>
7110
7111         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
7112         lookup on the fully qualified name, to make things like "X.X" work
7113         where "X.X" is a fully qualified type name, but we also have a
7114         namespace "X" in the using list.  Fixes #41975.
7115
7116 2003-07-13  Martin Baulig  <martin@ximian.com>
7117
7118         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
7119         function. If we're a CompoundAssign, we need to create an embedded
7120         CompoundAssign, not an embedded Assign.
7121         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
7122         Fixes #45854.
7123
7124 2003-07-13  Martin Baulig  <martin@ximian.com>
7125
7126         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
7127         work to fix bug #46088.
7128
7129 2003-07-13  Ravi Pratap <ravi@ximian.com>
7130
7131         * class.cs (Operator.Emit): Do not emit attributes here - it is
7132         taken care of by the Method class that we delegate too. This takes
7133         care of bug #45876.
7134
7135 2003-07-10  Martin Baulig  <martin@ximian.com>
7136
7137         * expression.cs (TypeOfVoid): New class.
7138         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
7139
7140 2003-07-10  Martin Baulig  <martin@ximian.com>
7141
7142         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
7143         bug #35957.
7144
7145 2003-07-10  Martin Baulig  <martin@ximian.com>
7146
7147         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
7148         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
7149
7150         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
7151
7152         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
7153
7154 2003-07-10  Martin Baulig  <martin@ximian.com>
7155
7156         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
7157         of decimal.  Fixes #42850.
7158
7159         NOTE: I also fixed the created byte blob, but this doesn't work on
7160         the MS runtime and csc never produces any byte blobs for decimal
7161         arrays.
7162
7163 2003-07-10  Martin Baulig  <martin@ximian.com>
7164
7165         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
7166         structs; fixes #32068.
7167         (Block.AddChildVariableNames): Fixed #44302.
7168
7169 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7170
7171         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
7172
7173 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7174
7175         * attribute.cs: And this test is onger needed.
7176
7177 2003-07-08  Martin Baulig  <martin@ximian.com>
7178
7179         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
7180         inaccessible types.  Fixes #36313.
7181
7182         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
7183
7184         * namespace.cs (NamespaceEntry): Create implicit entries for all
7185         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
7186         implicit entries for N1.N2 and N1.
7187
7188 2003-07-08  Martin Baulig  <martin@ximian.com>
7189
7190         Rewrote the handling of namespaces to fix a lot of the issues
7191         wrt. `using' aliases etc.
7192
7193         * namespace.cs (Namespace): Splitted this class into a
7194         per-assembly `Namespace' and a per-file `NamespaceEntry'.
7195
7196         * typemanager.cs (TypeManager.IsNamespace): Removed.
7197         (TypeManager.ComputeNamespaces): Only compute namespaces from
7198         loaded assemblies here, not the namespaces from the assembly we're
7199         currently compiling.
7200
7201 2003-07-08  Martin Baulig  <martin@ximian.com>
7202
7203         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
7204
7205 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7206
7207         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
7208         already fixed it.  
7209
7210         I thought about the memory savings here, but LookupTypeReflection
7211         is used under already very constrained scenarios.  Compiling
7212         corlib or mcs only exposes one hit, so it would not really reduce
7213         any memory consumption.
7214
7215 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7216
7217         * typemanager.cs: fixes bug #45889 by only adding public types from
7218         other assemblies to the list of known types.
7219
7220 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7221
7222         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
7223         on the type we resolved.
7224
7225 2003-07-05  Martin Baulig  <martin@ximian.com>
7226
7227         * pending.cs (PendingImplementation.ParentImplements): Don't
7228         create the proxy if the parent is abstract.
7229
7230         * class.cs (TypeContainer.DefineIndexers): Process explicit
7231         interface implementations first.  Fixes #37714.
7232
7233 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
7234
7235         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
7236         defined recursively;  but since we modify the input parameters
7237         (left is set to `this' temporarily), we reset this value if the
7238         left_is_explicit is false, which gives the original semantics to
7239         the code.  
7240
7241         * literal.cs (NullPointer): new class used to represent a null
7242         literal in a pointer context.
7243
7244         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
7245         type is a pointer, use a NullPointer object instead of a
7246         NullLiteral.   Closes 43687
7247
7248         (ExplicitConversion): Convert pointer values using
7249         the conv opcode to the proper type.
7250
7251         * ecore.cs (New): change ValueTypeVariable property into a method,
7252         that returns whether the valuetype is suitable for being used.
7253
7254         * expression.cs (Binary.DoNumericPromotions): Only return if we
7255         the int constant was a valid uint, and we can return both left and
7256         right as uints.  If not, we continue processing, to trigger the
7257         type conversion.  This fixes 39018.
7258
7259         * statement.cs (Block.EmitMeta): During constant resolution, set
7260         the CurrentBlock property on the emitcontext, so that we resolve
7261         constants propertly.
7262
7263 2003-07-02  Martin Baulig  <martin@ximian.com>
7264
7265         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
7266         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
7267
7268         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
7269         than emitting it here.
7270
7271         * statement.cs: Fixed some more flow analysis bugs.
7272
7273 2003-07-02  Martin Baulig  <martin@ximian.com>
7274
7275         * class.cs (MethodData.Define): When implementing interface
7276         methods, set Final unless we're Virtual.
7277
7278         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
7279         check work for interface methods.
7280
7281 2003-07-01  Martin Baulig  <martin@ximian.com>
7282
7283         * ecore.cs (EmitContext.This): Replaced this property with a
7284         GetThis() method which takes a Location argument.  This ensures
7285         that we get the correct error location for a CS0188.
7286
7287 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
7288
7289         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
7290         ImplicitStandardConversion.
7291
7292         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
7293
7294 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
7295
7296         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
7297         optimization.
7298
7299 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
7300
7301         * class.cs (Constructor.Define): Turn off initlocals for unsafe
7302         constructors.
7303
7304         (MethodData.Define): Turn off initlocals for unsafe methods.
7305
7306 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
7307
7308         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
7309         complete;  Fixes #37521.
7310
7311         * delegate.cs: Use Modifiers.TypeAttr to compute the
7312         TypeAttributes, instead of rolling our own.  This makes the flags
7313         correct for the delegates.
7314
7315 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
7316
7317         * class.cs (Constructor.Define): Set the private flag for static
7318         constructors as well.
7319
7320         * cs-parser.jay (statement_expression): Set the return value to
7321         null, to avoid a crash when we catch an error.
7322
7323 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
7324
7325         * cs-parser.jay: Applied patch from Jackson that adds support for
7326         extern and unsafe modifiers to destructor declarations.
7327
7328         * expression.cs: Report error 21 if the user is trying to index a
7329         System.Array.
7330
7331         * driver.cs: Add an error message, suggested by the bug report.
7332
7333         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
7334         if we do not have a ": this ()" constructor initializer.  Fixes 45149
7335
7336 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
7337
7338         * namespace.cs: Add some information to reduce FAQs.
7339
7340 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
7341
7342         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
7343         underlying enumeration types.  Fixes #43915.
7344
7345         * expression.cs: Treat ushort/short as legal values to be used in
7346         bitwise operations.
7347
7348 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
7349
7350         * delegate.cs: transfer custom attributes for paramenters from
7351         the delegate declaration to Invoke and BeginInvoke.
7352
7353 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
7354
7355         * attribute.cs: handle custom marshalers and emit marshal info
7356         for fields, too.
7357
7358 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
7359
7360         * makefile.gnu: Added anonymous.cs to the compiler sources.
7361
7362 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
7363
7364         * iterators.cs: Change the name of the proxy class to include two
7365         underscores.
7366
7367         * cs-parser.jay: Update grammar to include anonymous methods.
7368
7369         * anonymous.cs: new file.
7370
7371 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
7372
7373         * class.cs (Field.Define): Add missing test for pointers and
7374         safety. 
7375
7376 2003-05-27  Ravi Pratap  <ravi@ximian.com>
7377
7378         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
7379         we use the stobj opcode.
7380
7381         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
7382         since it wasn't the correct fix. 
7383
7384         It still is puzzling that we are required to use stobj for IntPtr
7385         which seems to be a ValueType.
7386
7387 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
7388
7389         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
7390         during regular simple name resolution.   Now, the trick is that
7391         instead of returning for processing the simplename, we do a
7392         TypeManager.LookupType (ie, a rooted lookup as opposed to a
7393         contextual lookup type).   If a match is found, return that, if
7394         not, return for further composition.
7395
7396         This fixes long-standing 30485.
7397
7398         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7399         using the address to initialize an object, do an Stobj instead of
7400         using the regular Stelem.
7401
7402         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
7403         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
7404         Because if we are a BaseIndexerAccess that value will be true.
7405         Fixes 43643.
7406
7407         * statement.cs (GotoCase.Resolve): Return after reporting an
7408         error, do not attempt to continue. 
7409
7410         * expression.cs (PointerArithmetic.Emit): If our operand is a
7411         long, convert our constants to match the operand before
7412         multiplying.  Convert to I type before adding.   Fixes 43670.
7413
7414 2003-05-14  Ravi Pratap  <ravi@ximian.com>
7415
7416         * enum.cs (ImplicitConversionExists) : Rename to
7417         ImplicitEnumConversionExists to remove ambiguity. 
7418
7419         * ecore.cs (NullCast): New type of cast expression class which
7420         basically is very similar to EmptyCast with the difference being
7421         it still is a constant since it is used only to cast a null to
7422         something else
7423         (eg. (string) null)
7424
7425         * convert.cs (ImplicitReferenceConversion): When casting a null
7426         literal, we return a NullCast.
7427
7428         * literal.cs (NullLiteralTyped): Remove - I don't see why this
7429         should be around anymore.
7430
7431         The renaming (reported was slightly wrong). Corrections:
7432
7433         ConvertImplicitStandard -> ImplicitConversionStandard
7434         ConvertExplicitStandard -> ExplicitConversionStandard
7435
7436         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
7437         before passing them in !
7438
7439         * convert.cs (ImplicitConversionStandard): When comparing for
7440         equal expr and target types, ensure that expr is not a
7441         NullLiteral.
7442
7443         In general, we must not be checking (expr_type ==
7444         target_type) in the top level conversion methods
7445         (ImplicitConversion, ExplicitConversion etc). This checking is
7446         done in the methods that they delegate to.
7447
7448 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
7449
7450         * convert.cs: Move Error_CannotConvertType,
7451         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
7452         ImplicitNumericConversion, ImplicitConversionExists,
7453         ImplicitUserConversionExists, StandardConversionExists,
7454         FindMostEncompassedType, FindMostSpecificSource,
7455         FindMostSpecificTarget, ImplicitUserConversion,
7456         ExplicitUserConversion, GetConversionOperators,
7457         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
7458         TryImplicitIntConversion, Error_CannotConvertImplicit,
7459         ConvertImplicitRequired, ConvertNumericExplicit,
7460         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
7461         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
7462         its own file.
7463
7464         Perform the following renames:
7465
7466         StandardConversionExists -> ImplicitStandardConversionExists
7467         ConvertImplicit -> ImplicitConversion
7468         ConvertImplicitStandard -> ImplicitStandardConversion
7469         TryImplicitIntConversion -> ImplicitIntConversion
7470         ConvertImplicitRequired -> ImplicitConversionRequired
7471         ConvertNumericExplicit -> ExplicitNumericConversion
7472         ConvertReferenceExplicit -> ExplicitReferenceConversion
7473         ConvertExplicit -> ExplicitConversion
7474         ConvertExplicitStandard -> ExplicitStandardConversion
7475
7476 2003-05-19  Martin Baulig  <martin@ximian.com>
7477
7478         * statement.cs (TypeInfo.StructInfo): Made this type protected.
7479         (TypeInfo): Added support for structs having structs as fields.
7480
7481         * ecore.cs (FieldExpr): Implement IVariable.
7482         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
7483         VariableInfo for the field.
7484
7485 2003-05-18  Martin Baulig  <martin@ximian.com>
7486
7487         * expression.cs (This.DoResolve): Report a CS0027 if we're
7488         emitting a field initializer.
7489
7490 2003-05-18  Martin Baulig  <martin@ximian.com>
7491
7492         * expression.cs (This.ResolveBase): New public function.
7493         (This.DoResolve): Check for CS0188.
7494
7495         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
7496         This.Resolve().
7497
7498         * ecore.cs (MethodGroupExpr.DoResolve): Set the
7499         `instance_expression' to null if we don't have any non-static
7500         methods.
7501
7502 2003-05-18  Martin Baulig  <martin@ximian.com>
7503
7504         Reworked the way how local variables and parameters are handled by
7505         the flow analysis code.
7506
7507         * statement.cs (TypeInfo, VariableMap): New public classes.
7508         (VariableInfo): New public class.  This is now responsible for
7509         checking whether a variable has been assigned.  It is used for
7510         parameters and local variables.
7511         (Block.EmitMeta): Take the InternalParameters as argument; compute
7512         the layout of the flow vectors here.
7513         (Block.LocalMap, Block.ParameterMap): New public properties.
7514         (FlowBranching): The .ctor doesn't get the InternalParameters
7515         anymore since Block.EmitMeta() now computes the layout of the flow
7516         vector.
7517         (MyStructInfo): This class is now known as `StructInfo' and nested
7518         in `TypeInfo'; we don't access this directly anymore.
7519
7520         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
7521         property and removed IsAssigned(), IsFieldAssigned(),
7522         SetAssigned() and SetFieldAssigned(); we now call them on the
7523         VariableInfo so we don't need to duplicate this code everywhere.
7524
7525         * expression.cs (ParameterReference): Added `Block block' argument
7526         to the .ctor.
7527         (LocalVariableReference, ParameterReference, This): The new
7528         VariableInfo class is now responsible for all the definite
7529         assignment stuff.
7530
7531         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
7532         IsParameterAssigned, SetParameterAssigned): Removed.
7533
7534 2003-05-18  Martin Baulig  <martin@ximian.com>
7535
7536         * typemanager.cs (InitCoreTypes): Try calling
7537         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
7538         the 3-args-version.  Corlib now also needs our `void_type'.
7539         (GetMethod): Added overloaded version which takes an optional
7540         `bool report_errors' to allow lookups of optional methods.
7541
7542 2003-05-12  Martin Baulig  <martin@ximian.com>
7543
7544         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
7545         only used for locals and not for parameters.
7546
7547 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
7548
7549         * support.cs (InternalParameters.ParameterType): Return the
7550         ExternalType of the parameter.
7551
7552         * parameter.cs (Parameter.ExternalType): drop the two arguments,
7553         they were unused.
7554
7555 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
7556
7557         * class.cs (MethodData.Define): Do not set the `newslot' on
7558         interface members, if they are also flagged as "override".
7559
7560         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
7561         better code for ++i and i++.  This only works for static fields
7562         and local variables.
7563
7564         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
7565         want to pull the DeclSpace out of the builder_to_declspace instead
7566         of the TypeBuilder (like in TypeContainer.FindMembers).
7567
7568         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
7569         instead of LookupTypeContainer.  Fixes the crash on .NET for
7570         looking up interface members.
7571
7572         * const.cs: Create our own emit context during the Definition
7573         stage, so that constants are evaluated in the proper context, when
7574         a recursive definition happens.
7575
7576 2003-05-11  Martin Baulig  <martin@ximian.com>
7577
7578         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
7579         new block for a switch section.
7580         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
7581         the adding/lookup in the switch block.  Fixes #39828.
7582
7583 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
7584
7585         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
7586         functionality: I needed to convert the data after I had performed
7587         the add/sub operation into the operands type size.
7588
7589         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
7590         pass the type for the box operation, otherwise the resulting
7591         object would have been of type object.
7592
7593         (BoxedCast): Add constructor to specify the type to box as.
7594
7595 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
7596
7597         * iterators.cs: I was reusing the `count' variable inadvertently,
7598         take steps to not allow this to happen.
7599
7600 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
7601
7602         * attribute.cs (Attribute.Resolve): Params attributes are encoded
7603         by creating an array at the point where the params starts and
7604         putting all those arguments there, then adjusting the size of the
7605         array.
7606
7607 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
7608
7609         * expression.cs (New.AddressOf): Implement interface
7610         IMemoryLocation.  This is used when the `new' operator is used in
7611         the context of an invocation to a method on a value type.
7612
7613         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
7614         example. 
7615
7616         * namespace.cs: Also check the using aliases here.
7617
7618         * driver.cs: Move the test for using validity after the types have
7619         been entered, so we do a single pass that also includes the using
7620         aliases. 
7621
7622         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
7623         in the regular case.   CreateSiblingForFinally is doing extra
7624         error checking.
7625
7626         * attribute.cs (GetAttributeArgumentExpression): Store the result
7627         on an out value, and use the return value to indicate failure
7628         instead of using null (which is a valid return for Constant.GetValue).
7629
7630         * statement.cs: Perform the analysis flow for the increment
7631         portion after the statement, because this will be the real flow of
7632         execution.  Fixes #42385
7633
7634         * codegen.cs (EmitContext.EmitArgument,
7635         EmitContext.EmitStoreArgument): New helper functions when the
7636         RemapToProxy flag is set.
7637
7638         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
7639         function.
7640
7641         Add support for remapping parameters. 
7642
7643         * iterators.cs: Propagate parameter values;  Store parameter
7644         values in the proxy classes.
7645
7646 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
7647
7648         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
7649         need a proxy reference;  I do not know what I was thinking
7650
7651         * cs-parser.jay (constructor_initializer): catch another error,
7652         and display nice message.
7653
7654         (field_declaration): catch void field declaration
7655         to flag a better error. 
7656
7657         * class.cs (MemberBase.CheckBase): Report an error instead of a
7658         warning if a new protected member is declared in a struct. 
7659         (Field.Define): catch the error of readonly/volatile.
7660
7661         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
7662
7663         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
7664         volatile variable is taken
7665
7666 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
7667
7668         * statement.cs (Fixed.Resolve): Report an error if we are not in
7669         an unsafe context.
7670
7671 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
7672
7673         * typemanager.cs: reuse the code that handles type clashes for
7674         delegates and enumerations.
7675
7676         * class.cs (Report28): Always report.
7677
7678         * expression.cs (EncodeAsAttribute): Allow nulls here.
7679
7680 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
7681
7682         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
7683         the functionality for testing whether an expression is valid for
7684         an attribute here.  Also handle the case of arrays of elements
7685         being stored. 
7686
7687         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
7688         encoding a linear array into an array of objects that are suitable
7689         to be passed to an CustomAttributeBuilder.
7690
7691         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
7692
7693         * ecore.cs: (FieldExpr): Handle field remapping here.
7694
7695         * iteratators.cs: Pass the instance variable (if the method is an
7696         instance method) to the constructors, so we can access the field
7697         variables on the class.
7698
7699         TODO: Test this with structs.  I think the THIS variable on
7700         structs might have to be a pointer, and not a refenrece
7701
7702 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
7703
7704         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
7705         local variables to fields in a proxy class.
7706
7707         * iterators.cs (PopulateProxy): Rename our internal fields to
7708         <XXX>.  
7709         Create a <THIS> field if we are an instance method, so we can
7710         reference our parent container variables.
7711         (MapVariable): Called back from the EmitContext code to enter a
7712         new variable to field mapping into the proxy class (we just create
7713         a FieldBuilder).
7714
7715         * expression.cs
7716         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
7717         for using the remapped locals to fields.
7718
7719         I placed the code here, because that gives the same semantics to
7720         local variables, and only changes the Emit code.
7721
7722         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
7723         statements inside iterators.
7724         (VariableInfo): Add a FieldBuilder for the cases when we are
7725         remapping local variables to fields in a proxy class
7726
7727         * ecore.cs (SimpleNameResolve): Avoid testing two times for
7728         current_block != null.
7729
7730         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
7731         not cope with strings, as it has been moved to the
7732         TableSwitchEmit.  Fixed bug in switch generation.
7733
7734         * expression.cs (New.DoResolve): Provide more context for the user
7735         when reporting an error.
7736
7737         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
7738         pointers. 
7739
7740         * expression.cs (MemberAccess.DoResolve): When we get a type back,
7741         check the permissions for it.  Note than in a type-resolution
7742         context the check was already present in DeclSpace.ResolveType,
7743         but was missing from the MemberAccess.
7744
7745         (ArrayCreation.CheckIndices): warn if the user has
7746         more nested levels of expressions, but there are no more
7747         dimensions specified.  Avoids crash on bug 41906.
7748
7749 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7750
7751         * statement.cs (Block): replace Implicit bool, for a generic
7752         flags.   
7753         New flag: `Unchecked'.  This is used during the EmitMeta phase
7754         (which is out-of-line with the regular Resolve/Emit process for a
7755         statement, as this is done ahead of time, but still gets a chance
7756         to call constant resolve).
7757
7758         (Block.Flags): new enum for adding a new flag.
7759
7760         (Block.EmitMeta): track the state of unchecked.
7761
7762         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7763         to enable constant resolution to work there as well.
7764
7765 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7766
7767         * typemanager.cs (ienumerable_type): Also look up
7768         System.Collections.IEnumerable. 
7769
7770 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7771
7772         TODO: Test more than one conditional per method.
7773
7774         * class.cs (Indexer.Define): Report the location where the user is
7775         referencing the unsupported feature.
7776
7777         (MethodData): Overload the use of `conditionals' to
7778         minimize the creation of needless ArrayLists.   This saves roughly
7779         212kb on my machine.
7780
7781         (Method): Implement the new IIteratorContainer interface.
7782         (Method.SetYields): Implement the method by setting the ModFlags
7783         to contain METHOD_YIELDS.
7784
7785         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7786         which just got set to null.
7787
7788         * iterators.cs: New file.
7789
7790         (Yield, YieldBreak): New statements.
7791
7792         * statement.cs (Return.Resolve): Flag an error if we are used in
7793         an iterator method.
7794
7795         * codegen.cs (InIterator): New flag set if the code is being
7796         compiled in an iterator method.
7797
7798         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7799         internal modifier, and we just use it to avoid adding extra
7800         fields, as this is seldom used.  
7801
7802         * cs-parser.jay: Add yield_statement (yield and yield break).
7803
7804         * driver.cs: New flag -v2 to turn on version 2 features. 
7805
7806         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7807         hashtable when v2 is enabled.
7808
7809 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7810
7811         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7812         there is already a namespace defined with this name.
7813
7814         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7815         people upgraded their corlibs.
7816
7817         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7818         always use fully qualified types, no need to use the compiler
7819         front end.
7820
7821         (TypeManager.IsNamespace): Use binarysearch.
7822
7823         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7824         AddDelegate): I did not quite use the new IsValid API properly: I
7825         have to pass the short-name and the fullname.  I was passing only
7826         the basename instead of the fullname sometimes. 
7827
7828         (TypeContainer.DefineType): call NamespaceClash.
7829
7830         * interface.cs (Interface.DefineType): use NamespaceClash before
7831         defining the type.
7832
7833         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7834         defining the type.
7835
7836         * enum.cs: (Enum.DefineType): use NamespaceClash before
7837         defining the type.
7838
7839         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7840         speed increase.  First, use the negative_hits cache when we get a
7841         negative.  Second, add the type with its full original name
7842         instead of the new . and + encoded name (reflection uses + to
7843         separate type from a nested type).  Use LookupTypeReflection
7844         directly which bypasses the type->name hashtable (that we already
7845         know does not contain the type.
7846
7847         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7848         location/container type. 
7849
7850         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7851
7852 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7853
7854         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7855
7856         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7857         method is being referenced in the method group from a static
7858         context, and report error 120 if so.
7859
7860         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7861         Error118. 
7862
7863         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7864         is created, we create the A namespace).
7865
7866         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7867         Fixes #41591
7868
7869 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7872         invocation to ModuleBuilder.GetType with the same values will
7873         return a new type instance, so we need to cache its return
7874         values. 
7875
7876         * expression.cs (Binary.ResolveOperator): Only allow the compare
7877         operators on enums if they are of the same type.
7878
7879         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7880         types of ValueType on their own case.  Before we were giving them
7881         the same treatment as objects.
7882
7883         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7884         fullname.  Short name is used to compare against container name.
7885         Fullname is used to check against defined namespace names.
7886
7887         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7888         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7889
7890         (Method.CheckBase): Call parent.
7891         (MemberBase.CheckBase): Check for protected members on sealed
7892         classes.
7893         (PropertyBase.CheckBase): Call parent.
7894         (Field.Define): Call parent.
7895
7896         * report.cs: Negative error codes are now mapped to 8000 - code,
7897         so that the display is render more nicely.
7898
7899         * typemanager.cs: Do not use try/catch, instead report a regular
7900         error. 
7901
7902         (GetPointerType, GetReferenceType): These methods provide
7903         mechanisms to obtain the T* and T& from a T.  We had the code
7904         previously scattered around the code base, and it also used
7905         TypeManager.LookupType that would go through plenty of caches.
7906         This one goes directly to the type source.
7907
7908         In some places we did the Type.GetType followed by
7909         ModuleBuilder.GetType, but not in others, so this unifies the
7910         processing as well.
7911
7912         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7913         statements now that we have namespace information.
7914
7915         * typemanager.cs (IsNamespace): New method, returns whether the
7916         string presented is a namespace or not.
7917
7918         (ComputeNamespaces): New public entry point, computes the list of
7919         available namespaces, using the GetNamespaces API call in Mono, or
7920         the slower version in MS.NET.   
7921
7922         Now before we start the semantic analysis phase, we have a
7923         complete list of namespaces including everything that the user has
7924         provided.
7925
7926         Deleted old code to cache namespaces in .nsc files.
7927
7928 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7929
7930         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7931         class/struct location definition Location for the implicit
7932         constructor location.
7933
7934         (Operator.Define): Use the location of the operator for the
7935         implicit Method definition.
7936
7937         (Constructor.Emit): use the constructor location for the implicit
7938         base initializer constructor.
7939
7940         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7941         and the Expression class now contains two new methods:
7942
7943         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7944         isolate type lookup from the rest of the resolution process.
7945
7946         Since we use Expressions to hold type definitions due to the way
7947         we parse the input we have historically overloaded Resolve to
7948         perform the Type lookups if a special flag is passed.  Now this is
7949         eliminated and two methods take their place. 
7950
7951         The differences in the two methods between xStep and xTerminal is
7952         that xStep is involved in our current lookup system that uses
7953         SimpleNames to compose a name, while xTerminal is used just to
7954         catch the case where the simplename lookup failed.
7955
7956 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7957
7958         * expression.cs (ResolveMemberAccess): Remove redundant code.
7959         TypeExpr expressions are always born fully resolved.
7960
7961         * interface.cs (PopulateMethod): Do not lookup the types twice.
7962         We were doing it once during SemanticAnalysis and once during
7963         PopulateMethod.
7964
7965         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7966         in local variable type definitions, were being returned as a
7967         SimpleName (we decomposed everything into a string), that is
7968         because primary_expression was being used instead of a type in the
7969         grammar (reduce/reduce conflicts).
7970
7971         The part that was wrong is that we converted the expression into a
7972         string (an oversimplification in one hand, compounded with primary
7973         expressions doing string concatenation).
7974
7975         So things like:
7976
7977         A.B.C [] x;
7978
7979         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7980         using clauses from working on this particular context.  And a type
7981         was being matched directly against "A.B.C[]".
7982
7983         We now use the correct approach, and allow for ComposedCast to be
7984         part of the unary expression.  So the "A.B.C []" become a composed
7985         cast of "A.B.C" (as a nested group of MemberAccess with a
7986         SimpleName at the end) plus the rank composition "[]". 
7987
7988         Also fixes 35567
7989
7990 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7991
7992         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7993         for the access level checking.
7994
7995         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7996         `TypeContainer container', because I kept getting confused when I
7997         was debugging this code.
7998
7999         * expression.cs (Indexers): Instead of tracking getters/setters,
8000         we now track them in parallel.  We create one arraylist less, but
8001         most importantly it is possible now for the LValue code to find a
8002         matching get for a set.
8003
8004         (IndexerAccess.DoResolveLValue): Update the code.
8005         GetIndexersForType has been modified already to extract all the
8006         indexers from a type.  The code assumed it did not.
8007
8008         Also make the code set the correct return type for the indexer.
8009         This was fixed a long time ago for properties, but was missing for
8010         indexers.  It used to be void_type.
8011
8012         (Binary.Emit): Test first for doubles instead of
8013         floats, as they are more common.
8014
8015         (Binary.EmitBranchable): Use the .un version of the branch opcodes
8016         when dealing with floats and the <=, >= operators.  This fixes bug
8017         #39314 
8018
8019         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
8020         to load the array value by emitting a load on the foreach variable
8021         type.  This was incorrect.  
8022
8023         We now emit the code to load an element using the the array
8024         variable type, and then we emit the conversion operator.
8025
8026         Fixed #40176
8027
8028 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
8029
8030         * attribute.cs: Avoid allocation of ArrayLists in the common case.
8031
8032 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
8033
8034         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
8035         test for protection before we test for signatures. 
8036
8037         (MethodSignature.ToString): implement.
8038
8039         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
8040         to the case where we reduced into a LongConstant.
8041
8042         * decl.cs (CheckAccessLevel): If the type is an array, we can not
8043         depend on whether the information is acurrate, because the
8044         Microsoft runtime will always claim that the array type is public,
8045         regardless of the real state.
8046
8047         If the type is a pointer, another problem happens: the type is
8048         reported as non-public in Microsoft.  
8049
8050         In both cases we have to call CheckAccessLevel recursively with
8051         the underlying type as the argument to be tested.
8052
8053 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
8054
8055         * assign.cs (Assign.Emit): If we are dealing with a compound
8056         assignment expression, we should use the code path that stores the
8057         intermediate result in a temporary value.  This fixes #40903.
8058
8059         *expression.cs (Indirection.ToString): Provide ToString method for
8060         debugging. 
8061
8062 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
8063
8064         * class.cs: Null out fields holding references to Block objects so
8065         they can be garbage collected.
8066
8067         * expression.cs (OverloadResolve): Remove unused local.
8068
8069 2003-04-07  Martin Baulig  <martin@ximian.com>
8070
8071         * codegen.cs (EmitContext.CurrentFile): New public field.
8072         (EmitContext.Mark): Use the CurrentFile to check whether the
8073         location is in the correct file.
8074         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
8075
8076 2003-04-07  Martin Baulig  <martin@ximian.com>
8077
8078         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
8079
8080         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
8081         location.  [FIXME: The location argument which gets passed to this
8082         method is sometimes wrong!]
8083
8084 2003-04-07  Nick Drochak <ndrochak@gol.com>
8085
8086         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
8087
8088 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
8089
8090         * expression.cs (Indirection.EmitAssign): We were using the
8091         temporary, but returning immediately instead of continuing the
8092         EmitAssing flow.
8093
8094 2003-04-06  Martin Baulig  <martin@ximian.com>
8095
8096         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
8097         if it's a nested child, but also deriving from the outer class.
8098         See test 190.cs.
8099
8100         * typemanager.cs (IsNestedChildOf): Make this work if it's a
8101         nested child, but also deriving from the outer class.  See
8102         test-190.cs.
8103         (FilterWithClosure): We may access private members of the outer
8104         class if we're a nested child and deriving from the outer class.
8105         (RealMemberLookup): Only set `closure_private_ok' if the
8106         `original_bf' contained BindingFlags.NonPublic.
8107
8108 2003-04-05  Martin Baulig  <martin@ximian.com>
8109
8110         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
8111         probe if its a type parameter, and if so, flag an error.
8112
8113         * decl.cs: Move here the SetParameterInfo code from class.cs.
8114         Handle IsGeneric here.
8115
8116         Handle a variety of errors in the parameter info definition.
8117
8118         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
8119         type parameters here.
8120
8121         * cs-parser.jay (class_declaration): report errors for parameters
8122         here as well.
8123
8124 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
8125
8126         * generic.cs: New file, contains support code for generics.
8127
8128         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
8129         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
8130
8131         Update parser for the above removals.
8132
8133         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
8134         now taken care of in the parser.
8135
8136 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
8137
8138         * class.cs (Event.Define): Do not allow abstract events to have
8139         initializers. 
8140
8141 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
8142
8143         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
8144         block in event declarations.
8145
8146         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
8147         value type, get its address.
8148
8149         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
8150         leaving a class on the stack instead of a boolean value (int
8151         0/1).  Change the code so we compare against null, and then the
8152         result against zero.
8153
8154         * class.cs (TypeContainer.GetClassBases): We were checking for the
8155         parent class being sealed too late.
8156
8157         * expression.cs (Binary.Emit): For <= and >= when dealing with
8158         floating point values, use cgt.un and clt.un instead of cgt and
8159         clt alone.
8160
8161 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
8162
8163         * statement.cs: Apply the same optimization as MS: skip the 
8164         GetEnumerator returning an IEnumerator, and use the one returning a 
8165         CharEnumerator instead. This allows us to avoid the try-finally block 
8166         and the boxing.
8167
8168 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
8169
8170         * cs-parser.jay: Attributes cannot be applied to
8171                          namespaces. Fixes #40473
8172
8173 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8174
8175         * class.cs:
8176         (Add*): check if the name is valid using the full name for constants,
8177         fields, properties and events.
8178
8179 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
8180
8181         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
8182         char constants to be part of the enumeration.
8183
8184         * expression.cs (Conditional.DoResolve): Add support for operator
8185         true. Implements the missing functionality from 14.12
8186
8187         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
8188         operator true/false as required by the spec.
8189
8190         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
8191         implicit conversion to boolean.
8192
8193         * statement.cs (Statement.ResolveBoolean): A boolean expression is
8194         also one where the type implements `operator true'. 
8195
8196         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
8197         get an expression that will invoke operator true based on an
8198         expression.  
8199
8200         (GetConversionOperators): Removed the hack that called op_True
8201         here.  
8202
8203         (Expression.ResolveBoolean): Move this from Statement.
8204
8205 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
8206
8207         * ecore.cs (FieldExpr): do not allow initialization of initonly
8208         fields on derived classes
8209
8210 2003-03-13  Martin Baulig  <martin@ximian.com>
8211
8212         * statement.cs (Block.Emit): Call ig.BeginScope() and
8213         ig.EndScope() when compiling with debugging info; call
8214         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
8215
8216 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
8217
8218         * expression.cs (Indexers): Do not construct immediately, allow
8219         for new members to be appended as we go.  Fixes 38143
8220
8221 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8222
8223         * expression.cs: save/restore context when resolving an unchecked
8224         expression.
8225
8226 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
8227
8228         * cfold.cs: Catch division by zero in modulus operator during
8229         constant folding.
8230
8231 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
8232
8233         * interface.cs (Interface.DefineMembers): Avoid defining members
8234         twice. 
8235
8236 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
8237
8238         * driver.cs: handle the +/- options for -noconfig
8239
8240         * statement.cs (Unckeched.Resolve): Also track the state of
8241         unchecked in the Resolve phase.
8242
8243 2003-02-27  Martin Baulig  <martin@ximian.com>
8244
8245         * ecore.cs (Expression.MemberLookup): Don't create a
8246         MethodGroupExpr for something which is not a method.  Fixes #38291.
8247
8248 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
8249
8250         * class.cs (MemberBase.CheckParameters): Also check that the type
8251         is unmanaged if it is a pointer.
8252
8253         * expression.cs (SizeOf.Resolve): Add location information.
8254
8255         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
8256         a managed type is declared.
8257
8258         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
8259         parameter modifiers as well.  Fixes bug 38606
8260
8261         * class.cs: Very sad.  Am backing out the speed up changes
8262         introduced by the ArrayList -> Array in the TypeContainer, as they
8263         were not actually that much faster, and introduced a bug (no error
8264         reports on duplicated methods).
8265
8266         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
8267         source first, this will guarantee that we have a valid expression
8268         before calling in lower levels functions that will require a
8269         resolved object.  Then use this original_source in the
8270         target.ResolveLValue instead of the original source that was
8271         passed to us.
8272
8273         Another change.  Use target.Resolve instead of LValueResolve.
8274         Although we are resolving for LValues, we will let the Assign code
8275         take care of that (it will be called again from Resolve).  This
8276         basically allows code like this:
8277
8278         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
8279         class Y { void A (X x) { x [0] += o; }
8280
8281         The problem was that the indexer was trying to resolve for
8282         set_Item (idx, object o) and never finding one.  The real set_Item
8283         was set_Item (idx, X).  By delaying the process we get the right
8284         semantics. 
8285
8286         Fixes bug 36505
8287
8288 2003-02-23  Martin Baulig  <martin@ximian.com>
8289
8290         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
8291         while calling DoEmit ().
8292
8293         * codegen.cs (EmitContext.Mark): Don't mark locations in other
8294         source files; if you use the #line directive inside a method, the
8295         compiler stops emitting line numbers for the debugger until it
8296         reaches the end of the method or another #line directive which
8297         restores the original file.
8298
8299 2003-02-23  Martin Baulig  <martin@ximian.com>
8300
8301         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
8302
8303 2003-02-23  Martin Baulig  <martin@ximian.com>
8304
8305         * statement.cs (Block.AddChildVariableNames): We need to call this
8306         recursively, not just for our immediate children.
8307
8308 2003-02-23  Martin Baulig  <martin@ximian.com>
8309
8310         * class.cs (Event.Define): Always make the field private, like csc does.
8311
8312         * typemanager.cs (TypeManager.RealMemberLookup): Make events
8313         actually work, fixes bug #37521.
8314
8315 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
8316
8317         * delegate.cs: When creating the various temporary "Parameters"
8318         classes, make sure that we call the ComputeAndDefineParameterTypes
8319         on those new parameters (just like we do with the formal ones), to
8320         allow them to be resolved in the context of the DeclSpace.
8321
8322         This fixes the bug that Dick observed in Bugzilla #38530.
8323
8324 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
8325
8326         * expression.cs (ResolveMemberAccess): When resolving a constant,
8327         do not attempt to pull a constant if the value was not able to
8328         generate a valid constant.
8329
8330         * const.cs (LookupConstantValue): Do not report more errors than required.
8331
8332 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8333
8334         * expression.cs: fixes bug #38328.
8335
8336 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8337
8338         * class.cs: Changed all the various members that can be part of a
8339         class from being an ArrayList to be an Array of the right type.
8340         During the DefineType type_list, interface_list, delegate_list and
8341         enum_list are turned into types, interfaces, delegates and enums
8342         arrays.  
8343
8344         And during the member population, indexer_list, event_list,
8345         constant_list, field_list, instance_constructor_list, method_list,
8346         operator_list and property_list are turned into their real arrays.
8347
8348         Although we could probably perform this operation earlier, for
8349         good error reporting we need to keep the lists and remove the
8350         lists for longer than required.
8351
8352         This optimization was triggered by Paolo profiling the compiler
8353         speed on the output of `gen-sample-program.pl' perl script. 
8354
8355         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
8356         not crash in methods like MemberLookupFailed that use this field.  
8357
8358         This problem arises when the compiler fails to resolve a type
8359         during interface type definition for example.
8360
8361 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8362
8363         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
8364         inherit from System.Object, so we have to stop at null, not only
8365         when reaching System.Object.
8366
8367 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
8368
8369         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
8370         DeclaredOnly because the parent indexer might have had a different
8371         name, but did not loop until the top of the hierarchy was reached.
8372
8373         The problem this one fixes is 35492: when a class implemented an
8374         indexer from an interface, we were getting the interface method
8375         (which was abstract) and we were flagging an error (can not invoke
8376         abstract method).
8377
8378         This also keeps bug 33089 functioning, and test-148 functioning.
8379
8380         * typemanager.cs (IsSpecialMethod): The correct way of figuring
8381         out if a method is special is to see if it is declared in a
8382         property or event, or whether it is one of the predefined operator
8383         names.   This should fix correctly #36804.
8384
8385 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
8386
8387         The goal here is to remove the dependency on EmptyCast.Peel ().
8388         Killing it completely.
8389
8390         The problem is that currently in a number of places where
8391         constants are expected, we have to "probe" for an EmptyCast, and
8392         Peel, which is not the correct thing to do, as this will be
8393         repetitive and will likely lead to errors. 
8394
8395         The idea is to remove any EmptyCasts that are used in casts that
8396         can be reduced to constants, so we only have to cope with
8397         constants. 
8398
8399         This bug hunt was triggered by Bug 37363 and the desire to remove
8400         the duplicate pattern where we were "peeling" emptycasts to check
8401         whether they were constants.  Now constants will always be
8402         constants.
8403
8404         * ecore.cs: Use an enumconstant here instead of wrapping with
8405         EmptyCast.  
8406
8407         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
8408         throwing me off.  By handling this we can get rid of a few hacks.
8409
8410         * statement.cs (Switch): Removed Peel() code.
8411
8412 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
8413
8414         * class.cs: Location information for error 508
8415
8416         * expression.cs (New.DoResolve): Add a guard against double
8417         resolution of an expression.  
8418
8419         The New DoResolve might be called twice when initializing field
8420         expressions (see EmitFieldInitializers, the call to
8421         GetInitializerExpression will perform a resolve on the expression,
8422         and later the assign will trigger another resolution
8423
8424         This leads to bugs (#37014)
8425
8426         * delegate.cs: The signature for EndInvoke should contain any ref
8427         or out parameters as well.  We were not doing this in the past. 
8428
8429         * class.cs (Field.Define): Do not overwrite the type definition
8430         inside the `volatile' group.  Turns out that volatile enumerations
8431         were changing the type here to perform a validity test, which
8432         broke conversions. 
8433
8434 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
8435
8436         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
8437         and structs, we do not want to load the instance variable
8438
8439         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
8440         enum_type has to be handled like an object reference (implicit
8441         conversions exists from this to object), but the regular IsClass
8442         and IsValueType tests will never return true for this one.
8443
8444         Also we use TypeManager.IsValueType instead of type.IsValueType,
8445         just for consistency with the rest of the code (this is only
8446         needed if we ever use the construct exposed by test-180.cs inside
8447         corlib, which we dont today).
8448
8449 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
8450
8451         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
8452         just InternalCall.
8453
8454 2003-02-09  Martin Baulig  <martin@ximian.com>
8455
8456         * namespace.cs (Namespace..ctor): Added SourceFile argument.
8457         (Namespace.DefineNamespaces): New static public method; this is
8458         called when we're compiling with debugging to add all namespaces
8459         to the symbol file.
8460
8461         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
8462         pass it to the Namespace's .ctor.
8463
8464         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
8465         and MethodBase arguments; pass the namespace ID to the symwriter;
8466         pass the MethodBase instead of the token to the symwriter.
8467         (SymbolWriter.DefineNamespace): New method to add a namespace to
8468         the symbol file.
8469
8470 2003-02-09  Martin Baulig  <martin@ximian.com>
8471
8472         * symbolwriter.cs: New file.  This is a wrapper around
8473         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
8474         methods here in near future.
8475
8476 2003-02-09  Martin Baulig  <martin@ximian.com>
8477
8478         * codegen.cs (EmitContext.Mark): Just pass the arguments to
8479         ILGenerator.MarkSequencePoint() which are actually used by the
8480         symbol writer.
8481
8482 2003-02-09  Martin Baulig  <martin@ximian.com>
8483
8484         * location.cs (SourceFile): New public sealed class.  This
8485         contains the name and an index which is used in the location's token.
8486         (Location): Reserve an appropriate number of bits in the token for
8487         the source file instead of walking over that list, this gives us a
8488         really huge performance improvement when compiling with debugging.
8489
8490         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
8491         `SourceFile' argument instead of a string.
8492         (Driver.ProcessFile): Add all the files via Location.AddFile(),
8493         but don't parse/tokenize here, we need to generate the list of all
8494         source files before we do that.
8495         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
8496         the files.
8497
8498         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
8499         instead of a string.
8500
8501         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
8502         of a string.
8503
8504 2003-02-09  Martin Baulig  <martin@ximian.com>
8505
8506         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
8507         filename on `#line default'.
8508
8509 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
8510
8511         * statement.cs: don't clear the pinned var when the fixed statement
8512         returns from the method (fixes bug#37752).
8513
8514 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
8515
8516         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
8517         to IsValueType.
8518
8519 2003-02-07  Martin Baulig  <martin@ximian.com>
8520
8521         * driver.cs: Removed the `--debug-args' command line argument.
8522
8523         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
8524         automatically by the AsssemblyBuilder.
8525         (CodeGen.InitializeSymbolWriter): We don't need to call any
8526         initialization function on the symbol writer anymore.  This method
8527         doesn't take any arguments.
8528
8529 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
8530
8531         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
8532         from referenced assemblies as well.
8533
8534 2003-02-02  Martin Baulig  <martin@ximian.com>
8535
8536         * class.cs (MethodData.Emit): Generate debugging info for external methods.
8537
8538 2003-02-02  Martin Baulig  <martin@ximian.com>
8539
8540         * class.cs (Constructor.Emit): Open the symbol writer before
8541         emitting the constructor initializer.
8542         (ConstructorInitializer.Emit): Call ec.Mark() to allow
8543         single-stepping through constructor initializers.
8544
8545 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
8546
8547         * class.cs: Handle error 549: do not allow virtual methods in
8548         sealed classes. 
8549
8550 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
8551
8552         * decl.cs: Check access levels when resolving types
8553
8554 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
8555
8556         * statement.cs: Add parameters and locals set in catch blocks that might 
8557         return to set vector
8558
8559 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
8560
8561         * class.cs (Operator): Set the SpecialName flags for operators.
8562
8563         * expression.cs (Invocation.DoResolve): Only block calls to
8564         accessors and operators on SpecialName methods.
8565
8566         (Cast.TryReduce): Handle conversions from char constants.
8567
8568
8569 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
8570
8571         * statement.cs: small memory and time optimization in FlowBranching.
8572
8573 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
8574
8575         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
8576         problem that the last fix but in the other sid (Set).
8577
8578         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
8579         access when there is no indexer in the hierarchy.
8580
8581 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
8582
8583         * class.cs: Combine some if statements.
8584
8585 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8586
8587         * driver.cs: fixed bug #37187.
8588
8589 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
8590
8591         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
8592         any indexer, it's needed to build a list with all the indexers in the
8593         hierarchy (AllGetters), else we have problems. Fixes #35653.
8594
8595 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
8596
8597         * class.cs (MethodData.Define): It is wrong for an interface
8598         implementation to be static in both cases: explicit and implicit.
8599         We were only handling this in one case.
8600
8601         Improve the if situation there to not have negations.
8602
8603         * class.cs (Field.Define): Turns out that we do not need to check
8604         the unsafe bit on field definition, only on usage.  Remove the test.
8605
8606 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8607
8608         * driver.cs: use assembly.Location instead of Codebase (the latest
8609         patch made mcs fail when using MS assemblies).
8610
8611 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
8612
8613         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
8614         get the path to *corlib.dll.
8615
8616 2003-01-21  Nick Drochak <ndrochak@gol.com>
8617
8618         * cs-tokenizer.cs:
8619         * pending.cs:
8620         * typemanager.cs: Remove compiler warnings
8621
8622 2003-01-20  Duncan Mak  <duncan@ximian.com>
8623
8624         * AssemblyInfo.cs: Bump the version number to 0.19.
8625
8626 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8627
8628         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
8629
8630 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
8631
8632         * class.cs (Constructor::Emit): Emit debugging info for constructors.
8633
8634 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
8635
8636         * cs-parser.jay: Small fix: we were not comparing the constructor
8637         name correctly.   Thanks to Zoltan for the initial pointer.
8638
8639 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
8640
8641         * cs-tokenizer.cs: Set file name when specified with #line
8642
8643 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
8644
8645         * cs-parser.jay: Only perform the constructor checks here if we
8646         are named like the class;  This will help provider a better
8647         error.  The constructor path is taken when a type definition is
8648         not found, but most likely the user forgot to add the type, so
8649         report that rather than the constructor error.
8650
8651 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
8652
8653         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
8654         allocations.
8655
8656 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8657
8658         * cs-parser.jay: Add cleanup call.
8659
8660 2003-01-13  Duncan Mak  <duncan@ximian.com>
8661
8662         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
8663         consistent with other methods.
8664
8665 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8666
8667         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
8668
8669 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
8670
8671         * attribute.cs: only set GuidAttr to true when we have a
8672         GuidAttribute.
8673
8674 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8675
8676         * ecore.cs:
8677         * expression.cs:
8678         * typemanager.cs: fixes to allow mcs compile corlib with the new
8679         Type.IsSubclassOf fix.
8680
8681 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
8682
8683         * expression.cs (LocalVariableReference.DoResolve): Classify a
8684         constant as a value, not as a variable.   Also, set the type for
8685         the variable.
8686
8687         * cs-parser.jay (fixed_statement): take a type instead of a
8688         pointer_type, so we can produce a better error message later.
8689
8690         * statement.cs (Fixed.Resolve): Flag types that are not pointers
8691         as an error.  
8692
8693         (For.DoEmit): Make inifinite loops have a
8694         non-conditional branch back.
8695
8696         (Fixed.DoEmit): First populate the pinned variables, then emit the
8697         statement, then clear the variables.  Before I was emitting the
8698         code once for each fixed piece.
8699
8700
8701 2003-01-08  Martin Baulig  <martin@ximian.com>
8702
8703         * statement.cs (FlowBranching.MergeChild): A break in a
8704         SWITCH_SECTION does not leave a loop.  Fixes #36155.
8705
8706 2003-01-08  Martin Baulig  <martin@ximian.com>
8707
8708         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
8709         lives in the same number space than `param_map'.  Fixes #36154.
8710
8711 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
8712
8713         * cs-parser.jay (constructor_declaration): Set the
8714         Constructor.ModFlags before probing for it.  This makes the
8715         compiler report 514, 515 and 132 (the code was there, but got
8716         broken). 
8717
8718         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
8719         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
8720         (GotoCase.Resolve): Set `Returns' to ALWAYS.
8721
8722 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
8723
8724         * enum.cs: create the enum static fields using the enum type.
8725
8726 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
8727
8728         * class.cs: don't try to create the ParamBuilder for the return
8729         type if it's not needed (and handle it breaking for the ms runtime
8730         anyway).
8731
8732 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
8733
8734         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
8735
8736 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
8737
8738         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
8739         the command.   This showed up while compiling the JANET source
8740         code, which used \r as its only newline separator.
8741
8742 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
8743
8744         * class.cs (Method.Define): If we are an operator (because it
8745         reuses our code), then set the SpecialName and HideBySig.  #36128
8746
8747 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
8748
8749         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
8750         exception, report error 120 `object reference required'.
8751
8752         * driver.cs: Add --pause option, used during to measure the size
8753         of the process as it goes with --timestamp.
8754
8755         * expression.cs (Invocation.DoResolve): Do not allow methods with
8756         SpecialName to be invoked.
8757
8758 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
8759
8760         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
8761         number before adding it.
8762
8763 2002-12-21  Ravi Pratap  <ravi@ximian.com>
8764
8765         * ecore.cs (StandardImplicitConversion): When in an unsafe
8766         context, we allow conversion between void * to any other pointer
8767         type. This fixes bug #35973.
8768
8769 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8770
8771         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8772         is not thrown when extensionless outputs are used 
8773
8774 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8775
8776         * rootcontext.cs: fixed compilation of corlib.
8777
8778 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8779
8780         * attribute.cs (Attributes.Contains): Add new method.
8781
8782         * class.cs (MethodCore.LabelParameters): if the parameter is an
8783         `out' parameter, check that no attribute `[In]' has been passed.
8784
8785         * enum.cs: Handle the `value__' name in an enumeration.
8786
8787 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8788
8789         * decl.cs: Added special case to allow overrides on "protected
8790         internal" methods
8791
8792 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8793
8794         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8795         since it makes much more sense.
8796
8797         (Attributes.ctor): Don't require a Location parameter.
8798
8799         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8800
8801         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8802         since we already have that information per attribute.
8803
8804         * everywhere : make appropriate changes.
8805
8806         * class.cs (LabelParameters): Write the code which actually
8807         applies attributes to the return type. We can't do this on the MS
8808         .NET runtime so we flag a warning in the case an exception is
8809         thrown.
8810
8811 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8812
8813         * const.cs: Handle implicit null conversions here too.
8814
8815 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8816
8817         * class.cs (MethodCore.LabelParameters): Remove the extra
8818         Type [] parameter since it is completely unnecessary. Instead
8819         pass in the method's attributes so that we can extract
8820         the "return" attribute.
8821
8822 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8823
8824         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8825         of ignoring it and letting the compile continue.
8826
8827         * typemanager.cs (ChangeType): use an extra argument to return an
8828         error condition instead of throwing an exception.
8829
8830 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8831
8832         * expression.cs (Unary.TryReduce): mimic the code for the regular
8833         code path.  Perform an implicit cast in the cases where we can
8834         implicitly convert to one of the integral types, and then reduce
8835         based on that constant.   This fixes bug #35483.
8836
8837 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8838
8839         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8840
8841 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8842
8843         * namespace.cs: fixed bug #35489.
8844
8845 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8846
8847         * class.cs: Remove some dead code.
8848
8849         * cs-parser.jay: Estimate the number of methods needed
8850         (RootContext.MethodCount);
8851
8852         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8853         numbers instead of StringBuilders.
8854
8855         * support.cs (PtrHashtable): Add constructor with initial size;
8856         We can now reduce reallocations of the method table.
8857
8858 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8859
8860         * attribute.cs (ApplyAttributes): Keep track of the emitted
8861         attributes on a per-target basis. This fixes bug #35413.
8862
8863 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8864
8865         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8866         default to the Windows 1252 encoding.
8867
8868         (UnixParseOption): Support version, thanks to Alp for the missing
8869         pointer. 
8870
8871         * AssemblyInfo.cs: Add nice assembly information.
8872
8873         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8874         (bug 35169).
8875
8876         * cs-parser.jay: Allow a trailing comma before the close bracked
8877         in the attribute_section production.
8878
8879         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8880         address of the instance was being taken, I will take this out,
8881         because we take the address of the object immediately here.
8882
8883 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8884
8885         * typemanager.cs (AreMultipleAllowed): Take care of the most
8886         obvious case where attribute type is not in the current assembly -
8887         stupid me ;-)
8888
8889 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8890
8891         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8892         definitions, instead of doing that afterwards.  
8893
8894         Also we use a nice little hack, depending on the constructor, we
8895         know if we are a "composed" name or a simple name.  Hence, we
8896         avoid the IndexOf test, and we avoid 
8897
8898         * codegen.cs: Add code to assist in a bug reporter to track down
8899         the source of a compiler crash. 
8900
8901 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8902
8903         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8904         types have been emitted for a given element and flag an error
8905         if something which does not have AllowMultiple set is used more
8906         than once.
8907
8908         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8909         attribute types and their corresponding AllowMultiple properties
8910
8911         (AreMultipleAllowed): Check the property for a given type.
8912
8913         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8914         property in the case we have a TypeContainer.
8915
8916         (Attributes.AddAttribute): Detect duplicates and just skip on
8917         adding them. This trivial fix catches a pretty gross error in our
8918         attribute emission - global attributes were being emitted twice!
8919
8920         Bugzilla bug #33187 is now fixed.
8921
8922 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8923
8924         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8925         instead of pp_and).
8926
8927         * expression.cs (Binary.ResolveOperator): I can only use the
8928         Concat (string, string, string) and Concat (string, string,
8929         string, string) if the child is actually a concatenation of
8930         strings. 
8931
8932 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8933
8934         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8935         context where we need a 2-character lookahead.
8936
8937         * pending.cs (PendingImplementation): Rework so we can keep track
8938         of interface types all the time, and flag those which were
8939         implemented by parents as optional.
8940
8941 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8942
8943         * expression.cs (Binary.ResolveOperator): Use
8944         String.Concat(string,string,string) or
8945         String.Concat(string,string,string,string) when possible. 
8946
8947         * typemanager: More helper methods.
8948
8949
8950 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8951
8952         * pending.cs: remove the bogus return from GetMissingInterfaces()
8953         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8954
8955 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8956
8957         * namespace.cs: avoid duplicated 'using xxx' being added to
8958         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8959         when we get more than one 'using' statement for the same namespace.
8960         Report a CS0105 warning for it.
8961
8962 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8963
8964         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8965         of calling getChar/putback, uses internal knowledge of it.    
8966
8967         (xtoken): Reorder tokenizer so most common patterns are checked
8968         first.  This reduces the compilation time in another 5% (from 8.11s
8969         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8970
8971         The parsing time is 22% of the compilation in mcs, and from that
8972         64% is spent on the tokenization process.  
8973
8974         I tried using a binary search for keywords, but this is slower
8975         than the hashtable.  Another option would be to do a couple of
8976         things:
8977
8978                 * Not use a StringBuilder, instead use an array of chars,
8979                   with a set value.  Notice that this way we could catch
8980                   the 645 error without having to do it *afterwards*.
8981
8982                 * We could write a hand-parser to avoid the hashtable
8983                   compares altogether.
8984
8985         The identifier consumption process takes 37% of the tokenization
8986         time.  Another 15% is spent on is_number.  56% of the time spent
8987         on is_number is spent on Int64.Parse:
8988
8989                 * We could probably choose based on the string length to
8990                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8991                   computations. 
8992
8993         Another 3% is spend on wrapping `xtoken' in the `token' function.
8994
8995         Handle 0xa0 as whitespace (#34752)
8996
8997 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8998
8999         * typemanager.cs (IsCLRType): New routine to tell whether a type
9000         is one of the builtin types.  
9001
9002         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
9003         typecode in more places instead of doing pointer comparissions.
9004         We could leverage some knowledge about the way the typecodes are
9005         laid out.
9006
9007         New code to cache namespaces in assemblies, it is currently not
9008         invoked, to be used soon.
9009
9010         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
9011
9012         * expression.cs (Binary.ResolveOperator): specially handle
9013         strings, and do not perform user-defined operator overloading for
9014         built-in types.
9015
9016 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
9017
9018         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
9019         internalcall as it is a pretty simple operation;  Avoid whenever
9020         possible to call Char.IsLetter.
9021
9022         (consume_identifier): Cut by half the number of
9023         hashtable calls by merging the is_keyword and GetKeyword behavior.
9024
9025         Do not short-circuit, because if we do, we
9026         report errors (ie, #if false && true would produce an invalid
9027         directive error);
9028
9029
9030 2002-11-24  Martin Baulig  <martin@ximian.com>
9031
9032         * expression.cs (Cast.TryReduce): If we're in checked syntax,
9033         check constant ranges and report a CS0221.  Fixes #33186.
9034
9035 2002-11-24  Martin Baulig  <martin@ximian.com>
9036
9037         * cs-parser.jay: Make this work for uninitialized variable
9038         declarations in the `for' initializer.  Fixes #32416.
9039
9040 2002-11-24  Martin Baulig  <martin@ximian.com>
9041
9042         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
9043         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
9044
9045 2002-11-24  Martin Baulig  <martin@ximian.com>
9046
9047         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
9048         argument; if true, we also check for user-defined conversions.
9049         This is only needed if both arguments are of a user-defined type.
9050         Fixes #30443, added test-175.cs.
9051         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
9052
9053         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
9054
9055 2002-11-24  Martin Baulig  <martin@ximian.com>
9056
9057         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
9058         function to get the store opcode.
9059         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
9060         only emit the Ldelema if the store opcode is Stobj.  You must run
9061         both test-34 and test-167 to test this.  Fixes #34529.
9062
9063 2002-11-23  Martin Baulig  <martin@ximian.com>
9064
9065         * ecore.cs (Expression.MemberLookup): Added additional
9066         `qualifier_type' argument which is used when we're being called
9067         from MemberAccess.DoResolve() and null if we're called from a
9068         SimpleName lookup.
9069         (Expression.MemberLookupFailed): New method to report errors; this
9070         does the CS1540 check and reports the correct error message.
9071
9072         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
9073         argument for the CS1540 check and redone the way how we're dealing
9074         with private members.  See the comment in the source code for details.
9075         (FilterWithClosure): Reverted this back to revision 1.197; renamed
9076         `closure_start_type' to `closure_qualifier_type' and check whether
9077         it's not null.  It was not this filter being broken, it was just
9078         being called with the wrong arguments.
9079
9080         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
9081         and pass it the correct `qualifier_type'; this also does the error
9082         handling for us.
9083
9084 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
9085
9086         * expression.cs (Invocation.EmitParams): If the we are dealing
9087         with a non-built-in value type, load its address as well.
9088
9089         (ArrayCreation): Use a a pretty constant instead
9090         of the hardcoded value 2.   Use 6 instead of 2 for the number of
9091         static initializers.  
9092
9093         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
9094         because they are not really value types, just glorified integers. 
9095
9096         * driver.cs: Do not append .exe, the CSC compiler does not do it.
9097
9098         * ecore.cs: Remove redundant code for enumerations, make them use
9099         the same code path as everything else, fixes the casting issue
9100         with enumerations in Windows.Forms.
9101
9102         * attribute.cs: Do only cast to string if it is a string, the
9103         validation happens later.
9104
9105         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
9106         people upgrade their corlibs.
9107
9108         * ecore.cs: Oops, enumerations were not following the entire code path
9109
9110 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
9111
9112         * typemanager.cs (FilterWithClosure): Commented out the test for
9113         1540 in typemanager.cs, as it has problems when accessing
9114         protected methods from a parent class (see test-174.cs). 
9115
9116         * attribute.cs (Attribute.ValidateGuid): new method.
9117         (Attribute.Resolve): Use above.
9118
9119 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
9120
9121         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
9122
9123         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
9124         handling for enumerations, as we only needed the TypeContainer
9125         functionality to begin with (this is required for the fix below to
9126         work for enums that reference constants in a container class for
9127         example). 
9128
9129         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
9130
9131         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
9132         a valid TypeBuilder to perform lookups on.o
9133
9134         * class.cs (InheritableMemberSignatureCompare): Use true in the
9135         call to GetGetMethod and GetSetMethod, because we are comparing
9136         the signature, and we need to get the methods *even* if they are
9137         private. 
9138
9139         (PropertyBase.CheckBase): ditto.
9140
9141         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
9142         GotoCase.Resolve): Use Peel on EmpytCasts.
9143
9144         * ecore.cs (EmptyCast): drop child, add Peel method.
9145
9146 2002-11-17  Martin Baulig  <martin@ximian.com>
9147
9148         * ecore.cs (EmptyCast.Child): New public property.
9149
9150         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
9151         label resolved to an EmptyCast.  Fixes #34162.
9152         (GotoCase.Resolve): Likewise.
9153         (Block.EmitMeta): Likewise.
9154
9155 2002-11-17  Martin Baulig  <martin@ximian.com>
9156
9157         * expression.cs (Invocation.BetterConversion): Prefer int over
9158         uint; short over ushort; long over ulong for integer literals.
9159         Use ImplicitConversionExists instead of StandardConversionExists
9160         since we also need to check for user-defined implicit conversions.
9161         Fixes #34165.  Added test-173.cs.
9162
9163 2002-11-16  Martin Baulig  <martin@ximian.com>
9164
9165         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
9166         with the `true' and `false' literals.  Fixes #33151.
9167
9168 2002-11-16  Martin Baulig  <martin@ximian.com>
9169
9170         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
9171         October 22nd; don't do the cs1540 check for static members.
9172
9173         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
9174         now using our own filter here and doing the cs1540 check again.
9175
9176 2002-11-16  Martin Baulig  <martin@ximian.com>
9177
9178         * support.cs (InternalParameters): Don't crash if we don't have
9179         any fixed parameters.  Fixes #33532.
9180
9181 2002-11-16  Martin Baulig  <martin@ximian.com>
9182
9183         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
9184         when looking up static methods to make this work on Windows.
9185         Fixes #33773.
9186
9187 2002-11-16  Martin Baulig  <martin@ximian.com>
9188
9189         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
9190         a setter rather than using PropertyInfo.CanWrite.
9191
9192 2002-11-15  Nick Drochak  <ndrochak@gol.com>
9193
9194         * class.cs: Allow acces to block member by subclasses. Fixes build
9195         breaker.
9196
9197 2002-11-14  Martin Baulig  <martin@ximian.com>
9198
9199         * class.cs (Constructor.Emit): Added the extern/block check.
9200         Fixes bug #33678.
9201
9202 2002-11-14  Martin Baulig  <martin@ximian.com>
9203
9204         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
9205         iteration while looking for indexers, this is needed because the
9206         indexer may have a different name in our base classes.  Fixed the
9207         error reporting (no indexers at all, not get accessor, no
9208         overloaded match).  Fixes bug #33089.
9209         (IndexerAccess.DoResolveLValue): Likewise.
9210
9211 2002-11-14  Martin Baulig  <martin@ximian.com>
9212
9213         * class.cs (PropertyBase.CheckBase): Make this work for multiple
9214         indexers.  Fixes the first part of bug #33089.
9215         (MethodSignature.InheritableMemberSignatureCompare): Added support
9216         for properties.
9217
9218 2002-11-13  Ravi Pratap  <ravi@ximian.com>
9219
9220         * attribute.cs (Attribute.Resolve): Catch the
9221         NullReferenceException and report it since it isn't supposed to
9222         happen. 
9223
9224 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
9225
9226         * expression.cs (Binary.EmitBranchable): Also handle the cases for
9227         LogicalOr and LogicalAnd that can benefit from recursively
9228         handling EmitBranchable.  The code now should be nice for Paolo.
9229
9230 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
9231
9232         * typemanager.cs (LookupType): Added a negative-hit hashtable for
9233         the Type lookups, as we perform quite a number of lookups on
9234         non-Types.  This can be removed once we can deterministically tell
9235         whether we have a type or a namespace in advance.
9236
9237         But this might require special hacks from our corlib.
9238
9239         * TODO: updated.
9240
9241         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
9242         and double which avoids a conversion from an integer to a double.
9243
9244         * expression.cs: tiny optimization, avoid calling IsConstant,
9245         because it effectively performs the lookup twice.
9246
9247 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
9248
9249         But a bogus return here to keep the semantics of the old code
9250         until the Mono runtime is fixed.
9251
9252         * pending.cs (GetMissingInterfaces): New method used to remove all
9253         the interfaces that are already implemented by our parent
9254         classes from the list of pending methods. 
9255
9256         * interface.cs: Add checks for calls after ResolveTypeExpr.
9257
9258 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
9259
9260         * class.cs (Class.Emit): Report warning 67: event not used if the
9261         warning level is beyond 3.
9262
9263         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
9264         being a NullLiteral.
9265
9266         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
9267         specifiers. 
9268
9269         * class.cs (TypeContainer.GetClassBases): Cover a missing code
9270         path that might fail if a type can not be resolved.
9271
9272         * expression.cs (Binary.Emit): Emit unsigned versions of the
9273         operators. 
9274
9275         * driver.cs: use error 5.
9276
9277 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
9278
9279         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
9280
9281 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
9282
9283         * cs-parser.jay (switch_section): A beautiful patch from Martin
9284         Baulig that fixed 33094.
9285
9286 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
9287
9288         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
9289         Check whether the base is abstract and report an error if so.
9290
9291         * expression.cs (IndexerAccess.DoResolveLValue,
9292         IndexerAccess.DoResolve): ditto. 
9293
9294         (Invocation.DoResolve): ditto.
9295
9296         (Invocation.FullMethodDesc): Improve the report string.
9297
9298         * statement.cs (Block): Eliminate IsVariableDefined as it is
9299         basically just a wrapper for GetVariableInfo.
9300
9301         * ecore.cs (SimpleName): Use new 
9302
9303         * support.cs (ReflectionParamter.ParameterType): We unwrap the
9304         type, as we return the actual parameter ref/unref state on a
9305         different call.
9306
9307 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
9308
9309         * support.cs: Return proper flags REF/OUT fixing the previous
9310         commit.  
9311
9312         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
9313         not used to mean `ref' but `ref or out' in ParameterReference
9314
9315         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
9316         full type signature instead of calling TypeManger.CSharpName
9317         ourselves. 
9318
9319         * support.cs (InternalParameters.ParameterDesc): Do not compare
9320         directly to the modflags, because REF/OUT will actually be bitsets
9321         if set. 
9322
9323         * delegate.cs (VerifyMethod): Check also the modifiers.
9324
9325         * cs-tokenizer.cs: Fix bug where floating point values with an
9326         exponent where a sign was missing was ignored.
9327
9328         * driver.cs: Allow multiple assemblies to be specified in a single
9329         /r: argument
9330
9331 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
9332
9333         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
9334         because identifiers after a parenthesis would end up in this kind
9335         of production, and we needed to desamiguate it for having casts
9336         like:
9337
9338                 (UserDefinedType *) xxx
9339
9340 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
9341
9342         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
9343         we should set on the Bindingflags.NonPublic, but not turn on
9344         private_ok.  private_ok controls whether a Private member is
9345         returned (this is chekced on the filter routine), while the
9346         BindingFlags.NonPublic just controls whether private/protected
9347         will be allowed.   This fixes the problem part of the problem of
9348         private properties being allowed to be used in derived classes.
9349
9350         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
9351         so we can call the children DoResolveLValue method (this will
9352         properly signal errors on lvalue assignments to base properties)
9353
9354         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
9355         getter are null, and we have a property info, we know that this
9356         happened because the lookup failed, so we report an error 122 for
9357         protection level violation.
9358
9359         We also silently return if setter and getter are null in the
9360         resolve functions, this condition only happens if we have flagged
9361         the error before.  This is the other half of the problem. 
9362
9363         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
9364         not have accessibility information, that is why we were returning
9365         true in the filter function in typemanager.cs.
9366
9367         To properly report 122 (property is inaccessible because of its
9368         protection level) correctly, we report this error in ResolveAccess
9369         by failing if both the setter and the getter are lacking (ie, the
9370         lookup failed). 
9371
9372         DoResolve and DoLResolve have been modified to check for both
9373         setter/getter being null and returning silently, the reason being
9374         that I did not want to put the knowledge about this error in upper
9375         layers, like:
9376
9377         int old = Report.Errors;
9378         x = new PropertyExpr (...);
9379         if (old != Report.Errors)
9380                 return null;
9381         else
9382                 return x;
9383
9384         So the property expr is returned, but it is invalid, so the error
9385         will be flagged during the resolve process. 
9386
9387         * class.cs: Remove InheritablePropertySignatureCompare from the
9388         class, as we no longer depend on the property signature to compute
9389         whether it is possible to implement a method or not.
9390
9391         The reason is that calling PropertyInfo.GetGetMethod will return
9392         null (in .NET, in Mono it works, and we should change this), in
9393         cases where the Get Method does not exist in that particular
9394         class.
9395
9396         So this code:
9397
9398         class X { public virtual int A { get { return 1; } } }
9399         class Y : X { }
9400         class Z : Y { public override int A { get { return 2; } } }
9401
9402         Would fail in Z because the parent (Y) would not have the property
9403         defined.  So we avoid this completely now (because the alternative
9404         fix was ugly and slow), and we now depend exclusively on the
9405         method names.
9406
9407         (PropertyBase.CheckBase): Use a method-base mechanism to find our
9408         reference method, instead of using the property.
9409
9410         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
9411         routines are gone now.
9412
9413         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
9414         names, they were incorrectly named.
9415
9416         * cs-tokenizer.cs: Return are more gentle token on failure. 
9417
9418         * pending.cs (PendingImplementation.InterfaceMethod): This routine
9419         had an out-of-sync index variable, which caused it to remove from
9420         the list of pending methods the wrong method sometimes.
9421
9422 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
9423
9424         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
9425         CanWrite, because those refer to this particular instance of the
9426         property, and do not take into account the fact that we can
9427         override single members of a property.
9428
9429         Constructor requires an EmitContext.  The resolution process does
9430         not happen here, but we need to compute the accessors before,
9431         because the resolution does not always happen for properties.
9432
9433         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
9434         subclass, before we did not update this flag, but we did update
9435         bindingflags. 
9436
9437         (GetAccessors): Drop this routine, as it did not work in the
9438         presence of partially overwritten set/get methods. 
9439
9440         Notice that this broke the cs1540 detection, but that will require
9441         more thinking. 
9442
9443 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9444
9445         * class.cs:
9446         * codegen.cs:
9447         * driver.cs: issue a warning instead of an error if we don't support
9448         debugging for the platform. Also ignore a couple of errors that may
9449         arise when trying to write the symbols. Undo my previous patch.
9450
9451 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9452
9453         * driver.cs: ignore /debug switch except for Unix platforms.
9454
9455 2002-10-23  Nick Drochak  <ndrochak@gol.com>
9456
9457         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
9458
9459 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
9460
9461         * driver.cs: Do not make mcs-debug conditional, so we do not break
9462         builds that use it.
9463
9464         * statement.cs (UsageVector.MergeChildren): I would like Martin to
9465         review this patch.  But basically after all the children variables
9466         have been merged, the value of "Breaks" was not being set to
9467         new_breaks for Switch blocks.  I think that it should be set after
9468         it has executed.  Currently I set this to the value of new_breaks,
9469         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
9470         conservative, but I do not understand this code very well.
9471
9472         I did not break anything in the build, so that is good ;-)
9473
9474         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
9475
9476 2002-10-20  Mark Crichton  <crichton@gimp.org>
9477
9478         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
9479
9480 2002-10-20  Nick Drochak  <ndrochak@gol.com>
9481
9482         * cfold.cs: Fixed compile blocker.
9483
9484 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
9485
9486         * driver.cs: I was chekcing the key, not the file.
9487
9488 2002-10-19  Ravi Pratap  <ravi@ximian.com>
9489
9490         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
9491         message that we were generating - we just need to silently return
9492         a null.
9493
9494 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
9495
9496         * class.cs (Event.Define): Change my previous commit, as this
9497         breaks the debugger.  This is a temporary hack, as it seems like
9498         the compiler is generating events incorrectly to begin with.
9499
9500         * expression.cs (Binary.ResolveOperator): Added support for 
9501         "U operator - (E x, E y)"
9502
9503         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
9504         y)".
9505
9506         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
9507         init-only variables, but this path did not take into account that
9508         there might be also instance readonly variables.  Correct this
9509         problem. 
9510
9511         This fixes bug 32253
9512
9513         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
9514         delegates as well.
9515
9516         * driver.cs: Change the extension for modules to `netmodule'
9517
9518         * cs-parser.jay: Improved slightly the location tracking for
9519         the debugger symbols.
9520
9521         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
9522         modifiers that were specified instead of the hardcoded value
9523         (FamAndAssem).  This was basically ignoring the static modifier,
9524         and others.  Fixes 32429.
9525
9526         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
9527         fixed a bug in the process (32476)
9528
9529         * expression.cs (ArrayAccess.EmitAssign): Patch from
9530         hwang_rob@yahoo.ca that fixes bug 31834.3
9531
9532 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
9533
9534         * driver.cs: Make the module extension .netmodule.
9535
9536 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
9537
9538         * driver.cs: Report an error if the resource file is not found
9539         instead of crashing.
9540
9541         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
9542         false, like Emit does.
9543
9544 2002-10-16  Nick Drochak  <ndrochak@gol.com>
9545
9546         * typemanager.cs: Remove unused private member.  Also reported mcs
9547         bug to report this as a warning like csc.
9548
9549 2002-10-15  Martin Baulig  <martin@gnome.org>
9550
9551         * statement.cs (Statement.Emit): Made this a virtual method; emits
9552         the line number info and calls DoEmit().
9553         (Statement.DoEmit): New protected abstract method, formerly knows
9554         as Statement.Emit().
9555
9556         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
9557
9558 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
9559
9560         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
9561         have fixed a remaining problem: not every AddXXXX was adding a
9562         fully qualified name.  
9563
9564         Now everyone registers a fully qualified name in the DeclSpace as
9565         being defined instead of the partial name.  
9566
9567         Downsides: we are slower than we need to be due to the excess
9568         copies and the names being registered this way.  
9569
9570         The reason for this is that we currently depend (on the corlib
9571         bootstrap for instance) that types are fully qualified, because
9572         we dump all the types in the namespace, and we should really have
9573         types inserted into the proper namespace, so we can only store the
9574         basenames in the defined_names array.
9575
9576 2002-10-10  Martin Baulig  <martin@gnome.org>
9577
9578         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
9579         from bug #31834, see the bug report for a testcase which is
9580         miscompiled.
9581
9582 2002-10-10  Martin Baulig  <martin@gnome.org>
9583
9584         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
9585         flow analysis code for this.
9586
9587         * statement.cs (Do, While, For): Tell the flow analysis code about
9588         infinite loops.
9589         (FlowBranching.UsageVector): Added support for infinite loops.
9590         (Block.Resolve): Moved the dead code elimination here and use flow
9591         analysis to do it.
9592
9593 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
9594
9595         * class.cs (Field.Define): Catch cycles on struct type
9596         definitions. 
9597
9598         * typemanager.cs (IsUnmanagedtype): Do not recursively check
9599         fields if the fields are static.  We only need to check instance
9600         fields. 
9601
9602         * expression.cs (As.DoResolve): Test for reference type.
9603
9604         * statement.cs (Using.ResolveExpression): Use
9605         ConvertImplicitRequired, not ConvertImplicit which reports an
9606         error on failture
9607         (Using.ResolveLocalVariableDecls): ditto.
9608
9609         * expression.cs (Binary.ResolveOperator): Report errors in a few
9610         places where we had to.
9611
9612         * typemanager.cs (IsUnmanagedtype): Finish implementation.
9613
9614 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
9615
9616         * expression.cs: Use StoreFromPtr instead of extracting the type
9617         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
9618
9619         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
9620         an enumeration value to a System.Enum, but System.Enum is not a
9621         value type, but an class type, so we need to box.
9622
9623         (Expression.ConvertExplicit): One codepath could return
9624         errors but not flag them.  Fix this.  Fixes #31853
9625
9626         * parameter.cs (Resolve): Do not allow void as a parameter type.
9627
9628 2002-10-06  Martin Baulig  <martin@gnome.org>
9629
9630         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
9631         if it's a class type and not a struct.  Fixes #31815.
9632
9633 2002-10-06  Martin Baulig  <martin@gnome.org>
9634
9635         * statement.cs: Reworked the flow analysis code a bit to make it
9636         usable for dead code elimination.
9637
9638 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9639
9640         * cs-parser.jay: allow empty source files. Fixes bug #31781.
9641
9642 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9643
9644         * expression.cs (ComposedCast.DoResolveType): A quick workaround
9645         to fix the test 165, will investigate deeper.
9646
9647 2002-10-04  Martin Baulig  <martin@gnome.org>
9648
9649         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
9650         finally blocks actually work.
9651         (Try.Resolve): We don't need to create a sibling for `finally' if
9652         there is no finally block.
9653
9654 2002-10-04  Martin Baulig  <martin@gnome.org>
9655
9656         * class.cs (Constructor.Define): The default accessibility for a
9657         non-default constructor is private, not public.
9658
9659 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9660
9661         * class.cs (Constructor): Make AllowedModifiers public, add
9662         EXTERN.
9663
9664         * cs-parser.jay: Perform the modifiers test here, as the
9665         constructor for the Constructor class usually receives a zero
9666         because of the way we create it (first we create, later we
9667         customize, and we were never checking the modifiers).
9668
9669         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
9670         is a version of LookupTypeReflection that includes the type-name
9671         cache.  This can be used as a fast path for functions that know
9672         the fully qualified name and are only calling into *.GetType() to
9673         obtain a composed type.
9674
9675         This is also used by TypeManager.LookupType during its type
9676         composition.
9677
9678         (LookupType): We now also track the real type name, as sometimes
9679         we can get a quey for the real type name from things like
9680         ComposedCast.  This fixes bug 31422.
9681
9682         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
9683         complete type fullname, it does not have to go through the type
9684         resolution system to obtain the composed version of the type (for
9685         obtaining arrays or pointers).
9686
9687         (Conditional.Emit): Use the EmitBoolExpression to
9688         generate nicer code, as requested by Paolo.
9689
9690         (ArrayCreation.CheckIndices): Use the patch from
9691         hwang_rob@yahoo.ca to validate the array initializers. 
9692
9693 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
9694
9695         * class.cs (ConstructorInitializer.Emit): simplify code by using
9696         Invocation.EmitCall, and at the same time, fix the bugs in calling
9697         parent constructors that took variable arguments. 
9698
9699         * ecore.cs (Expression.ConvertNumericExplicit,
9700         Expression.ImplicitNumericConversion): Remove the code that
9701         manually wrapped decimal (InternalTypeConstructor call is now gone
9702         as well).
9703
9704         * expression.cs (Cast.TryReduce): Also handle decimal types when
9705         trying to perform a constant fold on the type.
9706
9707         * typemanager.cs (IsUnmanagedtype): Partially implemented.
9708
9709         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
9710         that only turned off an error report, and did nothing else. 
9711
9712 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
9713
9714         * driver.cs: Handle and ignore /fullpaths
9715
9716 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
9717
9718         * expression.cs (Binary.ResolveOperator): Catch the case where
9719         DoNumericPromotions returns true, 
9720
9721         (Binary.DoNumericPromotions): Simplify the code, and the tests.
9722
9723 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
9724
9725         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
9726         report error 70.
9727
9728 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
9729
9730         * ecore.cs (ConvertNumericExplicit): It is not enough that the
9731         conversion exists, but it is also required that the conversion be
9732         performed.  This manifested in "(Type64Enum) 2".  
9733
9734         * class.cs (TypeManager.AddMethod): The fix is not to change
9735         AddEnum, because that one was using a fully qualified name (every
9736         DeclSpace derivative does), but to change the AddMethod routine
9737         that was using an un-namespaced name.  This now correctly reports
9738         the duplicated name.
9739
9740         Revert patch until I can properly fix it.  The issue
9741         is that we have a shared Type space across all namespaces
9742         currently, which is wrong.
9743
9744         Options include making the Namespace a DeclSpace, and merge
9745         current_namespace/current_container in the parser.
9746
9747 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
9748
9749         * cs-parser.jay: Improve error reporting when we get a different
9750         kind of expression in local_variable_type and
9751         local_variable_pointer_type. 
9752
9753         Propagate this to avoid missleading errors being reported.
9754
9755         * ecore.cs (ImplicitReferenceConversion): treat
9756         TypeManager.value_type as a target just like object_type.   As
9757         code like this:
9758
9759         ValueType v = 1;
9760
9761         Is valid, and needs to result in the int 1 being boxed before it
9762         is assigned to the value type v.
9763
9764         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
9765         to validate the enumeration name.
9766
9767         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
9768         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
9769         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9770
9771         * ecore.cs (TryImplicitIntConversion): When doing an
9772         implicit-enumeration-conversion, check if the type is 64-bits and
9773         perform a conversion before passing to EnumConstant.
9774
9775 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9776
9777         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9778         report ambiguous type references.  Unlike the MS version, we
9779         report what the ambiguity is.   Innovation at work ;-)
9780
9781         (DeclSpace.FindType): Require a location argument to
9782         display when we display an ambiguous error.
9783
9784         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9785
9786         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9787
9788         * expression.cs (EmitDynamicInitializers): Apply patch from
9789         hwang_rob@yahoo.ca that fixes the order in which we emit our
9790         initializers. 
9791
9792 2002-09-21  Martin Baulig  <martin@gnome.org>
9793
9794         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9795         delegate takes no arguments.
9796
9797 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9798
9799         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9800         from integers.
9801
9802         * expression.cs: Extract the underlying type.
9803
9804         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9805
9806         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9807
9808 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9809
9810         * class.cs (TypeContainer.DefineType): We can not use the nice
9811         PackingSize with the size set to 1 DefineType method, because it
9812         will not allow us to define the interfaces that the struct
9813         implements.
9814
9815         This completes the fixing of bug 27287
9816
9817         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9818         means also structs.  This fixes part of the problem. 
9819         (Expresion.ImplicitReferenceConversionExists): ditto.
9820
9821         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9822         error if there were no errors reported during the type lookup
9823         process, to avoid duplicates or redundant errors.  Without this
9824         you would get an ambiguous errors plus a type not found.  We have
9825         beaten the user enough with the first error.  
9826
9827         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9828         reference. 
9829
9830         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9831         during the resolution process, stop the lookup, this avoids
9832         repeated error reports (same error twice).
9833
9834         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9835
9836         * typemanager.cs (LookupType): Redo the type lookup code to match
9837         the needs of System.Reflection.  
9838
9839         The issue is that System.Reflection requires references to nested
9840         types to begin with a "+" sign instead of a dot.  So toplevel
9841         types look like: "NameSpace.TopLevelClass", and nested ones look
9842         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9843         levels. 
9844
9845 2002-09-19  Martin Baulig  <martin@gnome.org>
9846
9847         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9848         says that a method always returns or always throws an exception,
9849         don't report the CS0161.
9850
9851         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9852         set `Returns = new_returns'.
9853
9854 2002-09-19  Martin Baulig  <martin@gnome.org>
9855
9856         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9857         to an enum constant, check for a CS0176.
9858
9859 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9860
9861         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9862         for operators that must be in pairs and report errors.
9863
9864         * ecore.cs (SimpleName.DoResolveType): During the initial type
9865         resolution process, when we define types recursively, we must
9866         check first for types in our current scope before we perform
9867         lookups in the enclosing scopes.
9868
9869         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9870
9871         (Invocation.VerifyArgumentsCompat): Call
9872         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9873         I thought we were supposed to always call this, but there are a
9874         few places in the code where we dont do it.
9875
9876 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9877
9878         * driver.cs: Add support in -linkres and -resource to specify the
9879         name of the identifier.
9880
9881 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9882
9883         * ecore.cs (StandardConversionExists): Sync with the conversion
9884         code: allow anything-* to void* conversions.
9885
9886         (FindMostSpecificSource): Use an Expression argument
9887         instead of a Type, because we might be handed over a Literal which
9888         gets a few more implicit conversions that plain types do not.  So
9889         this information was being lost.
9890
9891         Also, we drop the temporary type-holder expression when not
9892         required.
9893
9894 2002-09-17  Martin Baulig  <martin@gnome.org>
9895
9896         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9897         this is an explicit interface implementation.
9898
9899 2002-09-17  Martin Baulig  <martin@gnome.org>
9900
9901         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9902         different `IndexerName' attributes.
9903
9904         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9905         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9906         virtual CommonResolve().
9907
9908 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9909
9910         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9911         and convert that to the UnderlyingType.
9912
9913         * statement.cs (Foreach.Resolve): Indexers are just like variables
9914         or PropertyAccesses.
9915
9916         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9917         inside quoted strings, we were not doing this before.
9918
9919 2002-09-16  Martin Baulig  <martin@gnome.org>
9920
9921         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9922         resolve it.  This is needed for the definite assignment check of the
9923         instance expression, fixes bug #29846.
9924         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9925
9926 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9927
9928         * parameter.cs: Fix compile error.  Cannot reference static member
9929         from an instance object.  Is this an mcs bug?
9930
9931 2002-09-14  Martin Baulig  <martin@gnome.org>
9932
9933         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9934         multiple times.  Fixes bug #30295, added test-166.cs.
9935
9936 2002-09-14  Martin Baulig  <martin@gnome.org>
9937
9938         * statement.cs (Block.Emit): Don't emit unreachable code.
9939         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9940         `break' statements.
9941         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9942
9943 2002-09-14  Martin Baulig  <martin@gnome.org>
9944
9945         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9946         is set.
9947
9948 2002-09-14  Martin Baulig  <martin@gnome.org>
9949
9950         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9951         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9952         be false on the ms runtime.
9953
9954 2002-09-13  Martin Baulig  <martin@gnome.org>
9955
9956         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9957         the CS0038 error message.
9958
9959 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9960
9961         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9962         constant inside, return it.
9963
9964 2002-09-12  Martin Baulig  <martin@gnome.org>
9965
9966         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9967         implicit conversion can be done between enum types.
9968
9969         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9970         check whether an implicit conversion to the current enum's UnderlyingType
9971         exists and report an error if not.
9972
9973         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9974         without debugging support.
9975
9976         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9977         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9978
9979 2002-09-12  Martin Baulig  <martin@gnome.org>
9980
9981         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9982
9983         * ecore.cs (IMemberExpr.DeclaringType): New property.
9984         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9985         nonstatic member of an outer type (CS0038).
9986
9987 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9988
9989         * driver.cs: Activate the using-error detector at warning level
9990         4 (at least for MS-compatible APIs).
9991
9992         * namespace.cs (VerifyUsing): Small buglett fix.
9993
9994         * pending.cs (PendingImplementation): pass the container pointer. 
9995
9996         * interface.cs (GetMethods): Allow for recursive definition.  Long
9997         term, I would like to move every type to support recursive
9998         definitions, not the current ordering mechanism that we have right
9999         now.
10000
10001         The situation is this: Attributes are handled before interfaces,
10002         so we can apply attributes to interfaces.  But some attributes
10003         implement interfaces, we will now handle the simple cases
10004         (recursive definitions will just get an error).  
10005
10006         * parameter.cs: Only invalidate types at the end if we fail to
10007         lookup all types.  
10008
10009 2002-09-09  Martin Baulig  <martin@gnome.org>
10010
10011         * ecore.cs (PropertyExpr.Emit): Also check for
10012         TypeManager.system_int_array_get_length so this'll also work when
10013         compiling corlib.  Fixes #30003.
10014
10015 2002-09-09  Martin Baulig  <martin@gnome.org>
10016
10017         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
10018         and throw an exception if we can't get the type's size.  Fixed #30040,
10019         added test-165.cs.
10020
10021 2002-09-09  Martin Baulig  <martin@gnome.org>
10022
10023         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
10024
10025         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
10026         context.  Fixes bug #30027.
10027
10028         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
10029         virtual functions.  Fixes bug #30043, added test-164.cs.
10030
10031 2002-09-08  Ravi Pratap  <ravi@ximian.com>
10032
10033         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
10034
10035 2002-09-08  Nick Drochak  <ndrochak@gol.com>
10036
10037         * driver.cs: Use an object to get the windows codepage since it's not a
10038         static property.
10039
10040 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
10041
10042         * statement.cs (For.Emit): for infinite loops (test == null)
10043         return whether there is a break inside, not always "true".
10044
10045         * namespace.cs (UsingEntry): New struct to hold the name of the
10046         using definition, the location where it is defined, and whether it
10047         has been used in a successful type lookup.
10048
10049         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
10050         strings.
10051
10052         * decl.cs: ditto.
10053
10054 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10055
10056         * attribute.cs : Fix incorrect code which relied on catching
10057         a NullReferenceException to detect a null being passed in
10058         where an object was expected.
10059
10060 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
10061
10062         * statement.cs (Try): flag the catch variable as assigned
10063
10064         * expression.cs (Cast): Simplified by using ResolveType instead of
10065         manually resolving.
10066
10067         * statement.cs (Catch): Fix bug by using ResolveType.
10068
10069 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10070
10071         * expression.cs (BetterConversion): Special case for when we have
10072         a NullLiteral as the argument and we have to choose between string
10073         and object types - we choose string the way csc does.
10074
10075         * attribute.cs (Attribute.Resolve): Catch the
10076         NullReferenceException and report error #182 since the Mono
10077         runtime no more has the bug and having this exception raised means
10078         we tried to select a constructor which takes an object and is
10079         passed a null.
10080
10081 2002-09-05  Ravi Pratap  <ravi@ximian.com>
10082
10083         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
10084         message (1502, 1503) when we can't locate a method after overload
10085         resolution. This is much more informative and closes the bug
10086         Miguel reported.
10087
10088         * interface.cs (PopulateMethod): Return if there are no argument
10089         types. Fixes a NullReferenceException bug.
10090
10091         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
10092         expressions too. Previously we were checking only in one place for
10093         positional arguments leaving out named arguments.
10094
10095         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
10096         type to the enum type is not allowed. Remove code corresponding to
10097         that.
10098
10099         (ConvertNumericExplicit): Allow explicit conversions from
10100         the underlying type to enum type. This precisely follows the spec
10101         and closes a bug filed by Gonzalo.
10102
10103 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10104
10105         * compiler.csproj:
10106         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
10107
10108 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
10109
10110         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
10111         it was important that we stored the right value after the
10112         reduction in `converted'.
10113
10114 2002-09-04  Martin Baulig  <martin@gnome.org>
10115
10116         * location.cs (Location.SymbolDocument): Use full pathnames for the
10117         source files.
10118
10119 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
10120
10121         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
10122         of the expression resolve mechanism, because that will catch the
10123         SimpleName error failures.
10124
10125         (Conditional): If we can not resolve the
10126         expression, return, do not crash.
10127
10128 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10129
10130         * cs-tokenizer.cs:
10131         (location): display token name instead of its number.
10132
10133 2002-08-28  Martin Baulig  <martin@gnome.org>
10134
10135         * expression.cs (Binary.ResolveOperator): Don't silently return
10136         but return an error if an operator cannot be applied between two
10137         enum types.
10138
10139 2002-08-28  Martin Baulig  <martin@gnome.org>
10140
10141         * class.cs (Constructor.Define): Set the permission attributes
10142         correctly instead of making all constructors public.
10143
10144 2002-08-28  Martin Baulig  <martin@gnome.org>
10145
10146         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
10147         for private members before reporting a CS0103; if we find anything,
10148         it's a CS0122.
10149
10150 2002-08-28  Martin Baulig  <martin@gnome.org>
10151
10152         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
10153         to check whether `closure_start_type == closure_invocation_type',
10154         we also need to check whether `m.DeclaringType == closure_invocation_type'
10155         before bypassing the permission checks.  We might be accessing
10156         protected/private members from the base class.
10157         (TypeManager.RealMemberLookup): Only set private_ok if private
10158         members were requested via BindingFlags.NonPublic.
10159
10160         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
10161
10162         * expression.cs (MemberAccess.ResolveMemberAccess): Set
10163         MethodGroupExpr.IsExplicitImpl if appropriate.
10164         (Invocation.DoResolve): Don't report the CS0120 for explicit
10165         interface implementations.
10166
10167 2002-08-27  Martin Baulig  <martin@gnome.org>
10168
10169         * expression.cs (Invocation.DoResolve): If this is a static
10170         method and we don't have an InstanceExpression, we must report
10171         a CS0120.
10172
10173 2002-08-25  Martin Baulig  <martin@gnome.org>
10174
10175         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
10176         `==' between a valuetype and an object.
10177
10178 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
10179
10180         * ecore.cs (TypeExpr): Provide a ToString method.
10181
10182 2002-08-24  Martin Baulig  <martin@gnome.org>
10183
10184         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
10185         now called proggie.dbg and it's a binary file.
10186
10187 2002-08-23  Martin Baulig  <martin@gnome.org>
10188
10189         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
10190
10191 2002-08-23  Martin Baulig  <martin@gnome.org>
10192
10193         * struct.cs (MyStructInfo.ctor): Make this work with empty
10194         structs; it's not allowed to use foreach() on null.
10195
10196 2002-08-23  Martin Baulig  <martin@gnome.org>
10197
10198         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
10199         writer the full pathname of the generated assembly.
10200
10201 2002-08-23  Martin Baulig  <martin@gnome.org>
10202
10203         * statements.cs (FlowBranching.UsageVector.MergeChildren):
10204         A `finally' block never returns or breaks; improved handling of
10205         unreachable code.
10206
10207 2002-08-23  Martin Baulig  <martin@gnome.org>
10208
10209         * statement.cs (Throw.Resolve): Allow `throw null'.
10210
10211 2002-08-23  Martin Baulig  <martin@gnome.org>
10212
10213         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
10214         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
10215         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
10216         MemberLookup would return a wrong event if this is an explicit
10217         interface implementation and the class has an event with the same
10218         name.
10219
10220 2002-08-23  Martin Baulig  <martin@gnome.org>
10221
10222         * statement.cs (Block.AddChildVariableNames): New public method.
10223         (Block.AddChildVariableName): Likewise.
10224         (Block.IsVariableNameUsedInChildBlock): Likewise.
10225         (Block.AddVariable): Check whether a variable name has already
10226         been used in a child block.
10227
10228         * cs-parser.jay (declare_local_variables): Mark all variable names
10229         from the current block as being used in a child block in the
10230         implicit block.
10231
10232 2002-08-23  Martin Baulig  <martin@gnome.org>
10233
10234         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
10235         find the symbol writer.
10236
10237         * driver.cs: csc also allows the arguments to /define being
10238         separated by commas, not only by semicolons.
10239
10240 2002-08-23  Martin Baulig  <martin@gnome.org>
10241
10242         * interface.cs (Interface.GetMembers): Added static check for events.
10243
10244 2002-08-15  Martin Baulig  <martin@gnome.org>
10245
10246         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
10247         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
10248
10249         * ecore.cs (Expression.MemberLookup): Added documentation and explained
10250         why the MethodData.EmitDestructor() change was necessary.
10251
10252 2002-08-20  Martin Baulig  <martin@gnome.org>
10253
10254         * class.cs (TypeContainer.FindMembers): Added static check for events.
10255
10256         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
10257
10258         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
10259         use Type.GetEvents(), not Type.FindMembers().
10260
10261 2002-08-20  Martin Baulig  <martin@gnome.org>
10262
10263         * decl.cs (MemberCache): Added a special method cache which will
10264         be used for method-only searched.  This ensures that a method
10265         search will return a MethodInfo with the correct ReflectedType for
10266         inherited methods.      
10267
10268 2002-08-20  Martin Baulig  <martin@gnome.org>
10269
10270         * decl.cs (DeclSpace.FindMembers): Made this public.
10271
10272 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10273
10274         * delegate.cs: fixed build on windows.
10275         [FIXME:  Filed as bug #29150: MCS must report these errors.]
10276
10277 2002-08-19  Ravi Pratap  <ravi@ximian.com>
10278
10279         * ecore.cs (StandardConversionExists): Return a false
10280         if we are trying to convert the void type to anything else
10281         since that is not allowed.
10282
10283         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
10284         we flag error 70 in the event an event is trying to be accessed
10285         directly from outside the declaring type.
10286
10287 2002-08-20  Martin Baulig  <martin@gnome.org>
10288
10289         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
10290         MemberCache from typemanager.cs to decl.cs.
10291
10292 2002-08-19  Martin Baulig  <martin@gnome.org>
10293
10294         * class.cs (TypeContainer): Implement IMemberContainer.
10295         (TypeContainer.DefineMembers): Create the MemberCache.
10296         (TypeContainer.FindMembers): Do better BindingFlags checking; only
10297         return public members if BindingFlags.Public was given, check
10298         whether members are static.
10299
10300 2002-08-16  Martin Baulig  <martin@gnome.org>
10301
10302         * decl.cs (DeclSpace.Define): Splitted this in Define and
10303         DefineMembers.  DefineMembers is called first and initializes the
10304         MemberCache.
10305
10306         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
10307         DefineMembers() on all our DeclSpaces.
10308
10309         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
10310         but call DefineMembers() on all nested interfaces.  We call their
10311         Define() in our new Define() function.
10312
10313         * interface.cs (Interface): Implement IMemberContainer.
10314         (Interface.Define): Moved all code except the attribute stuf to
10315         DefineMembers().
10316         (Interface.DefineMembers): Initialize the member cache.
10317
10318         * typemanager.cs (IMemberFinder): Removed this interface, we don't
10319         need this anymore since we can use MemberCache.FindMembers directly.
10320
10321 2002-08-19  Martin Baulig  <martin@gnome.org>
10322
10323         * typemanager.cs (MemberCache): When creating the cache for an
10324         interface type, add all inherited members.
10325         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
10326         to `out bool used_cache' and documented it.
10327         (TypeManager.MemberLookup): If we already used the cache in the first
10328         iteration, we don't need to do the interfaces check.
10329
10330 2002-08-19  Martin Baulig  <martin@gnome.org>
10331
10332         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
10333         here from IMemberFinder and don't implement this interface anymore.
10334         (DeclSpace.MemberCache): Moved here from IMemberFinder.
10335
10336         * typemanager.cs (IMemberFinder): This interface is now only used by
10337         classes which actually support the member cache.
10338         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
10339         since we only put DeclSpaces into this Hashtable.
10340         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
10341         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
10342
10343 2002-08-16  Martin Baulig  <martin@gnome.org>
10344
10345         * typemanager.cs (ICachingMemberFinder): Removed.
10346         (IMemberFinder.MemberCache): New property.
10347         (TypeManager.FindMembers): Merged this with RealFindMembers().
10348         This function will never be called from TypeManager.MemberLookup()
10349         so we can't use the cache here, just the IMemberFinder.
10350         (TypeManager.MemberLookup_FindMembers): Check whether the
10351         IMemberFinder has a MemberCache and call the cache's FindMembers
10352         function.
10353         (MemberCache): Rewrote larger parts of this yet another time and
10354         cleaned it up a bit.
10355
10356 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
10357
10358         * driver.cs (LoadArgs): Support quoting.
10359
10360         (Usage): Show the CSC-like command line arguments.
10361
10362         Improved a few error messages.
10363
10364 2002-08-15  Martin Baulig  <martin@gnome.org>
10365
10366         * typemanager.cs (IMemberContainer.Type): New property.
10367         (IMemberContainer.IsInterface): New property.
10368
10369         The following changes are conditional to BROKEN_RUNTIME, which is
10370         defined at the top of the file.
10371
10372         * typemanager.cs (MemberCache.MemberCache): Don't add the base
10373         class'es members, but add all members from TypeHandle.ObjectType
10374         if we're an interface.
10375         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
10376         is the current type.
10377         (MemberCache.CacheEntry.Container): Removed this field.
10378         (TypeHandle.GetMembers): Include inherited members.
10379
10380 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10381
10382         * typemanager.cs: fixed compilation and added a comment on a field that
10383         is never used.
10384
10385 2002-08-15  Martin Baulig  <martin@gnome.org>
10386
10387         * class.cs (ConstructorInitializer.Resolve): In the
10388         Expression.MemberLookup call, use the queried_type as
10389         invocation_type.
10390
10391         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
10392         declared' attribute, it's always true.
10393         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
10394         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
10395         temporary wrapper for FindMembers which tells MemberLookup whether
10396         members from the base classes are included in the return value.
10397         This will go away soon.
10398         (TypeManager.MemberLookup): Use this temporary hack here; once the
10399         new MemberCache is completed, we don't need to do the DeclaredOnly
10400         looping here anymore since the MemberCache will take care of this.
10401         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
10402         (MemberCache): When creating the MemberCache for a class, get
10403         members from the current class and all its base classes.
10404         (MemberCache.CacheEntry.Container): New field.  This is a
10405         temporary hack until the Mono runtime is fixed to distinguish
10406         between ReflectedType and DeclaringType.  It allows us to use MCS
10407         with both the MS runtime and the unfixed Mono runtime without
10408         problems and without accecting performance.
10409         (MemberCache.SearchMembers): The DeclaredOnly looping from
10410         TypeManager.MemberLookup is now done here.      
10411
10412 2002-08-14  Martin Baulig  <martin@gnome.org>
10413
10414         * statement.cs (MyStructInfo.MyStructInfo): Don't call
10415         Type.GetFields on dynamic types but get the fields from the
10416         corresponding TypeContainer.
10417         (MyStructInfo.GetStructInfo): Added check for enum types.
10418
10419         * typemanager.cs (MemberList.IsSynchronized): Implemented.
10420         (MemberList.SyncRoot): Implemented.
10421         (TypeManager.FilterWithClosure): No need to check permissions if
10422         closure_start_type == closure_invocation_type, don't crash if
10423         closure_invocation_type is null.
10424
10425 2002-08-13  Martin Baulig  <martin@gnome.org>
10426
10427         Rewrote TypeContainer.FindMembers to use a member cache.  This
10428         gives us a speed increase of about 35% for the self-hosting MCS
10429         build and of about 15-20% for the class libs (both on GNU/Linux).
10430
10431         * report.cs (Timer): New class to get enhanced profiling.  This
10432         whole class is "TIMER" conditional since it remarkably slows down
10433         compilation speed.
10434
10435         * class.cs (MemberList): New class.  This is an IList wrapper
10436         which we're now using instead of passing MemberInfo[]'s around to
10437         avoid copying this array unnecessarily.
10438         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
10439         (ICachingMemberFinder, IMemberContainer): New interface.
10440         (TypeManager.FilterWithClosure): If `criteria' is null, the name
10441         has already been checked, otherwise use it for the name comparision.
10442         (TypeManager.FindMembers): Renamed to RealMemberFinder and
10443         provided wrapper which tries to use ICachingMemberFinder.FindMembers
10444         if possible.  Returns a MemberList, not a MemberInfo [].
10445         (TypeHandle): New class, implements IMemberContainer.  We create
10446         one instance of this class per type, it contains a MemberCache
10447         which is used to do the member lookups.
10448         (MemberCache): New class.  Each instance of this class contains
10449         all members of a type and a name-based hash table.
10450         (MemberCache.FindMembers): This is our new member lookup
10451         function.  First, it looks up all members of the requested name in
10452         the hash table.  Then, it walks this list and sorts out all
10453         applicable members and returns them.
10454
10455 2002-08-13  Martin Baulig  <martin@gnome.org>
10456
10457         In addition to a nice code cleanup, this gives us a performance
10458         increase of about 1.4% on GNU/Linux - not much, but it's already
10459         half a second for the self-hosting MCS compilation.
10460
10461         * typemanager.cs (IMemberFinder): New interface.  It is used by
10462         TypeManager.FindMembers to call FindMembers on a TypeContainer,
10463         Enum, Delegate or Interface.
10464         (TypeManager.finder_to_member_finder): New PtrHashtable.
10465         (TypeManager.finder_to_container): Removed.
10466         (TypeManager.finder_to_delegate): Removed.
10467         (TypeManager.finder_to_interface): Removed.
10468         (TypeManager.finder_to_enum): Removed.
10469
10470         * interface.cs (Interface): Implement IMemberFinder.
10471
10472         * delegate.cs (Delegate): Implement IMemberFinder.
10473
10474         * enum.cs (Enum): Implement IMemberFinder.
10475
10476         * class.cs (TypeContainer): Implement IMemberFinder.
10477
10478 2002-08-12  Martin Baulig  <martin@gnome.org>
10479
10480         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
10481
10482 2002-08-12  Martin Baulig  <martin@gnome.org>
10483
10484         * ecore.cs (ITypeExpression): New interface for expressions which
10485         resolve to a type.
10486         (TypeExpression): Renamed to TypeLookupExpression.
10487         (Expression.DoResolve): If we're doing a types-only lookup, the
10488         expression must implement the ITypeExpression interface and we
10489         call DoResolveType() on it.
10490         (SimpleName): Implement the new ITypeExpression interface.
10491         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
10492         hack, the situation that we're only looking up types can't happen
10493         anymore when this method is called.  Moved the type lookup code to
10494         DoResolveType() and call it.
10495         (SimpleName.DoResolveType): This ITypeExpression interface method
10496         is now doing the types-only lookup.
10497         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
10498         (ResolveFlags): Added MaskExprClass.
10499
10500         * expression.cs (MemberAccess): Implement the ITypeExpression
10501         interface.
10502         (MemberAccess.DoResolve): Added support for a types-only lookup
10503         when we're called via ITypeExpression.DoResolveType().
10504         (ComposedCast): Implement the ITypeExpression interface.
10505
10506         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
10507         Expression.Resolve() with ResolveFlags.Type instead.
10508
10509 2002-08-12  Martin Baulig  <martin@gnome.org>
10510
10511         * interface.cs (Interface.Define): Apply attributes.
10512
10513         * attribute.cs (Attribute.ApplyAttributes): Added support for
10514         interface attributes.
10515
10516 2002-08-11  Martin Baulig  <martin@gnome.org>
10517
10518         * statement.cs (Block.Emit): Only check the "this" variable if we
10519         do not always throw an exception.
10520
10521         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
10522         whether the property has a set accessor.
10523
10524 2002-08-11  Martin Baulig  <martin@gnome.org>
10525
10526         Added control flow analysis support for structs.
10527
10528         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
10529         with control flow analysis turned off.
10530         (IVariable): New interface.
10531         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
10532         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
10533         (FieldExpr.DoResolve): Resolve the instance expression with flow
10534         analysis turned off and do the definite assignment check after the
10535         resolving when we know what the expression will resolve to.
10536
10537         * expression.cs (LocalVariableReference, ParameterReference):
10538         Implement the new IVariable interface, only call the flow analysis
10539         code if ec.DoFlowAnalysis is true.
10540         (This): Added constructor which takes a Block argument.  Implement
10541         the new IVariable interface.
10542         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
10543         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
10544         This does the definite assignment checks for struct members.
10545
10546         * class.cs (Constructor.Emit): If this is a non-static `struct'
10547         constructor which doesn't have any initializer, call
10548         Block.AddThisVariable() to tell the flow analysis code that all
10549         struct elements must be initialized before control returns from
10550         the constructor.
10551
10552         * statement.cs (MyStructInfo): New public class.
10553         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
10554         argument to this indexer.  If non-zero, check an individual struct
10555         member, not the whole struct.
10556         (FlowBranching.CheckOutParameters): Check struct members.
10557         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
10558         overloaded versions of these methods which take an additional
10559         `int field_idx' argument to check struct members.
10560         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
10561         overloaded versions of these methods which take an additional
10562         `string field_name' argument to check struct member.s
10563         (VariableInfo): Implement the IVariable interface.
10564         (VariableInfo.StructInfo): New public property.  Returns the
10565         MyStructInfo instance of the variable if it's a struct or null.
10566         (Block.AddThisVariable): New public method.  This is called from
10567         Constructor.Emit() for non-static `struct' constructor which do
10568         not have any initializer.  It creates a special variable for the
10569         "this" instance variable which will be checked by the flow
10570         analysis code to ensure that all of the struct's fields are
10571         initialized before control returns from the constructor.
10572         (UsageVector): Added support for struct members.  If a
10573         variable/parameter is a struct with N members, we reserve a slot
10574         in the usage vector for each member.  A struct is considered fully
10575         initialized if either the struct itself (slot 0) or all its
10576         members are initialized.
10577
10578 2002-08-08  Martin Baulig  <martin@gnome.org>
10579
10580         * driver.cs (Driver.MainDriver): Only report an error CS5001
10581         if there were no compilation errors.
10582
10583         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
10584         `UnsafeContext' property to determine whether the parent is in
10585         unsafe context rather than checking the parent's ModFlags:
10586         classes nested in an unsafe class are unsafe as well.
10587
10588 2002-08-08  Martin Baulig  <martin@gnome.org>
10589
10590         * statement.cs (UsageVector.MergeChildren): Distinguish between
10591         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
10592         we return.  Added test17() and test18() to test-154.cs.
10593
10594 2002-08-08  Martin Baulig  <martin@gnome.org>
10595
10596         * typemanager.cs (TypeManager.FilterWithClosure): If we have
10597         Family access, make sure the invoking type isn't a subclass of the
10598         queried type (that'd be a CS1540).
10599
10600         * ecore.cs (Expression.MemberLookup): Added overloaded version of
10601         this method which takes an additional `Type invocation_type'.
10602
10603         * expression.cs (BaseAccess.DoResolve): Use the base type as
10604         invocation and query type.
10605         (MemberAccess.DoResolve): If the lookup failed and we're about to
10606         report a CS0122, try a lookup with the ec.ContainerType - if this
10607         succeeds, we must report a CS1540.
10608
10609 2002-08-08  Martin Baulig  <martin@gnome.org>
10610
10611         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
10612         (MethodGroupExpr): Implement the IMemberExpr interface.
10613
10614         * expression (MemberAccess.ResolveMemberAccess): No need to have
10615         any special code for MethodGroupExprs anymore, they're now
10616         IMemberExprs.   
10617
10618 2002-08-08  Martin Baulig  <martin@gnome.org>
10619
10620         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
10621         Family, FamANDAssem and FamORAssem permissions.
10622         (TypeManager.IsSubclassOrNestedChildOf): New public method.
10623
10624 2002-08-08  Martin Baulig  <martin@gnome.org>
10625
10626         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
10627         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
10628         or loop block.
10629
10630 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
10631
10632         * driver.cs: implemented /resource option to embed managed resources.
10633
10634 2002-08-07  Martin Baulig  <martin@gnome.org>
10635
10636         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
10637         (FieldBase.HasFieldInitializer): New public property.
10638         (FieldBase.GetInitializerExpression): New public method.  Resolves and
10639         returns the field initializer and makes sure it is only resolved once.
10640         (TypeContainer.EmitFieldInitializers): Call
10641         FieldBase.GetInitializerExpression to get the initializer, this ensures
10642         that it isn't resolved multiple times.
10643
10644         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
10645         the resolving process (SimpleName/MemberLookup) that we're currently
10646         emitting a field initializer (which must not access any instance members,
10647         this is an error CS0236).
10648
10649         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
10650         argument, if the `IsFieldInitializer' flag is set, we must report and
10651         error CS0236 and not an error CS0120.   
10652
10653 2002-08-07  Martin Baulig  <martin@gnome.org>
10654
10655         * ecore.cs (IMemberExpr): New public interface.
10656         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
10657         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
10658         if the expression is an IMemberExpr.
10659
10660         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
10661         to be null, implicitly default to `this' if we're non-static in
10662         this case.  Simplified the code a lot by using the new IMemberExpr
10663         interface.  Also fixed bug #28176 here.
10664
10665 2002-08-06  Martin Baulig  <martin@gnome.org>
10666
10667         * cs-parser.jay (SimpleLookup): Removed.  We need to create
10668         ParameterReferences during semantic analysis so that we can do a
10669         type-only search when resolving Cast, TypeOf and SizeOf.
10670         (block): Pass the `current_local_parameters' to the Block's
10671         constructor.
10672
10673         * class.cs (ConstructorInitializer): Added `Parameters parameters'
10674         argument to the constructor.
10675         (ConstructorInitializer.Resolve): Create a temporary implicit
10676         block with the parameters.
10677
10678         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
10679         references here if we aren't doing a type-only search.
10680
10681         * statement.cs (Block): Added constructor which takes a
10682         `Parameters parameters' argument.
10683         (Block.Parameters): New public property.
10684
10685         * support.cs (InternalParameters.Parameters): Renamed `parameters'
10686         to `Parameters' and made it public readonly.
10687
10688 2002-08-06  Martin Baulig  <martin@gnome.org>
10689
10690         * ecore.cs (Expression.Warning): Made this public as well.
10691
10692         * report.cs (Report.Debug): Print the contents of collections.
10693
10694 2002-08-06  Martin Baulig  <martin@gnome.org>
10695
10696         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
10697         used to tell Resolve() which kinds of expressions it may return.
10698         (Expression.Resolve): Added overloaded version of this method which
10699         takes a `ResolveFlags flags' argument.  This can be used to tell
10700         Resolve() which kinds of expressions it may return.  Reports a
10701         CS0118 on error.
10702         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
10703         ResolveFlags.SimpleName.
10704         (Expression.Error118): Added overloaded version of this method which
10705         takes a `ResolveFlags flags' argument.  It uses the flags to determine
10706         which kinds of expressions are allowed.
10707
10708         * expression.cs (Argument.ResolveMethodGroup): New public method.
10709         Resolves an argument, but allows a MethodGroup to be returned.
10710         This is used when invoking a delegate.
10711
10712         * TODO: Updated a bit.
10713
10714 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10715
10716         Fixed compilation with csc.
10717
10718         * ecore.cs: Expression.Error made public. Is this correct? Should
10719         Warning be made public too?
10720
10721         * expression.cs: use ea.Location instead of ea.loc.
10722         [FIXME:  Filed as bug #28607: MCS must report these errors.]
10723
10724 2002-08-06  Martin Baulig  <martin@gnome.org>
10725
10726         * ecore.cs (Expression.loc): Moved the location here instead of
10727         duplicating it in all derived classes.
10728         (Expression.Location): New public property.
10729         (Expression.Error, Expression.Warning): Made them non-static and
10730         removed the location argument.
10731         (Expression.Warning): Added overloaded version which takes an
10732         `int level' argument.
10733         (Expression.Error118): Make this non-static and removed the
10734         expression and location arguments.
10735         (TypeExpr): Added location argument to the constructor.
10736
10737         * expression.cs (StaticCallExpr): Added location argument to
10738         the constructor.
10739         (Indirection, PointerArithmetic): Likewise.
10740         (CheckedExpr, UnCheckedExpr): Likewise.
10741         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
10742         (StringPtr): Likewise.
10743
10744
10745 2002-08-05  Martin Baulig  <martin@gnome.org>
10746
10747         * expression.cs (BaseAccess.DoResolve): Actually report errors.
10748
10749         * assign.cs (Assign.DoResolve): Check whether the source
10750         expression is a value or variable.
10751
10752         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
10753         while resolving the corresponding blocks.
10754
10755         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
10756         an error, don't silently return null.
10757
10758         * statement.cs (Block.AddVariable): Do the error reporting here
10759         and distinguish between CS0128 and CS0136.
10760         (Block.DoResolve): Report all unused labels (warning CS0164).
10761         (LabeledStatement): Pass the location to the constructor.
10762         (LabeledStatement.HasBeenReferenced): New property.
10763         (LabeledStatement.Resolve): Set it to true here.
10764
10765         * statement.cs (Return.Emit): Return success even after reporting
10766         a type mismatch error (CS0126 or CS0127), this is what csc does and
10767         it avoids confusing the users with any consecutive errors.
10768
10769 2002-08-05  Martin Baulig  <martin@gnome.org>
10770
10771         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10772
10773         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10774
10775         * expression.cs (MemberAccess.DoResolve): Silently return if an
10776         error has already been reported.
10777
10778         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10779         error has already been reported.
10780
10781 2002-08-05  Martin Baulig  <martin@gnome.org>
10782
10783         * statement.cs (UsageVector): Only initialize the `parameters'
10784         vector if we actually have any "out" parameters.
10785
10786 2002-08-05  Martin Baulig  <martin@gnome.org>
10787
10788         * expression.cs (Binary.ResolveOperator): When combining delegates,
10789         they must have the same type.
10790
10791 2002-08-05  Martin Baulig  <martin@gnome.org>
10792
10793         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10794         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10795         work with the ms runtime and we also don't need it: if we're a
10796         PropertyBuilder and not in the `indexer_arguments' hash, then we
10797         are a property and not an indexer.
10798
10799         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10800         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10801         since the latter one doesn't work with the ms runtime.
10802
10803 2002-08-03  Martin Baulig  <martin@gnome.org>
10804
10805         Fixed bugs #27998 and #22735.
10806
10807         * class.cs (Method.IsOperator): New public field.
10808         (Method.CheckBase): Report CS0111 if there's already a method
10809         with the same parameters in the current class.  Report CS0508 when
10810         attempting to change the return type of an inherited method.
10811         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10812         and it's not marked abstract or extern.
10813         (PropertyBase): New abstract base class for Property and Indexer.
10814         (PropertyBase.CheckBase): Moved here from Property and made it work
10815         for indexers.
10816         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10817         the same so we can reuse it there.
10818         (Property, Indexer): Derive from PropertyBase.
10819         (MethodSignature.inheritable_property_signature_filter): New delegate
10820         to find properties and indexers.
10821
10822         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10823         argument and improved error reporting.
10824
10825         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10826         EmptyReadOnlyParameters and made it a property.
10827
10828         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10829         version of this method which takes a `PropertyInfo indexer'.
10830         (TypeManager.RegisterIndexer): New method.
10831
10832         * class.cs: Added myself as author of this file :-)
10833
10834 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10835
10836         * class.cs: fixed compilation on windoze.
10837
10838 2002-08-03  Martin Baulig  <martin@gnome.org>
10839
10840         * interface.cs (Interface.GetInterfaceBases): Check whether all
10841         base interfaces are at least as accessible than the current one.
10842
10843         * class.cs (TypeContainer.GetClassBases): Check whether base types
10844         are at least as accessible than the current type.
10845         (TypeContainer.AsAccessible): Implemented and made non-static.
10846         (MemberBase.CheckParameters): Report errors if the accessibility
10847         checks fail.
10848
10849         * delegate.cs (Delegate.Delegate): The default visibility is
10850         internal for top-level types and private for nested types.
10851         (Delegate.Define): Report errors if the accessibility checks fail.
10852
10853         * enum.cs (Enum.Enum): The default visibility is internal for
10854         top-level types and private for nested types.
10855         (Enum.DefineType): Compute the correct visibility.
10856
10857         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10858         function which takes a `bool is_toplevel' instead of a TypeContainer.
10859
10860         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10861         builtin type.
10862
10863 2002-08-02  Martin Baulig  <martin@gnome.org>
10864
10865         * expression.cs (LocalVariableReferenc): Added constructor which
10866         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10867         (LocalVariableReference.IsReadOnly): New property.
10868         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10869         variable is readonly, use our own readonly flag to do this; you can
10870         use the new constructor to get a writable reference to a read-only
10871         variable.
10872
10873         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10874         reference to the local variable.
10875
10876 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10877
10878         * rootcontext.cs (ResolveCore): Also include System.Exception
10879
10880         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10881         we reach an EmptyStatement.
10882
10883         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10884         is also fine.
10885
10886         * expression.cs (Binary.ResolveOperator): Check error result in
10887         two places.
10888
10889         use brtrue/brfalse directly and avoid compares to null.
10890
10891 2002-08-02  Martin Baulig  <martin@gnome.org>
10892
10893         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10894         Fixes bug #28407, added test-155.cs.
10895
10896 2002-08-01  Martin Baulig  <martin@gnome.org>
10897
10898         * class.cs (Event.EmitDefaultMethod): Make this work with static
10899         events.  Fixes #28311, added verify-3.cs.
10900
10901 2002-08-01  Martin Baulig  <martin@gnome.org>
10902
10903         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10904         `is_disposable' fields.
10905         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10906         `hm.is_disposable' if we're using the collection pattern.
10907         (Foreach.EmitCollectionForeach): Use the correct type for the
10908         enumerator's local variable, only emit the try/finally block if
10909         necessary (fixes #27713).
10910
10911 2002-08-01  Martin Baulig  <martin@gnome.org>
10912
10913         * ecore.cs (Expression.report118): Renamed to Error118 and made
10914         it public static.
10915
10916         * statement.cs (Throw.Resolve): Check whether the expression is of
10917         the correct type (CS0118) and whether the type derives from
10918         System.Exception (CS0155).
10919         (Catch.Resolve): New method.  Do the type lookup here and check
10920         whether it derives from System.Exception (CS0155).
10921         (Catch.CatchType, Catch.IsGeneral): New public properties.
10922
10923         * typemanager.cs (TypeManager.exception_type): Added.
10924
10925 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10926
10927         * driver.cs: Updated About function.
10928
10929 2002-07-31  Martin Baulig  <martin@gnome.org>
10930
10931         Implemented Control Flow Analysis.
10932
10933         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10934         (EmitContext.CurrentBranching): Added.
10935         (EmitContext.StartFlowBranching): Added.
10936         (EmitContext.EndFlowBranching): Added.
10937         (EmitContext.KillFlowBranching): Added.
10938         (EmitContext.IsVariableAssigned): Added.
10939         (EmitContext.SetVariableAssigned): Added.
10940         (EmitContext.IsParameterAssigned): Added.
10941         (EmitContext.SetParameterAssigned): Added.
10942         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10943         Added control flow analysis stuff here.
10944
10945         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10946         resolve the expression as lvalue.
10947         (LocalVariableReference.DoResolve): Check whether the variable has
10948         already been assigned.
10949         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10950         the parameter as assigned here.
10951         (ParameterReference.DoResolve): Check whether the parameter has already
10952         been assigned.
10953         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10954         expression as lvalue.
10955
10956         * statement.cs (FlowBranching): New class for the flow analysis code.
10957         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10958         (LabeledStatement.IsDefined): New public property.
10959         (LabeledStatement.AddUsageVector): New public method to tell flow
10960         analyis that the label may be reached via a forward jump.
10961         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10962         flow analysis.
10963         (VariableInfo.Number): New public field.  This is used by flow analysis
10964         to number all locals of a block.
10965         (Block.CountVariables): New public property.  This is the number of
10966         local variables in this block (including the locals from all parent
10967         blocks).
10968         (Block.EmitMeta): Number all the variables.
10969
10970         * statement.cs: Added flow analysis support to all classes.
10971
10972 2002-07-31  Martin Baulig  <martin@gnome.org>
10973
10974         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10975         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10976         then use this argument.
10977
10978         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10979
10980         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10981         use this to specify /define options.
10982
10983 2002-07-29  Martin Baulig  <martin@gnome.org>
10984
10985         * statement.cs (Fixed): Moved all code that does variable lookups
10986         and resolvings from Emit to Resolve.
10987
10988         * statement.cs (For): Moved all code that does variable lookups
10989         and resolvings from Emit to Resolve.
10990
10991         * statement.cs (Using): Moved all code that does variable lookups
10992         and resolvings from Emit to Resolve.
10993
10994 2002-07-29  Martin Baulig  <martin@gnome.org>
10995
10996         * attribute.cs (Attribute.Resolve): Explicitly catch a
10997         System.NullReferenceException when creating the
10998         CustromAttributeBuilder and report a different warning message.
10999
11000 2002-07-29  Martin Baulig  <martin@gnome.org>
11001
11002         * support.cs (ParameterData.ParameterName): Added method to
11003         get the name of a parameter.
11004
11005         * typemanager.cs (TypeManager.IsValueType): New public method.
11006
11007 2002-07-29  Martin Baulig  <martin@gnome.org>
11008
11009         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
11010         is a flag which specifies that it's either ref or out.
11011         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
11012         the out parameter to `out Parameter.Modifier mod', also set the
11013         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
11014
11015         * support.cs (InternalParameters.ParameterModifier): Distinguish
11016         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11017         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11018
11019         * expression.cs (Argument.GetParameterModifier): Distinguish
11020         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11021         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11022
11023 2002-07-29  Martin Baulig  <martin@gnome.org>
11024
11025         * expression.cs (ParameterReference.ParameterReference): Added
11026         `Location loc' argument to the constructor.
11027
11028         * cs-parser.jay: Pass location to ParameterReference.
11029
11030 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
11031
11032         * statement.cs (Try): Initialize the location.
11033
11034         * cs-parser.jay: pass location to Try.
11035
11036         * expression.cs (Unary.Reduce): Change the prototype to return
11037         whether a constant fold could be performed or not.  The result is
11038         returned in an out parameters.  In the case of Indirection and
11039         AddressOf, we want to perform the full tests.
11040
11041 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
11042
11043         * statement.cs (Statement.Emit): Flag dead code.
11044
11045 2002-07-27  Andrew Birkett  <andy@nobugs.org>
11046
11047         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
11048
11049 2002-07-27  Martin Baulig  <martin@gnome.org>
11050
11051         * class.cs (MethodData.Define): Put back call to
11052         TypeManager.AddMethod(), accidentally commented this out.
11053
11054         * report.cs (Debug): New public method to print debugging information,
11055         this is `[Conditional ("DEBUG")]'.
11056
11057 2002-07-26  Martin Baulig  <martin@gnome.org>
11058
11059         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
11060         (switch_statement): Push the current_block to the switch_stack and
11061         pop it again when we're done with the switch.
11062         (switch_section): The new block is a child of the current_block.
11063         Fixes bug #24007, added test-152.cs.
11064
11065 2002-07-27  Martin Baulig  <martin@gnome.org>
11066
11067         * expression.cs (Invocation.EmitArguments): When calling a varargs
11068         function with only its fixed arguments, we need to pass an empty
11069         array.
11070
11071 2002-07-27  Martin Baulig  <martin@gnome.org>
11072
11073         Mono 0.13 has been released.
11074
11075 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
11076
11077         * driver.cs: Rename --resource to --linkres, because that is what
11078         we do currently, we dont support --resource yet.
11079
11080         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
11081
11082 2002-07-25  Martin Baulig  <martin@gnome.org>
11083
11084         * class.cs (MethodData): New public class.  This is a `method builder'
11085         class for a method or one accessor of a Property/Indexer/Event.
11086         (MethodData.GetMethodFlags): Moved here from MemberBase.
11087         (MethodData.ApplyAttributes): Likewise.
11088         (MethodData.ApplyObsoleteAttribute): Likewise.
11089         (MethodData.ApplyConditionalAttribute): Likewise.
11090         (MethodData.ApplyDllImportAttribute): Likewise.
11091         (MethodData.CheckAbstractAndExternal): Likewise.
11092         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
11093         (MethodData.Emit): Formerly known as Method.Emit().
11094         (MemberBase): Moved everything which was specific to a single
11095         accessor/method to MethodData.
11096         (Method): Create a new MethodData and call Define() and Emit() on it.
11097         (Property, Indexer, Event): Create a new MethodData objects for each
11098         accessor and call Define() and Emit() on them.
11099
11100 2002-07-25  Martin Baulig  <martin@gnome.org>
11101
11102         Made MethodCore derive from MemberBase to reuse the code from there.
11103         MemberBase now also checks for attributes.
11104
11105         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
11106         (MemberBase.GetMethodFlags): Moved here from class Method and marked
11107         as virtual.
11108         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
11109         `CallingConventions cc' and `Attributes opt_attrs' arguments.
11110         (MemberBase.ApplyAttributes): New virtual method; applies the
11111         attributes to a method or accessor.
11112         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
11113         (MemberBase.ApplyConditionalAttribute): Likewise.
11114         (MemberBase.ApplyDllImportAttribute): Likewise.
11115         (MemberBase.CheckAbstractAndExternal): Likewise.
11116         (MethodCore.ParameterTypes): This is now a property instead of a
11117         method, it's initialized from DoDefineParameters().
11118         (MethodCore.ParameterInfo): Removed the set accessor.
11119         (MethodCore.DoDefineParameters): New protected virtual method to
11120         initialize ParameterTypes and ParameterInfo.
11121         (Method.GetReturnType): We can now simply return the MemberType.
11122         (Method.GetMethodFlags): Override the MemberBase version and add
11123         the conditional flags.
11124         (Method.CheckBase): Moved some code from Define() here, call
11125         DoDefineParameters() here.
11126         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
11127         here to avoid some larger code duplication.
11128         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
11129         ensure that abstract and external accessors don't declare a body.
11130
11131         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
11132         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
11133         lookup in the attribute's parent classes, so we need to abort as soon
11134         as we found the first match.
11135         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
11136         the attribute has no arguments.
11137
11138         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
11139         of a Method.
11140
11141 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11142
11143         * cs-parser.jay: reverted previous patch.
11144
11145 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11146
11147         * cs-parser.jay: fixed bug #22119.
11148
11149 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11150
11151         * attribute.cs: fixed compilation. The error was:
11152         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
11153         be assigned to before control leaves the current method."
11154         [FIXME:  Filed as bug #28186: MCS must report this error.]
11155
11156 2002-07-25  Martin Baulig  <martin@gnome.org>
11157
11158         * attribute.cs (Attribute.Conditional_GetConditionName): New static
11159         method to pull the condition name ouf of a Conditional attribute.
11160         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
11161         the obsolete message and error flag out of an Obsolete attribute.
11162
11163         * class.cs (Method.GetMethodFlags): New public method to get the
11164         TypeManager.MethodFlags for this method.
11165         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
11166         private methods.
11167         (Method.Define): Get and apply the Obsolete and Conditional attributes;
11168         if we're overriding a virtual function, set the new private variable
11169         `parent_method'; call the new TypeManager.AddMethod().
11170
11171         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
11172         the MethodBuilder and the Method in a PtrHashtable.
11173         (TypeManager.builder_to_method): Added for this purpose.
11174         (TypeManager.MethodFlags): Added IsObsoleteError.
11175         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
11176         Obsolete and Conditional arguments in MethodBuilders.  If we discover
11177         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
11178         the message from the attribute.
11179
11180 2002-07-24  Martin Baulig  <martin@gnome.org>
11181
11182         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
11183         preprocessor directives, ensure that the argument to #define/#undef is
11184         exactly one identifier and that it's actually an identifier.
11185
11186         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
11187         did not work ....
11188
11189 2002-07-24  Martin Baulig  <martin@gnome.org>
11190
11191         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
11192         initialize it to TypeManager.object_type in the constructor.
11193         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
11194         of the `hm.get_current' method if we're using the collection pattern.
11195         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
11196         for the explicit conversion to make it work when we're using the collection
11197         pattern and the `Current' property has a different return type than `object'.
11198         Fixes #27713.
11199
11200 2002-07-24  Martin Baulig  <martin@gnome.org>
11201
11202         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
11203         does not match, but don't report any errors.  This method is called in
11204         order for all methods in a MethodGroupExpr until a matching method is
11205         found, so we don't want to bail out if the first method doesn't match.
11206         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
11207         matches, report the 123.  Fixes #28070.
11208
11209 2002-07-24  Martin Baulig  <martin@gnome.org>
11210
11211         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
11212         TypeManager.TypeToCoreType() to the top of the method so the
11213         following equality checks will work.  Fixes #28107.
11214
11215 2002-07-24  Martin Baulig  <martin@gnome.org>
11216
11217         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
11218         operand is of type uint, and the other operand is of type sbyte,
11219         short or int, the operands are converted to type long." -
11220         Actually do what this comment already told us.  Fixes bug #28106,
11221         added test-150.cs.
11222
11223 2002-07-24  Martin Baulig  <martin@gnome.org>
11224
11225         * class.cs (MethodBase): New abstract class.  This is now a base
11226         class for Property, Indexer and Event to avoid some code duplication
11227         in their Define() and DefineMethods() methods.
11228         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
11229         generic methods for Define() and DefineMethods().
11230         (FieldBase): Derive from MemberBase, not MemberCore.
11231         (Property): Derive from MemberBase, not MemberCore.
11232         (Property.DefineMethod): Moved all the code from this method to the
11233         new MethodBase.DefineAccessor(), just call it with appropriate
11234         argumetnts.
11235         (Property.Define): Call the new Property.DoDefine(), this does some
11236         sanity checks and we don't need to duplicate the code everywhere.
11237         (Event): Derive from MemberBase, not MemberCore.
11238         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
11239         accessors, this will also make them work with interface events.
11240         (Indexer): Derive from MemberBase, not MemberCore.
11241         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
11242         (Indexer.Define): Use the new MethodBase functions.
11243
11244         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
11245         argument to the constructor.
11246         (Interface.FindMembers): Added support for interface events.
11247         (Interface.PopluateEvent): Implemented.
11248
11249         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
11250
11251 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
11252
11253         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
11254         but this is required to check for a method name being the same as
11255         the containing class.  
11256
11257         Handle this now.
11258
11259 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11260
11261         * interface.cs: initialize variable.
11262
11263 2002-07-23  Martin Baulig  <martin@gnome.org>
11264
11265         Implemented the IndexerName attribute in interfaces.
11266
11267         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
11268         name if this is an explicit interface implementation.
11269         (Indexer.InterfaceIndexerName): New public variable.  If we're
11270         implementing an interface indexer, this is the IndexerName in that
11271         interface.  Otherwise, it's the IndexerName.
11272         (Indexer.DefineMethod): If we're implementing interface indexer,
11273         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
11274         and Pending.ImplementIndexer methods.
11275         (Indexer.Define): Also define the PropertyBuilder if we're
11276         implementing an interface indexer and this is neither an explicit
11277         interface implementation nor do the IndexerName match the one in
11278         the interface.
11279
11280         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
11281         If a method is defined here, then we always need to create a proxy
11282         for it.  This is used when implementing interface indexers.
11283         (Pending.IsInterfaceIndexer): New public method.
11284         (Pending.ImplementIndexer): New public method.
11285         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
11286         This is used when implementing interface indexers to define a proxy
11287         if necessary.
11288         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
11289         define a proxy if necessary.
11290
11291         * interface.cs (Interface.IndexerName): New public variable.
11292         (Interface.PopulateIndexer): Set the IndexerName.
11293         (Interface.DefineIndexers): New private method.  Populate all the
11294         indexers and make sure their IndexerNames match.
11295
11296         * typemanager.cs (IndexerPropertyName): Added support for interface
11297         indexers.
11298
11299 2002-07-22  Martin Baulig  <martin@gnome.org>
11300
11301         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
11302         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
11303         ret if HasReturnLabel.
11304         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
11305         variables.
11306
11307         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
11308         and set the ec.LoopBeginTryCatchLevel.
11309         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
11310         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
11311         the current ec.TryCatchLevel, the branch goes out of an exception
11312         block.  In this case, we need to use Leave and not Br.
11313
11314 2002-07-22  Martin Baulig  <martin@gnome.org>
11315
11316         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
11317         block unless the block does not always return or it is contained in
11318         another try { ... } catch { ... } block.  Fixes bug #26506.
11319         Added verify-1.cs to the test suite.
11320
11321 2002-07-22  Martin Baulig  <martin@gnome.org>
11322
11323         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
11324         then we do not always return.  Fixes bug #24985.
11325
11326 2002-07-22  Martin Baulig  <martin@gnome.org>
11327
11328         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
11329         lookup on a per-class level; ie. walk up the class hierarchy until we
11330         found at least one applicable method, then choose the best among them.
11331         Fixes bug #24463 and test-29.cs.
11332
11333 2002-07-22  Martin Baulig  <martin@gnome.org>
11334
11335         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
11336         return types of the methods.  The return type is not part of the
11337         signature and we must not check it to make the `new' modifier work.
11338         Fixes bug #27999, also added test-147.cs.
11339         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
11340
11341         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
11342         on the method's return type.
11343
11344 2002-07-21  Martin Baulig  <martin@gnome.org>
11345
11346         * assign.cs: Make this work if the rightmost source is a constant and
11347         we need to do an implicit type conversion.  Also adding a few more tests
11348         to test-38.cs which should have caught this.
11349
11350         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
11351         target in the makefile for this.  The makefile.gnu is primarily intended
11352         for end-users who don't want to debug the compiler.
11353
11354 2002-07-21  Martin Baulig  <martin@gnome.org>
11355
11356         * assign.cs: Improved the Assign class so it can now handle embedded
11357         assignments (X = Y = Z = something).  As a side-effect this'll now also
11358         consume less local variables.  test-38.cs now passes with MCS, added
11359         a few new test cases to that test.
11360
11361 2002-07-20  Martin Baulig  <martin@gnome.org>
11362
11363         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
11364         instructions.  Fixes bug #27977, also added test-146.cs.
11365
11366 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11367
11368         * cs-tokenizer.cs: fixed getHex ().
11369
11370 2002-07-19  Martin Baulig  <martin@gnome.org>
11371
11372         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
11373         not Type.GetType() to lookup the array type.  This is needed when
11374         we're constructing an array of a user-defined type.
11375         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
11376         single-dimensional arrays, but also for single-dimensial arrays of
11377         type decimal.
11378
11379 2002-07-19  Martin Baulig  <martin@gnome.org>
11380
11381         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
11382         this function is called, it's not allowed to share LocalBuilders
11383         among ILGenerators.
11384
11385 2002-07-19  Martin Baulig  <martin@gnome.org>
11386
11387         * expression.cs (Argument.Resolve): Report an error 118 when trying
11388         to pass a type as argument.
11389
11390 2002-07-18  Martin Baulig  <martin@gnome.org>
11391
11392         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
11393         Conv_R_Un for the signed `long' type.
11394
11395 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
11396
11397         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
11398         `expr' for the temporary result, as that will fail if we do
11399         multiple resolves on the same expression.
11400
11401 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
11402
11403         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
11404         ec.TypeContainer for looking up aliases. 
11405
11406         * class.cs (TypeContainer): Remove LookupAlias from here.
11407
11408         * decl.cs (DeclSpace); Move here.
11409
11410 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
11411
11412         * class.cs (FindMembers): Only call filter if the constructor
11413         bulider is not null.
11414
11415         Also handle delegates in `NestedTypes' now.  Now we will perform
11416         type lookups using the standard resolution process.  This also
11417         fixes a bug.
11418
11419         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
11420         This uses Expressions (the limited kind that can be parsed by the
11421         tree) instead of strings.
11422
11423         * expression.cs (ComposedCast.ToString): Implement, used to flag
11424         errors since now we have to render expressions.
11425
11426         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
11427         FormArrayType. 
11428
11429         * ecore.cs (SimpleName.ToString): ditto.
11430
11431         * cs-parser.jay: Instead of using strings to assemble types, use
11432         Expressions to assemble the type (using SimpleName, ComposedCast,
11433         MemberAccess).  This should fix the type lookups in declarations,
11434         because we were using a different code path for this.
11435
11436         * statement.cs (Block.Resolve): Continue processing statements
11437         even when there is an error.
11438
11439 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
11440
11441         * class.cs (Event.Define): Also remove the `remove' method from
11442         the list of pending items.
11443
11444         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
11445         generate more compact code. 
11446
11447 2002-07-17  Martin Baulig  <martin@gnome.org>
11448
11449         * const.cs (Const.LookupConstantValue): Add support for constant
11450         `unchecked' and `checked' expressions.
11451         Also adding test case test-140.cs for this.
11452
11453 2002-07-17  Martin Baulig  <martin@gnome.org>
11454
11455         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
11456         check whether mi.ReturnType implements the IEnumerator interface; the
11457         `==' and the IsAssignableFrom() will fail in this situation.
11458
11459 2002-07-16  Ravi Pratap  <ravi@ximian.com>
11460
11461         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
11462         here too.
11463
11464 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11465
11466         * expression.cs: fixed bug #27811.
11467
11468 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
11469
11470         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
11471         Molaro: when we are a ref, the value already contains a pointer
11472         value, do not take the address of it.
11473
11474 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
11475         * removed mb-parser.jay and mb-tokenizer.cs
11476
11477 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11478
11479         * expression.cs: check against the building corlib void type.
11480
11481 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
11482
11483         * ecore.cs: fix for valuetype static readonly fields: when 
11484         initializing them, we need their address, not the address of a copy.
11485
11486 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
11487
11488         * typemanager.cs: register also enum_type in corlib.
11489
11490 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11491
11492         * class.cs: allow calling this (but not base) initializers in structs.
11493
11494 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
11495
11496         * ecore.cs: make sure we compare against the building base types
11497         in GetTypeSize ().
11498
11499 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
11500
11501         * typemanager.cs: fix TypeToCoreType() to handle void and object
11502         (corlib gets no more typerefs after this change).
11503
11504 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
11505
11506         * expression.cs (ArrayCreation.EmitArrayArguments): use
11507         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
11508
11509         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
11510         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
11511         array indexes, the runtime actually forbids them.
11512
11513         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
11514         for array arguments here.
11515
11516         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
11517         instead of the default for ValueTypes.
11518
11519         (New.DoEmit): Use IsValueType instead of
11520         IsSubclassOf (value_type)
11521         (New.DoResolve): ditto.
11522         (Invocation.EmitCall): ditto.
11523
11524         * assign.cs (Assign): ditto.
11525
11526         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
11527         Statements *are* currently doing part of their resolution during
11528         Emit.  
11529
11530         Expressions do always resolve during resolve, but statements are
11531         only required to propagate resolution to their children.
11532
11533 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
11534
11535         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
11536
11537         (LoadAssembly): Do not add the dll if it is already specified
11538
11539         (MainDriver): Add the System directory to the link path at the end,
11540         after all the other -L arguments. 
11541
11542         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
11543         wrong opcode for loading bytes and bools (ldelem.i1 instead of
11544         ldelem.u1) and using the opposite for sbytes.
11545
11546         This fixes Digger, and we can finally run it.
11547
11548         * driver.cs (UnixParseOption): Move the option parsing here.  
11549         (CSCParseOption): Implement CSC-like parsing of options.
11550
11551         We now support both modes of operation, the old Unix way, and the
11552         new CSC-like way.  This should help those who wanted to make cross
11553         platform makefiles.
11554
11555         The only thing broken is that /r:, /reference: and /lib: are not
11556         implemented, because I want to make those have the same semantics
11557         as the CSC compiler has, and kill once and for all the confussion
11558         around this.   Will be doing this tomorrow.
11559
11560         * statement.cs (Unsafe.Resolve): The state is checked during
11561         resolve, not emit, so we have to set the flags for IsUnsfe here.
11562
11563 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11564
11565         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
11566         not catch the Error_ObjectRefRequired in SimpleName (as it is
11567         possible to have a class/instance variable name that later gets
11568         deambiguated), we have to check this here.      
11569
11570 2002-07-10  Ravi Pratap  <ravi@ximian.com>
11571
11572         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
11573         make static and put into Expression.
11574
11575         (Event.Define): Register the private field of the event with the 
11576         TypeManager so that GetFieldFromEvent can get at it.
11577
11578         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
11579         keep track of the private field associated with an event which
11580         has no accessors.
11581
11582         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
11583         private field.
11584
11585         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
11586
11587 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11588
11589         * expression.cs (Binary.EmitBranchable): this routine emits the
11590         Binary expression in a branchable context.  This basically means:
11591         we need to branch somewhere, not just get the value on the stack.
11592
11593         This works together with Statement.EmitBoolExpression.
11594
11595         * statement.cs (Statement.EmitBoolExpression): Use
11596         EmitBranchable. 
11597
11598 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
11599
11600         * statement.cs (For): Reduce the number of jumps in loops.
11601
11602         (For): Implement loop inversion for the For statement.
11603
11604         (Break): We can be breaking out of a Try/Catch controlled section
11605         (foreach might have an implicit try/catch clause), so we need to
11606         use Leave instead of Br.
11607
11608         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
11609         now).  If the instace expression supports IMemoryLocation, we use
11610         the AddressOf method from the IMemoryLocation to extract the
11611         address instead of emitting the instance.
11612
11613         This showed up with `This', as we were emitting the instance
11614         always (Emit) instead of the Address of This.  Particularly
11615         interesting when This is a value type, as we dont want the Emit
11616         effect (which was to load the object).
11617
11618 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
11619
11620         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
11621
11622         * statement.cs (Checked): Set the CheckedState during the resolve
11623         process too, as the ConvCast operations track the checked state on
11624         the resolve process, and not emit.
11625
11626         * cs-parser.jay (namespace_member_declaration): Flag that we have
11627         found a declaration when we do.  This is used to flag error 1529
11628
11629         * driver.cs: Report ok when we display the help only.
11630
11631 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
11632
11633         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
11634
11635 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
11636
11637         * cs-tokenizer.cs (define): We also have to track locally the
11638         defines.  AllDefines is just used for the Conditional Attribute,
11639         but we also need the local defines for the current source code. 
11640
11641 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
11642
11643         * statement.cs (While, For, Do): These loops can exit through a
11644         Break statement, use this information to tell whether the
11645         statement is the last piece of code.
11646
11647         (Break): Flag that we break.
11648
11649         * codegen.cs (EmitContexts): New `Breaks' state variable.
11650
11651 2002-07-03  Martin Baulig  <martin@gnome.org>
11652
11653         * class.cs (TypeContainer.MethodModifiersValid): Allow override
11654         modifiers in method declarations in structs.  Otherwise, you won't
11655         be able to override things like Object.Equals().
11656
11657 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11658
11659         * class.cs (Method, Property, Indexer): Do not allow the public
11660         modifier to be used in explicit interface implementations.
11661
11662         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
11663         override modifiers in method declarations in structs
11664
11665 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
11666
11667         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
11668         integer or real overflow, report an error
11669
11670 2002-07-02  Martin Baulig  <martin@gnome.org>
11671
11672         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
11673         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
11674         to tell the runtime about our newly created System.Object and
11675         System.ValueType types.
11676
11677 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11678
11679         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
11680         struct instead of Ldarg/Starg.
11681
11682 2002-07-02  Martin Baulig  <martin@gnome.org>
11683
11684         * expression.cs (Indirection.Indirection): Call
11685         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
11686
11687 2002-07-02  Martin Baulig  <martin@gnome.org>
11688
11689         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
11690         ValueType, call TypeManager.TypeToCoreType() on it.
11691         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
11692         the OpCodes.Newarr argument.
11693
11694 2002-07-02  Martin Baulig  <martin@gnome.org>
11695
11696         * expression.cs (Invocation.EmitCall): When compiling corlib,
11697         replace all calls to the system's System.Array type to calls to
11698         the newly created one.
11699
11700         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
11701         System.Array methods.
11702         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
11703         from the system's System.Array type which must be replaced.
11704
11705 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
11706
11707         * typemanager.cs: load unverifiable_code_ctor so we can build
11708         corlib using the correct type. Avoid using GetTypeCode() with
11709         TypeBuilders.
11710         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
11711         TypeManager.object_type to allow building corlib.
11712
11713 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
11714
11715         * ecore.cs: handle System.Enum separately in LoadFromPtr().
11716
11717 2002-07-01  Martin Baulig  <martin@gnome.org>
11718
11719         * class.cs: Make the last change actually work, we need to check
11720         whether `ifaces != null' to avoid a crash.
11721
11722 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11723
11724         * class.cs: when we build structs without fields that implement
11725         interfaces, we need to add the interfaces separately, since there is
11726         no API to both set the size and add the interfaces at type creation
11727         time.
11728
11729 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11730
11731         * expression.cs: the dimension arguments to the array constructors
11732         need to be converted if they are a long.
11733
11734 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
11735
11736         * class.cs: don't emit ldarg.0 if there is no parent constructor
11737         (fixes showstopper for corlib).
11738
11739 2002-06-29  Martin Baulig  <martin@gnome.org>
11740
11741         MCS now compiles corlib on GNU/Linux :-)
11742
11743         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
11744         ie. check for MethodImplOptions.InternalCall.
11745
11746         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
11747         and TypeManager.attribute_type are null, so we must explicitly check
11748         whether parent is not null to find out whether it's an attribute type.
11749         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
11750         and SetBuilder, not only if the property is neither abstract nor external.
11751         This is necessary to set the MethodImplOptions on the accessor methods.
11752         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
11753         SetBuilder, see Property.Emit().
11754
11755         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
11756         populate "System.Object", "System.ValueType" and "System.Attribute" since
11757         they've already been populated from BootCorlib_PopulateCoreTypes().
11758
11759 2002-06-29  Martin Baulig  <martin@gnome.org>
11760
11761         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
11762         is the NullLiteral, we also need to make sure that target_type is not
11763         an enum type.   
11764
11765 2002-06-29  Martin Baulig  <martin@gnome.org>
11766
11767         * rootcontext.cs (RootContext.ResolveCore): We must initialize
11768         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
11769         before calling BootstrapCorlib_ResolveDelegate ().
11770
11771 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11772
11773         * statement.cs: fixed build-breaker. All tests passed ok.
11774
11775 2002-06-27  Martin Baulig  <martin@gnome.org>
11776
11777         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11778         for System.Decimal when compiling corlib.
11779
11780 2002-06-27  Martin Baulig  <martin@gnome.org>
11781
11782         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11783         switch blocks which contain nothing but a default clause.
11784
11785 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11786
11787        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11788
11789 2002-06-27  Martin Baulig  <martin@gnome.org>
11790
11791         * ecore.cs (PropertyExpr.PropertyExpr): Call
11792         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11793
11794         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11795         is already a TypeBuilder.
11796
11797 2002-06-27  Martin Baulig  <martin@gnome.org>
11798
11799         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11800         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11801         the "from an array-type to System.Array" case.  This makes it work
11802         when compiling corlib.
11803
11804 2002-06-27  Martin Baulig  <martin@gnome.org>
11805
11806         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11807         non-static PropertyExpr, set its InstanceExpression.  This makes
11808         the `ICollection.Count' property work in System/Array.cs.
11809
11810 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11811
11812         * driver.cs: Made error handling more consistent.  Errors now
11813         tracked by Report class, so many methods which used to return int
11814         now return void.  Main() now prints success/failure and 
11815         errors/warnings message.
11816
11817         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11818         the magic number return values (123 and 124).  Now, if the
11819         expected error occurs, the compiler exits with success (exit value
11820         0).  If the compilation completes without seeing that particular
11821         error, the compiler exits with failure (exit value 1).  The
11822         makefile in mcs/errors has been changed to handle the new behaviour.
11823
11824         * report.cs: Made 'expected error' number a property and renamed
11825         it from 'Probe' to 'ExpectedError'.
11826
11827         * genericparser.cs: Removed error handling support, since it is
11828         now all done by Report class.
11829
11830         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11831         class, so parse() no longer returns an int.
11832
11833         * namespace.cs: Use Report.Error instead of GenericParser.error
11834
11835 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11836
11837         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11838         TypeContainer.AddOperator): At the front of the list put the
11839         explicit implementations, so they get resolved/defined first. 
11840
11841 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11842
11843         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11844         interface type is implemented by this TypeContainer.  Used during
11845         explicit interface implementation.
11846
11847         (Property.Define, Indexer.Define, Method.Define): Validate that
11848         the given interface in the explicit implementation is one of the
11849         base classes for the containing type.
11850
11851         Also if we are explicitly implementing an interface, but there is
11852         no match in the pending implementation table, report an error.
11853
11854         (Property.Define): Only define the property if we are
11855         not explicitly implementing a property from an interface.  Use the
11856         correct name also for those properties (the same CSC uses,
11857         although that is really not needed).
11858
11859         (Property.Emit): Do not emit attributes for explicitly implemented
11860         properties, as there is no TypeBuilder.
11861
11862         (Indexer.Emit): ditto.
11863
11864         Hiding then means that we do not really *implement* a pending
11865         implementation, which makes code fail.
11866
11867 2002-06-22  Martin Baulig  <martin@gnome.org>
11868
11869         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11870         the return value of Object.GetType().  [FIXME: we need to do this whenever
11871         we get a type back from the reflection library].
11872
11873 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11874
11875         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11876
11877 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11878
11879         * attribute.cs: Return null if we can not look up the type.
11880
11881         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11882         the interface types found.
11883
11884         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11885         interface types found.
11886
11887         * typemanager.cs (GetInterfaces): Make this routine returns alll
11888         the interfaces and work around the lame differences between
11889         System.Type and System.Reflection.Emit.TypeBuilder in the results
11890         result for GetInterfaces.
11891
11892         (ExpandInterfaces): Given an array of interface types, expand and
11893         eliminate repeated ocurrences of an interface.  This expands in
11894         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11895         be IA, IB, IC.
11896
11897 2002-06-21  Martin Baulig  <martin@gnome.org>
11898
11899         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11900         on System.Enum.
11901
11902 2002-06-21  Martin Baulig  <martin@gnome.org>
11903
11904         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11905         and called with one of the core types, return the corresponding typebuilder for
11906         that type.
11907
11908         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11909         element type.
11910
11911 2002-06-21  Martin Baulig  <martin@gnome.org>
11912
11913         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11914         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11915         (Expression.ConvertReferenceExplicit): Likewise.
11916
11917         * expression.cs (ElementAccess.DoResolve): Likewise.
11918         (ElementAccess.DoResolveLValue): Likewise.
11919
11920 2002-06-10  Martin Baulig  <martin@gnome.org>
11921
11922         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11923         add the "value" parameter to the parameter list.
11924
11925         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11926         to our caller.
11927
11928 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11929
11930         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11931         the argument to an int, uint, long or ulong, per the spec.  Also
11932         catch negative constants in array creation.
11933
11934 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11935
11936         * class.cs: do not allow the same interface to appear twice in
11937         the definition list.
11938
11939 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11940
11941         * ecore.cs: don't use ldlen with System.Array.
11942
11943 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11944
11945         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11946
11947 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11948
11949         * modifiers.cs: produce correct field attributes for protected
11950         internal. Easy fix so miguel can work on ther harder stuff:-)
11951
11952 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11953
11954         * pending.cs: New file.  Move the code from class.cs here.
11955         Support clearning the pending flag for all methods (when not doing
11956         explicit interface implementation).
11957
11958 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11959
11960         * rootcontext.cs: added a couple more types needed to bootstrap.
11961
11962 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11963
11964         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11965         constructor in the type, instead of any constructor in the type
11966         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11967         a bug in the Mono runtime when applying the params attribute). 
11968
11969 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11970         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11971
11972 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11973
11974         * expression.cs (Unary.ResolveOperator): Use TypeManager
11975         to resolve the type.
11976
11977 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11978
11979         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11980         attached.
11981
11982         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11983         with each member too.
11984
11985         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11986         field builders too - this takes care of the enum member case.
11987
11988 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11989
11990         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11991         address-of operator on both value types and pointers.
11992
11993 2002-06-10  Martin Baulig  <martin@gnome.org>
11994
11995         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11996         PropertyBuilder to the `property_builders' list.
11997
11998         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11999         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
12000         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
12001         find any indexers which are inherited from an interface.
12002
12003 2002-06-09  Martin Baulig  <martin@gnome.org>
12004
12005         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
12006         the same type as the constant if necessary.  There's also a test-130.cs
12007         for this.
12008
12009         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
12010
12011         * typemanager.cs (TypeManager.ChangeType): Previously known as
12012         Enum.ChangeEnumType().
12013
12014 2002-06-09  Martin Baulig  <martin@gnome.org>
12015
12016         * expression.cs (Cast.TryReduce): Added support for consts.
12017
12018 2002-06-08  Ravi Pratap  <ravi@ximian.com>
12019
12020         * class.cs (Accessor): Hold attributes information so we can pass
12021         it along.
12022
12023         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
12024         Modify to pass in attributes attached to the methods.
12025
12026         (add_accessor_declaration, remove_accessor_declaration): Ditto.
12027
12028         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
12029         to handle the Accessor kind :-)
12030
12031         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
12032
12033 2002-06-08  Martin Baulig  <martin@gnome.org>
12034
12035         * expression.cs (Unary.TryReduceNegative): Added support for
12036         ULongConstants.
12037
12038 2002-06-08  Martin Baulig  <martin@gnome.org>
12039
12040         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
12041         name can't be found in the `defined_names' - the caller will do a
12042         MemberLookup in this case and thus find methods in System.Enum
12043         such as Enum.IsDefined().
12044
12045 2002-06-08  Martin Baulig  <martin@gnome.org>
12046
12047         * enum.cs (Enum.ChangeEnumType): This is a custom version of
12048         Convert.ChangeType() which works with TypeBuilder created types.
12049         (Enum.LookupEnumValue, Enum.Define): Use it here.
12050
12051         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
12052         `TypeBuilder.BaseType != null' check.
12053         (TypeContainer.FindMembers): Only lookup parent members if we
12054         actually have a parent.
12055         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
12056         (ConstructorInitializer.Resolve): Likewise.
12057
12058         * interface.cs (Interface.FindMembers): Added
12059         `TypeBuilder.BaseType != null' check.
12060
12061         * rootcontext.cs (RootContext.ResolveCore): Added
12062         "System.Runtime.CompilerServices.IndexerNameAttribute" to
12063         classes_second_stage.
12064
12065         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
12066         debug_type and trace_type when compiling with --nostdlib.       
12067
12068 2002-06-07  Martin Baulig  <martin@gnome.org>
12069
12070         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
12071         (AddField): Set it to true when adding a non-static field.
12072         (DefineType): Use `have_nonstatic_fields' to find out whether we
12073         have non-static fields, not `Fields != null'.
12074
12075 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
12076
12077         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
12078         dereferencing a null on the static-field code path)
12079
12080 2002-05-30  Martin Baulig  <martin@gnome.org>
12081
12082         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
12083         to take command line arguments.  Use reflection to call the new
12084         custom `Initialize' function on the symbol writer and pass it the
12085         command line arguments.
12086
12087         * driver.cs (--debug-args): New command line argument to pass command
12088         line arguments to the symbol writer.
12089
12090 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
12091
12092         * assign.cs (DoResolve): Forgot to do the implicit conversion to
12093         the target type for indexers and properties.  Thanks to Joe for
12094         catching this.
12095
12096 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
12097
12098         * typemanager.cs (MethodFlags): returns the method flags
12099         (Obsolete/ShouldIgnore) that control warning emission and whether
12100         the invocation should be made, or ignored. 
12101
12102         * expression.cs (Invocation.Emit): Remove previous hack, we should
12103         not do this on matching a base type, we should do this based on an attribute
12104
12105         Only emit calls to System.Diagnostics.Debug and
12106         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
12107         on the command line.
12108
12109         * rootcontext.cs: Global settings for tracing and debugging.
12110
12111         * cs-tokenizer.cs (define): New utility function to track
12112         defines.   Set the global settings for TRACE and DEBUG if found.
12113
12114 2002-05-25  Ravi Pratap  <ravi@ximian.com>
12115
12116         * interface.cs (Populate*): Pass in the TypeContainer as well as
12117         the DeclSpace as parameters so that we can create EmitContexts and
12118         then use that to apply attributes etc.
12119
12120         (PopulateMethod, PopulateEvent, PopulateProperty)
12121         (PopulateIndexer): Apply attributes everywhere.
12122
12123         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
12124         etc.
12125
12126         (ApplyAttributes): Update accordingly.
12127
12128         We now apply interface attributes for all members too.
12129
12130 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
12131
12132         * class.cs (Indexer.Define); Correctly check if we are explicit
12133         implementation (instead of checking the Name for a ".", we
12134         directly look up if the InterfaceType was specified).
12135
12136         Delay the creation of the PropertyBuilder.
12137
12138         Only create the PropertyBuilder if we are not an explicit
12139         interface implementation.   This means that explicit interface
12140         implementation members do not participate in regular function
12141         lookups, and hence fixes another major ambiguity problem in
12142         overload resolution (that was the visible effect).
12143
12144         (DefineMethod): Return whether we are doing an interface
12145         implementation. 
12146
12147         * typemanager.cs: Temporary hack until we get attributes in
12148         interfaces (Ravi is working on that) and we get IndexerName
12149         support in interfaces.
12150
12151         * interface.cs: Register the indexers as properties.
12152
12153         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
12154         warning, I have verified that this is a bug in the .NET runtime
12155         (JavaScript suffers of the same problem).
12156
12157         * typemanager.cs (MemberLookup): When looking up members for
12158         interfaces, the parent of an interface is the implicit
12159         System.Object (so we succeed in searches of Object methods in an
12160         interface method invocation.  Example:  IEnumerable x;  x.ToString
12161         ()) 
12162
12163 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
12164
12165         * class.cs (Event): Events should also register if they do
12166         implement the methods that an interface requires.
12167
12168         * typemanager.cs (MemberLookup); use the new GetInterfaces
12169         method. 
12170
12171         (GetInterfaces): The code used to lookup interfaces for a type is
12172         used in more than one place, factor it here. 
12173
12174         * driver.cs: Track the errors at the bottom of the file, we kept
12175         on going.
12176
12177         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
12178         instance if the method we are calling is static!
12179
12180 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
12181
12182         * attribute.cs (ApplyAttributes): Make this function filter out
12183         the IndexerName attribute (as that attribute in reality is never
12184         applied) and return the string constant for the IndexerName
12185         attribute. 
12186
12187         * class.cs (TypeContainer.Emit): Validate that all the indexers
12188         have the same IndexerName attribute, and if so, set the
12189         DefaultName attribute on the class. 
12190
12191         * typemanager.cs: The return value might contain other stuff (not
12192         only methods).  For instance, consider a method with an "Item"
12193         property and an Item method.
12194
12195         * class.cs: If there is a problem with the parameter types,
12196         return. 
12197
12198 2002-05-24  Ravi Pratap  <ravi@ximian.com>
12199
12200         * ecore.cs (ImplicitConversionExists): Wrapper function which also
12201         looks at user defined conversion after making a call to 
12202         StandardConversionExists - we need this for overload resolution.
12203
12204         * expression.cs : Update accordingly the various method calls.
12205
12206         This fixes 2 bugs filed against implicit user defined conversions 
12207
12208 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
12209
12210         * statement.cs: Track the result of the assignment.
12211
12212 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
12213
12214         * expression.cs (MemberAccess): Improved error reporting for
12215         inaccessible members.
12216
12217 2002-05-22  Martin Baulig  <martin@gnome.org>
12218
12219         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
12220         itself with debugging support.
12221
12222 2002-05-22  Martin Baulig  <martin@gnome.org>
12223
12224         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
12225         Removed, this isn't needed anymore.
12226
12227 2002-05-20  Martin Baulig  <martin@gnome.org>
12228
12229         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
12230         be underlying type for an enum.
12231
12232 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
12233
12234         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
12235         that splits out the loading of just the core types.
12236
12237         * rootcontext.cs (ResolveCore): Split the struct resolution in
12238         two, so we can load the enumeration underlying types before any
12239         enums are used.
12240
12241         * expression.cs (Is): Bandaid until we fix properly Switch (see
12242         bug #24985 for details).
12243
12244         * typemanager.cs (ImplementsInterface): The hashtable will contain
12245         a null if there are no interfaces implemented.
12246
12247 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
12248
12249         * cs-parser.jay (indexer_declarator): It is fine to have array
12250         parameters
12251
12252 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12253
12254         * typemanager.cs: (RegisterBuilder): New function used to register
12255         TypeBuilders that implement interfaces.  Since
12256         TypeBuilder.GetInterfaces (as usual) does not work with lame
12257         Reflection.Emit. 
12258         (AddUserType): register interfaces.
12259
12260         (ImplementsInterface): Use the builder_to_ifaces hash if we are
12261         dealing with TypeBuilder.  Also, arrays are showing up as
12262         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
12263         methods can not be invoked on them!
12264
12265         * ecore.cs (ExplicitReferenceConversionExists): Made public.
12266         (ImplicitReferenceConversionExists): Split out from
12267         StandardConversionExists. 
12268
12269         * expression.cs (As): We were only implementing one of the three
12270         cases for the as operator.  We now implement them all.
12271         (Is): Implement the various other cases for Is as well.
12272
12273         * typemanager.cs (CACHE): New define used to control if we want or
12274         not the FindMembers cache.  Seems to have a negative impact on
12275         performance currently
12276
12277         (MemberLookup): Nested types have full acess to
12278         enclosing type members
12279
12280         Remove code that coped with instance/static returns for events, we
12281         now catch this in RealFindMembers.
12282
12283         (RealFindMembers): only perform static lookup if the instance
12284         lookup did not return a type or an event.  
12285
12286 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12287
12288         * assign.cs (CompoundAssign): We pass more semantic information
12289         now to Compound Assignments than we did before: now we have all
12290         the information at hand, and now we resolve the target *before* we
12291         do the expression expansion, which allows the "CacheValue" method
12292         to have the effect we intended (before, a [x] += 1 would generate
12293         two differen ArrayAccess expressions from the ElementAccess,
12294         during the resolution process).
12295
12296         (CompoundAssign.DoResolve): Resolve target and original_source here.
12297
12298 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
12299
12300         * expression.cs (ArrayAccess): dropped debugging information. 
12301
12302         * typemanager.cs: Small bug fix: I was always returning i_members,
12303         instead of one of i_members or s_members (depending on which had
12304         the content).
12305
12306         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
12307         method is invoked before any code generation takes place, and it
12308         is a mechanism to inform that the expression will be invoked more
12309         than once, and that the method should use temporary values to
12310         avoid having side effects
12311
12312         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
12313
12314         * ecore.cs (Expression.CacheTemporaries): Provide empty default
12315         implementation.
12316
12317         * expression.cs (Indirection, ArrayAccess): Add support for
12318         CacheTemporaries in these two bad boys. 
12319
12320         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
12321         ldobj or ldind_ref.  
12322         (StoreFromPtr): Handle stobj as well.
12323
12324         * expression.cs (UnaryMutator): Share more code.
12325
12326         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
12327         down: I was not tracking the Filter function as well, which
12328         was affecting the results of the cache.
12329
12330 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
12331
12332         * attribute.cs: Remove the hack to handle the CharSet property on
12333         StructLayouts. 
12334
12335 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
12336
12337         * attribute.cs (DoResolve): More uglyness, we now only try to
12338         resolve the attribute partially, to extract the CharSet
12339         information (only if we are a StructLayout attribute).  Otherwise 
12340
12341         (GetExtraTypeInfo): Add some code to conditionally kill in the
12342         future this.   I am more and more convinced that the .NET
12343         framework has special code to handle the attribute setting on
12344         certain elements.
12345
12346         * expression.cs (IsParamsMethodApplicable): Revert my previous
12347         foreach change here, it was wrong.
12348
12349 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
12350
12351         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
12352         (pp_expr): do not abort on unknown input, just return.
12353         (eval): abort if there are pending chars.
12354
12355         * attribute.cs (Attribute.Resolve): Positional parameters are
12356         optional.  Deal with that case.
12357
12358         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
12359         the Ansi/Unicode/Auto information for the type.
12360
12361         (TypeContainer.DefineType): instantiate the EmitContext here, as
12362         we will be using it during the type definition (to resolve
12363         attributes) and during the emit phase.
12364
12365         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
12366         to pull type information out of the attributes
12367
12368         (Attribute.Resolve): track the constructor builder, and allow for
12369         multiple invocations (structs and classes will use this).
12370
12371         * ecore.cs (MemberLookupFinal): new version with all the
12372         parameters customizable.
12373
12374         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
12375         constructors.  Return if the result value is null (as the error
12376         would have been flagged already by MemberLookupFinal)
12377
12378         Do not allow instances of abstract classes or interfaces to be
12379         created.
12380
12381         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
12382         We have to compare the assembly property here when dealing with
12383         FamANDAssem and Assembly access modifiers, because we might be
12384         creating an assembly from *modules* (that means that we are not
12385         getting TypeBuilders for types defined in other modules that are
12386         part of this assembly).
12387
12388         (Method.Emit): If the method is marked abstract and has a body,
12389         emit an error. 
12390
12391         (TypeContainer.DefineMembers): If both the defined member and the
12392         parent name match are methods, then do not emit any warnings: let
12393         the Method.Define routine take care of flagging warnings.  But if
12394         there is a mismatch (method overrides something else, or method is
12395         overriwritten by something, then emit warning).
12396
12397         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
12398         set to null, this means `do not check for the return type on the
12399         signature'. 
12400
12401         (Method.Define): set the return type for the method signature to
12402         null, so that we get methods with the same name and parameters and
12403         different return types.  This is used to flag warning 114 (you are
12404         hiding a method, and you probably want to use the new/override
12405         keywords instead).
12406
12407         * typemanager.cs (MemberLookup): Implemented proper access
12408         control, closing a long standing set of bug reports.  The problem
12409         was that the Framework only has two bits: Public and NonPublic,
12410         and NonPublic includes private and protected methods, but we need
12411         to enforce the FamANDAssem, FamOrAssem and Family. 
12412
12413 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
12414
12415         * statement.cs (GotoCase): Return true: Ammounts to giving up
12416         knowledge on whether we return or not, and letting the other case
12417         be responsible for it.
12418
12419 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
12420
12421         * driver.cs: Do not load directories for each file processed, only
12422         do it if there is a pattern.
12423
12424         * ecore.cs: Report readonly assigns here as well, as we might have
12425         been resolved only by MemberAccess.
12426
12427         (SimpleName.SimpleNameResolve): Also be useful for LValue
12428         resolution.   We need this to propagate assign to local readonly variables
12429
12430         * typemanager.cs: Use a ptrhashtable for the criteria, because we
12431         do not want to reuse potential criteria memory.
12432
12433         * class.cs (MyEventBuilder): Set reflected_type;
12434
12435         * ecore.cs (Constantify): Added support for constifying bools.
12436
12437         (RootContext.LookupType): Added a cache for values looked up in
12438         the declaration space.
12439
12440         * typemanager.cs (FindMembers): Now is a front-end to
12441         RealFindMembers, and provides a two-level hashtable-based cache to
12442         the request.  
12443
12444         15% performance improvement: from 22.5 to 19.2 seconds.
12445
12446         * expression.cs (IsParamsMethodApplicable): use foreach.
12447         (Invocation.DoResolve): ditto.
12448         (New.DoResolve): ditto.
12449         (ArrayCreation.DoResolve): ditto.
12450
12451         * ecore.cs (FindMostEncompassingType): use foreach.
12452
12453         * delegate.cs (NewDelegate.DoResolve): Use foreach
12454
12455         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
12456         (RemoveMethods): use foreach.
12457
12458         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
12459         nested foreach statements instead of for, and also break out of
12460         the inner loop once a match is found.
12461
12462         (Invocation.OverloadResolve): Use foreach, simplify the code. 
12463
12464 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
12465
12466         * cfold.cs (BinaryFold): During an enumeration evaluation context,
12467         we actually unwrap the expression to allow for extra information
12468         to be extracted. 
12469
12470         * expression.cs: Use Shr_Un on unsigned operations. 
12471
12472 2002-05-08  Ravi Pratap  <ravi@ximian.com>
12473
12474         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
12475         applicable operators was not being considered correctly. This closes
12476         the bug Miguel reported.
12477
12478 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
12479
12480         * attribute.cs: check that the type derives from System.Attribute
12481         and report the correct error in that case (moved the duplicate code to
12482         its own method, too).
12483
12484 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
12485
12486         * attribute.cs: lookup attribute type name as the spec says: first the
12487         bare attribute name and then name + "Attribute" (nant compiles with
12488         mcs after this fix).
12489
12490 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
12491
12492         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
12493         Because of the way we parse things, we should try to see if a
12494         UIntConstant can fit in an integer.
12495
12496 2002-05-07  Ravi Pratap  <ravi@ximian.com>
12497
12498         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
12499         when we are in an explicit context.
12500
12501         (ConvertReferenceExplicit): When converting from Iface type S to Class
12502         T make sure the rules are implemented as an OR.
12503
12504         * parameter.cs (ParameterType): Make it a property for now although the
12505         purpose really isn't anything immediate.
12506
12507         * expression.cs (Is*Applicable): Do better checking on the parameter type
12508         of a ref/out parameter. The ones from the system assemblies are already 
12509         marked with the correct type so we don't need to do any correction.
12510
12511         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
12512         the object type is standard too so include that.
12513
12514 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12515
12516         * ecore.cs (StandardConversionExists): Augment with missing code:
12517         deal with IntConstant, LongConstants and Enumerations.
12518
12519         * assign.cs: Report the error, instead of failing silently
12520
12521         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
12522         typecontainer that they are declared, because the
12523         typecontainer/namespace will have the list of using clauses that
12524         need to be applied.
12525
12526         Assembly Attributes were escaping the normal registration
12527         mechanism. 
12528
12529         (EmitCode): Apply attributes within an EmitContext that represents
12530         the container they were declared on.
12531
12532         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
12533
12534 2002-05-06  Ravi Pratap  <ravi@ximian.com>
12535
12536         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
12537         Revamp completely - make much cleaner as we now operate only
12538         on a set of Types.
12539
12540         (FindMostSpecificSource, FindMostSpecificTarget): New methods
12541         to implement the logic detailed in the spec more correctly.
12542
12543         (UserDefinedConversion): Update accordingly.
12544
12545 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12546
12547         * statement.cs: Return flow analysis information up.
12548
12549         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
12550         and the default.
12551
12552         (token): Do not consume an extra character before calling
12553         decimal_digits.
12554
12555 2002-05-06  Piers Haken <piersh@friskit.com>
12556
12557         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
12558
12559 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12560
12561         * class.cs (Constructor.Emit): Set the IsStatic flag in the
12562         EmitContext during the instance constructor initializer
12563         resolution, to stop access to instance variables.
12564
12565         This is mandated by the spec, last paragraph of the `constructor
12566         initializers' section. 
12567
12568 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
12569
12570         * cs-parser.jay, class.cs (Accessor): new class used to represent
12571         an accessor (get or set).  In the past we used `null' to represent
12572         a missing accessor.  But this is ambiguous because there was no
12573         way to tell in abstract indexers/properties if one of them was
12574         specified.
12575
12576         Now there is a way of addressing that.
12577
12578         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
12579         instead of FindMembers.
12580
12581         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
12582         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
12583
12584         * attribute.cs: Treat indexers and properties as the same in terms
12585         of applying attributes
12586
12587         * ecore.cs (FindMostEncompassedType): Use statically initialized
12588         EmptyExpressions()s like we do elsewhere to avoid creating useless
12589         objects (and we take this out of the tight loop).
12590
12591         (GetConversionOperators): Move the code to extract the actual
12592         operators to a separate routine to clean things up.
12593
12594 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
12595
12596         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
12597         events are always registered FieldBuilders.
12598
12599         * class.cs (FieldBase): New class shared by Fields 
12600
12601         * delegate.cs: If we are a toplevel delegate, use our full name.
12602         If we are a nested delegate, then only use our tail name.
12603
12604 2002-05-02  Ravi Pratap  <ravi@ximian.com>
12605
12606         * expression.cs (IsApplicable): Ensure that we add the "&" to
12607         ref/out types before comparing it with the type of the argument.
12608
12609         (IsParamsMethodApplicable): Ditto.
12610
12611         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
12612         silly me ;-)
12613
12614         * delegate.cs : Handle the case when we have more than one applicable
12615         method. Flag an error only when we finish checking all.
12616
12617 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
12618
12619         * expression.cs: Add support for boolean static initializers.
12620
12621 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
12622
12623         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
12624
12625         * parameter.cs (ComputeParameterTypes,
12626         ComputeAndDefineParameterTypes): Better error handling: now we
12627         clear the `types' cache if we fail during any of the type lookups.
12628         We also return the status code correctly to our caller
12629
12630         * delegate.cs: If we fail to define a delegate, abort the extra
12631         steps. 
12632
12633         * expression.cs (Binary.ResolveOperator): for
12634         operator==(object,object) and operator !=(object, object) we also
12635         have to verify that there is an implicit conversion from one to
12636         the other.
12637
12638         (ArrayAccess.DoResolve): Array Access can operate on
12639         non-variables. 
12640
12641 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
12642
12643         * assign.cs (CompoundAssign): A new class used as a "flag" that
12644         the assignment actually is happening as part of a compound
12645         assignment operator.
12646
12647         During compound assignment, a few new rules exist to enable things
12648         like:
12649
12650         byte b |= 1 + 2
12651
12652         From the spec:
12653
12654         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
12655         to the type of x) if y is implicitly convertible to the type of x,
12656         and the operator is a builtin operator and the return type of the
12657         operator is explicitly convertible to the type of x. 
12658
12659         * rootcontext.cs: Reset warning level to 2.  4 catches various
12660         "interesting" features in mcs, we must clean this up at some
12661         point, but currently am trying to kill other bugs ;-)
12662
12663         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
12664         in container classes as well.  
12665
12666         * expression.cs (Binary.ResolveOperator): Handle string case
12667         before anything else (as operator overloading does emit an error
12668         before doing anything else).
12669
12670         This code could go away when we move to a table driven model, but
12671         i could not come up with a good plan last night.
12672
12673 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
12674
12675         * typemanager.cs (CSharpName): reimplementation using regex.
12676         * class.cs: added null check for fields in Emit
12677         * rootcontext.cs: set warninglevel to 4
12678
12679 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
12680
12681         * typemanager.cs (CSharpName): reimplemented with Lupus
12682         suggestion.
12683
12684 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
12685
12686         * statement.cs (If): correclty implement Resolve, because we were
12687         not catching sem errors in there.  The same process is needed
12688         everywhere else. 
12689         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
12690
12691
12692         (Statement.Warning_DeadCodeFound): Factorize code.
12693         (While): Report dead code here too.
12694
12695         (Statement): Added Resolve virtual method to allow
12696         for resolution split from the emit code.
12697
12698 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12699
12700         * statement.cs (EmitBoolExpression): No longer try to resolve the
12701         expression here.    
12702         (MakeBoolean): New utility function that resolve, implicitly
12703         converts to boolean and tags the expression. 
12704
12705
12706         (If, Do): Implement dead code elimination.
12707         (While): Implement loop inversion
12708
12709         (Do, While, For, If): Resolve the expression prior to calling our
12710         code generation.
12711
12712 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
12713
12714         * class.cs:
12715           - added method Report28 (warning: program has more than one entry point)
12716           - added method IsEntryPoint, implements paragraph 10.1 of the spec
12717           - modified method Method.Define, the part at the end of the method
12718
12719         * rootcontext.cs: added static public Location EntryPointLocation;
12720           
12721         * ../errors/cs0028.cs : Add test case for the above warning.              
12722
12723         * typemanager.cs:
12724           - modified method CSharpName to allow arrays of primitive type to
12725             be printed nicely (e.g. instead of System.Int32[][] it now prints
12726             int[][])
12727           - added method CSharpSignature: returns the signature of a method
12728             in string format to be used in reporting errors, warnings, etc.
12729
12730         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
12731         with String.Empty.
12732
12733 2002-04-26  Ravi Pratap  <ravi@ximian.com>
12734
12735         * delegate.cs (Define): Fix extremely silly bug where I was
12736         setting the type of the 'object' parameter of the BeginInvoke
12737         method to System.IAsyncResult instead of System.Object ;-)
12738
12739 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12740
12741         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
12742         here. 
12743
12744         (Constructor.Emit): return if we fail to initialize the
12745         constructor.  Another door closed!  
12746
12747         * expression.cs (New.DoResolve): Improve error message (from -6 to
12748         1501).  Use DeclaredOnly lookup to find the exact constructor.
12749
12750         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
12751         loop.  This is useful.
12752
12753         * cs-parser.jay: Adjust the default parameters so that destructors
12754         have the proper signature.
12755
12756 2002-04-26  Martin Baulig  <martin@gnome.org>
12757
12758         * driver.cs (LoadAssembly): If `assembly' contains any characters
12759         which are only valid in path names and not in assembly names
12760         (currently slash, backslash and point), use Assembly.LoadFrom ()
12761         instead of Assembly.Load () on the `assembly' (before iteration
12762         over the link_paths).
12763
12764 2002-04-26  Martin Baulig  <martin@gnome.org>
12765
12766         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
12767
12768 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
12769
12770         * class.cs (Property): use the new typemanager.MemberLookup
12771
12772         (TypeContainer.MemberLookup): Implement using the
12773         TypeManager.MemberLookup now. 
12774
12775         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12776         and return MemberInfos, so that these can be used without an
12777         EmitContext (what we had before).
12778
12779 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12780
12781         * expression.cs: Fix the case where the argument to params if the
12782         type of the params.  I omitted handling this before.   Fixed
12783
12784 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12785
12786         * driver.cs: Call BootCorlib_PopulateCoreType
12787
12788         * class.cs (Property.CheckBase): Check for properties only, not
12789         for all members. 
12790
12791         * interface.cs: Temporary hack: try/catch around the
12792         CustomAttributeBuilder, because I am getting an exception that I
12793         do not understand.
12794
12795         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12796         types whose definitions are required to be there (attributes are
12797         defined before standard types).
12798
12799         Compute definitions as we boot the various types, as they are used
12800         immediately (value_type class will need object_type, but if we do
12801         not initialize object_type, we will pass a null, which will let
12802         the runtime pick the System.Object from the existing corlib, which
12803         is not what we want).
12804
12805 2002-04-22  Patrik Torstensson <totte@labs2.com>
12806
12807         * cs-tokenizer.cs: fixed a number of trim() issues.
12808
12809 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12810
12811         * expression.cs (Argument.Type): Ensure that we return the correct
12812         type when we have out or ref parameters [in which case we 
12813         append a "&"].
12814
12815 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12816
12817         * class.cs (Property, Indexer): Allow extern modifier in there. 
12818
12819         * typemanager.cs (InitBaseTypes): Initializes object_type and
12820         value_type, since those will be used early on during the bootstrap
12821         process to compile corlib.
12822
12823         (InitCoreTypes): Move code from here to InitBaseTypes.
12824
12825 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12826
12827         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12828         single-dimension arrays as using the ldlen opcode.  
12829
12830         Daniel Lewis discovered this optimization.  
12831
12832         * typemanager.cs: Add signature for System.Array::get_Length
12833
12834 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12835
12836         * statement.cs: report the error when the foreach does not apply to an
12837         array nor a collection.
12838
12839 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12840
12841         * expression.cs: Add implicit conversions to the operator ~.
12842
12843         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12844
12845         * typemanager.cs: Locate the decimal constructor.
12846
12847 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12848
12849         * attribute.cs: use the new property of TypeOf.
12850         * expression.cs: added 'get' property around typearg.
12851
12852         These changes fix a build breaker reported by NickD. Is this the
12853         correct way to fix?  If not, please, revert my changes and make it
12854         work :-).
12855
12856 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12857
12858         * attribute.cs: Add support for typeof in attribute invocations.
12859         I am not sure that this is right though.
12860
12861 2002-04-14  Duncan Mak  <duncan@ximian.com>
12862
12863         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12864         Binary.Operator.Division case.
12865
12866 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12867
12868         * class.cs (DefineType): Ensure that we do a proper check on
12869         attribute types and also register it with the TypeManager.
12870
12871         (TypeContainer.Targets): The default for attribute types is
12872         AttributeTargets.All.
12873
12874         * attribute.cs (ApplyAttributes): Registering the attribute type
12875         is done elsewhere, not when we discover we have a Usage attribute.
12876
12877 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12878
12879         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12880         and get rid of is_delegate parameter.
12881
12882         * everywhere : update.
12883
12884 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12885
12886         * cs-parser.jay (compilation_unit): Revamp completely to use
12887         some new ideas that I got from Rhys' grammar to solve the problems
12888         with assembly level attributes.
12889
12890         (outer_declaration): New grammar production.
12891
12892         (attribute_sections): Add.
12893
12894         (opt_attributes): Base on attribute_sections
12895
12896         (namespace_declaration): Allow opt_attributes to tackle the case
12897         when we have assembly level attributes - we are clever in this
12898         regard now ;-)
12899
12900         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12901         attributes in the non-global context.
12902
12903         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12904         instead of SetGlobalAttributes.
12905
12906         * class.cs, rootcontext.cs : Ensure we define and generate 
12907         attribute types before anything else.
12908
12909         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12910         and flag the new error -20 for the case when the attribute type
12911         does not have valid targets specified. csc does not catch this.
12912
12913         * ../errors/errors.txt : update for error # -20
12914
12915 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12916
12917         * support.cs (InternalParameters.ParameterModifier): Do some null
12918         checking and return sane values.
12919
12920         * class.cs (Method.Define): If we are a PInvoke method, ensure
12921         that we are static and extern. Report error # 601
12922
12923         * ../errors/cs0601.cs : Add test case for the above error.
12924
12925 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12926
12927         * rootcontext.cs (attribute_types): We need to keep type of
12928         all attribute types separately and emit code for them first.
12929
12930         (RegisterAttribute) : Implement.
12931
12932         * class.cs (DefineType): Check if the current Type is a custom
12933         attribute type and register it accordingly.
12934
12935         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12936         adding the first attribute twice and rename to
12937
12938         (SetGlobalAttributes): this.
12939
12940         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12941         lookups.
12942
12943         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12944         if we are processing global arguments. Hmm, I am unsure of this.
12945
12946 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12947
12948         * expression.cs: added static array of strings to avoid calling
12949         Enum.ToString () for Operator in Binary. Significant recover of
12950         performance.
12951
12952 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12953
12954         * class.cs (FindMembers): Allow the Builders of the various
12955         members to be null.  If they are skip them.  This only happens
12956         during the PInvoke declaration.
12957
12958 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12959
12960         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12961         failure, so we do not keep going afterwards.
12962
12963         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12964         wanted to pass `false' as the `is_delegate' argument.  If this is
12965         the case, why not use delegate_type == null to mean `is_delegate =
12966         false' and anything else as is_delegate = true.
12967
12968 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12969
12970         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12971         code for the section, not the beginning of the tests.
12972
12973 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12974
12975         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12976
12977         * expression.cs (Binary): same.  Warn about errors where we have
12978         Enum/Enum in operator + as well.
12979
12980 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12981
12982         * statement.cs:
12983                 - added support for switch(bool)
12984                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12985                 - add TableSwitchEmit() to handle table-based switch statements
12986
12987 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12988
12989         * expression.cs (Invocation.OverloadResolve): Factor out code which
12990         does parameter compatibility checking with arguments so that we can 
12991         re-use the code even from Delegate.VerifyApplicability
12992
12993         (VerifyArgumentsCompat): Move above code here.
12994
12995         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12996         and instead make a call to the above method.
12997
12998 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12999
13000         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
13001         We use it to keep track of classes which are attribute types.
13002
13003 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
13004
13005         * delegate.cs (Delegate.Define): Correctly define the types in the
13006         presence of fixed and array parameters.
13007
13008         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
13009         doing FindMembers.
13010
13011         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
13012         include NonPublic after the first iteration.
13013
13014         * class.cs (Indexer.CheckBase): Only check if both parents are
13015         non-null. 
13016
13017         * cs-parser.jay (accessor_body): If empty, set to null.
13018
13019         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
13020         same code path here to resolve constants names that we did have in
13021         MemberAccess.DoResolve.  There is too much code duplicated here.
13022
13023 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
13024
13025         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
13026
13027         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
13028         to MakeUnionSet.
13029
13030         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
13031         tokens, numbers and strings.
13032
13033         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
13034         parenthesis.
13035
13036         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
13037         asyncronous parameters and the regular parameters.  
13038
13039         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
13040         specify the target directory.
13041
13042         * expression.cs: (This.DoResolve): Simplify
13043         (As.Emit): Optimize, do not generate IsInst if the expression is
13044         always of the given type.
13045
13046         (Is.DoResolve): Bug fix, we were reporting both always/never for
13047         the is expression.
13048
13049         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
13050         creating too many unnecessary arrays.
13051
13052 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
13053
13054         * class.cs (EmitFieldInitializer): Use Assign expression to assign
13055         fields instead of rolling our own initializer.   Takes care of all
13056         implicit conversions, and drops unnecessary static checks/argument.
13057
13058 2002-03-31  Dick Porter  <dick@ximian.com>
13059
13060         * driver.cs: use the GetDirectories() return values properly, and
13061         use "/" as path separator.
13062
13063 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
13064
13065         * expression.cs (Unary): Optimize - - expr into expr.
13066         (Binary): Optimize a + (-b) into a -b.
13067
13068         * codegen.cs (CodeGen): Made all methods static.
13069
13070 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
13071
13072         * rootcontext.cs: 
13073
13074         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
13075         TypeBuilder property.
13076
13077         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
13078         instead. 
13079
13080         * tree.cs: Removed the various RecordXXXX, and replaced with a
13081         single RecordDecl.  Removed all the accessor methods, and just
13082         left a single access point Type 
13083
13084         * enum.cs: Rename DefineEnum to DefineType.
13085
13086         * decl.cs: New abstract method `DefineType' used to unify the
13087         Defines for Enumerations, Interfaces, TypeContainers and
13088         Delegates.
13089
13090         (FindType): Moved LookupInterfaceOrClass here.  Moved the
13091         LookupBaseClasses method that used to live in class.cs and
13092         interface.cs here, and renamed to FindType.
13093
13094         * delegate.cs: Implement DefineType.  Take advantage of the
13095         refactored pattern for locating the parent builder without taking
13096         the parent_builder argument (which we know does not work if we are
13097         nested, and triggering a toplevel definition).
13098
13099 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13100
13101         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
13102         accessibility of a member has changed during override and report
13103         an error if so.
13104
13105         * class.cs (Method.Define, Property.Define): Only complain on
13106         overrides if the method is private, any other accessibility is
13107         fine (and since we just checked the permission is the same, we are
13108         good to go).
13109
13110         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
13111         and elif are processed always.  The other pre-processing
13112         directives are only processed if we are "taking" the path
13113
13114 2002-03-29  Martin Baulig  <martin@gnome.org>
13115
13116         * class.cs (Method.Emit): Only emit symbolic debugging info if the
13117         current location is not Null.
13118
13119         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
13120         a separate method so we can profile it.
13121
13122         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
13123         `span.Seconds' are just seconds, but no minutes or hours.
13124         (MainDriver): Profile the CodeGen.SaveSymbols calls.
13125
13126 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13127
13128         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
13129         Remove the gratuitous set of Final:
13130
13131                                 // If an interface implementation, then we can set Final.
13132                                 if (((flags & MethodAttributes.Abstract) == 0) &&
13133                                     implementing.DeclaringType.IsInterface)
13134                                         flags |= MethodAttributes.Final;
13135
13136         I do not know what I was smoking when I used that.
13137
13138
13139         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
13140         step into fixing the name resolution issues for delegates and
13141         unifying the toplevel name resolution.
13142
13143 2002-03-28  Martin Baulig  <martin@gnome.org>
13144
13145         * class.cs (Method.Emit): If we have a symbol writer, call its
13146         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
13147         tell it about the current method.
13148
13149         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
13150         writer that we're going to emit the first byte of IL code for a new
13151         statement (a new source line).
13152         (EmitContext.EmitTopBlock): If we have a symbol writer, call
13153         EmitContext.Mark() before emitting any code.
13154
13155         * location.cs (SymbolDocument): Return null when we're Null.
13156
13157         * statement.cs (Statement): Moved the `Location loc' variable here.
13158         (Statement.EmitBoolExpression): If we have a symbol writer, call
13159         ec.Mark() before emitting any code to tell it that we're at the
13160         beginning of a new statement.
13161         (StatementExpression): Added `Location' argument to the constructor.
13162         (Block): Added public readonly variable `StartLocation' and public
13163         variable `EndLocation'.  The latter is to be set using SetEndLocation().
13164         (Block): Added constructor which takes a start and end location.
13165         (Block.SetEndLocation): New method. This sets the end location.
13166         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
13167         local variables we create.
13168         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
13169         each statement and do also mark the begin and end of the block.
13170
13171         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
13172         tell it the current lexer.Location, use Location.Null for the end of the
13173         block.
13174         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
13175         current block, set its end location using SetEndLocation().
13176         (statement_expression): StatementExpression constructor now takes the
13177         lexer.Location as additional argument.
13178         (for_statement, declare_local_variables): Likewise.
13179         (declare_local_variables): When creating a new implicit block, use the
13180         new Block constructor and pass it the lexer.Location.
13181
13182 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13183
13184         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
13185         members also on the parent interfaces recursively.
13186
13187 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
13188
13189         * report.cs: Use new formats, since Gonzalo finished the missing
13190         bits. 
13191
13192         * expression.cs (Binary.ResolveOperator): added missing operator|
13193         operator& and operator^ for bool/bool.
13194
13195         * cs-parser.jay: CheckDef now takes a Location argument that is
13196         used to report errors more precisly (instead of reporting the end
13197         of a definition, we try to track something which is a lot closer
13198         to the source of the problem).
13199
13200         * cs-tokenizer.cs: Track global token use, so we can properly flag
13201         the use of #define/#undef after the first token has been seen.
13202
13203         Also, rename the reportXXXX to Error_DescriptiveName
13204
13205         * decl.cs (DeclSpace.IsTopLevel): Move property here from
13206         TypeContainer, so that Enum and Interface can use this too.
13207
13208         * class.cs (TypeContainer.LookupInterfaceOrClass,
13209         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
13210         `builder' argument.  Typically this was used to pass the parent
13211         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
13212         the definition).  
13213
13214         The problem is that a nested class could trigger the definition of
13215         a toplevel class, and the builder would be obviously wrong in that
13216         case. 
13217
13218         So we drop this argument, and we compute dynamically the
13219         TypeBuilder/ModuleBuilder (the correct information was available
13220         to us anyways from DeclSpace.Parent)
13221
13222         * interface.cs (Interface.DefineInterface): Drop builder
13223         parameter cleanup like class.cs
13224
13225         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
13226         like class.cs
13227
13228         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
13229         values. 
13230
13231         (Try.Emit): Propagate the returns value from the statement.
13232
13233         (Return.Emit): Even if we are leavning 
13234
13235         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
13236
13237         * modifiers.cs: Fix the computation of MethodAttributes flags.
13238
13239 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
13240
13241         * driver.cs: allow compilation of files that start with '/'.
13242         Add a default case when checking the argument of --target.
13243
13244 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
13245
13246         * interface.cs: Implement the same search algorithm for types in
13247         the interface code.
13248
13249         * delegate.cs: Do not allow multiple definition.
13250
13251         * Recovered ChangeLog that got accidentally amputated
13252
13253         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
13254
13255         * rootcontext.cs: Load manually enum to allow core classes to
13256         contain enumerations.
13257
13258         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
13259         Update to new static methods in TypeManager.
13260
13261         * typemanager.cs (GetMethod, GetConstructor): Use our
13262         implementation of FindMembers to find the members, since during
13263         corlib compilation, the types are TypeBuilders and GetMethod and
13264         GetConstructor do not work.
13265
13266         Make all methods in TypeManager static.
13267
13268         (InitCodeHelpers): Split the functionality from
13269         the InitCodeTypes function.
13270
13271         * driver.cs: Call InitCodeHelpers after we have populated the
13272         types. 
13273
13274         * cs-parser.jay (delegate_declaration): we did not used to compute
13275         the delegate name correctly for void delegates.
13276
13277 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
13278
13279         * rootcontext.cs (RootContext): Init the interface_resolve_order
13280         and type_container_resolve_order always.
13281
13282         (ResolveCore, BootstrapCorlib_ResolveClass,
13283         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
13284         compiler when compiling with --nostdlib
13285
13286         * class.cs (TypeContainer.DefineType): Check that our parent is
13287         not null.  This test is most important when we are bootstraping
13288         the core types.
13289
13290         * codegen.cs: Split out the symbol writing code.
13291
13292 2002-03-25  Martin Baulig  <martin@gnome.org>
13293
13294         * driver.cs (-g): Made -g an alias for --debug.
13295
13296 2002-03-24  Martin Baulig  <martin@gnome.org>
13297
13298         * codegen.cs (SymbolWriter): New public variable. Returns the
13299         current symbol writer.
13300         (CodeGen): Added `bool want_debugging_support' argument to the
13301          constructor. If true, tell the ModuleBuild that we want debugging
13302         support and ask it for the ISymbolWriter.
13303         (Save): If we have a symbol writer, call it's Close() method after
13304         saving the assembly.
13305
13306         * driver.c (--debug): New command line argument to create a
13307         debugger information file.
13308
13309         * location.cs (SymbolDocument): New public property. Returns an
13310         ISymbolDocumentWriter object for the current source file or null
13311         if we don't have a symbol writer.
13312
13313 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
13314
13315         * driver.cs (LoadAssembly): Correctly return when all the paths
13316         have been tried and not before.
13317
13318         * statement.cs (Switch.Emit): return the actual coverage for this
13319         statement (returns/not-returns)
13320
13321         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
13322         switch of the statement if we are the last switch section.  That
13323         kills two problems: try/catch problems (we used to emit an empty
13324         nop at the end) and switch statements where all branches would
13325         return. 
13326
13327 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
13328
13329         * driver.cs: Add default assemblies (the equivalent to the
13330         Microsoft CSC.RSP file)
13331
13332         * cs-tokenizer.cs: When updating `cols and setting it to zero,
13333         also update tokens_seen and set it to false.
13334
13335         * driver.cs: Implement --recurse for Mike.
13336
13337         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
13338         correctly splitting out the paths.
13339
13340 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
13341
13342         * interface.cs (Interface.PopulateProperty): Instead of using
13343         `parent' as the declaration space for the set parameters, use
13344         `this' 
13345
13346         * support.cs (InternalParameters): InternalParameters constructor
13347         takes a DeclSpace instead of a TypeContainer.
13348
13349         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
13350         types are being initialized, load the address of it before calling
13351         the function.  
13352
13353         (New): Provide a mechanism to disable the generation of local
13354         value type temporaries when the caller will be providing us with
13355         an address to store it.
13356
13357         (ArrayCreation.EmitDynamicInitializers): Use it.
13358
13359 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
13360
13361         * expression.cs (Invocation.EmitArguments): Only probe for array
13362         property if there is more than one argument.  Sorry about that.
13363
13364         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
13365         empty param arrays.
13366
13367         * class.cs (Method.LabelParameters): Fix incorrect code path that
13368         prevented the `ParamArrayAttribute' from being applied to the
13369         params attribute.
13370
13371 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
13372
13373         * support.cs (ReflectionParameters): Correctly compute whether the
13374         last argument is a params array.  Fixes the problem with
13375         string.Split ('a')
13376
13377         * typemanager.cs: Make the assemblies array always be non-null
13378         (empty, but non-null)
13379
13380         * tree.cs (RecordDecl): New function that abstracts the recording
13381         of names.  This reports error 101, and provides a pointer to the
13382         previous declaration.  Fixes a crash in the compiler.
13383
13384         * cs-parser.jay (constructor_declaration): Update to new grammar,
13385         and provide a constructor_body that can be empty.
13386
13387 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
13388
13389         * driver.cs: Add support for --resources.
13390
13391         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
13392         Make all types for the various array helper methods be integer.
13393
13394         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
13395         CheckState to ConvCast.
13396
13397         (ConvCast): Now it takes a `checked' state argument, to avoid
13398         depending on the emit context for the conversion, and just using
13399         the resolve time setting.
13400
13401         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
13402         instead of Invocation.EmitArguments.  We do not emit the original
13403         arguments, instead we emit those which have been converted to
13404         unsigned int expressions.
13405
13406         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
13407
13408         * codegen.cs: ditto.
13409
13410         * expression.cs (LocalVariableReference): Drop the use of the
13411         Store function that depended on the variable index.
13412
13413         * statement.cs (VariableInfo): Drop the `Idx' property from this
13414         class, as this is not taking into account the indexes for
13415         temporaries tat we generate during the execution, getting the
13416         indexes wrong.
13417
13418         * class.cs: First emit class initializers, then call the parent
13419         constructor. 
13420
13421         * expression.cs (Binary): Fix opcode emision.
13422         (UnaryMutator.EmitCode): Support checked code generation
13423
13424         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
13425         matches for events for both the Static and Instance scans,
13426         pointing to the same element.   Fix that.
13427
13428 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
13429
13430         * rootcontext.cs (ResolveTree): Always set the
13431         interface_resolve_order, because nested interfaces will be calling
13432         into us.
13433
13434         * class.cs (GetInterfaceOrClass): Track the same resolution
13435         process used by TypeManager.LookupType.  This fixes the nested
13436         type lookups in class declarations (separate path from
13437         LookupType). 
13438
13439         (TypeContainer.DefineType): Also define nested interfaces.
13440         (TypeContainer.RegisterOrder): New public function used to
13441         register the order in which child interfaces need to be closed.
13442
13443         Nested interfaces need to be closed after their parents have been
13444         created. 
13445
13446         * interface.cs (InterfaceAttr): Put all the logic for computing
13447         the interface attribute here. 
13448
13449         (DefineInterface): Register our interface order with the
13450         RootContext or with the TypeContainer depending on the case.
13451
13452 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13453
13454         * cs-parser.jay: rework foreach statement to work with the new
13455         changes to the policy on SimpleNames.
13456
13457         * report.cs: support Stacktrace on warnings as well.
13458
13459         * makefile: drop --unsafe and /unsafe from the compile.
13460
13461 2002-03-13  Ravi Pratap  <ravi@ximian.com>
13462
13463         * ecore.cs (StandardConversionExists): Modify to take an Expression
13464         as the first parameter. Ensure we do null -> reference type conversion
13465         checking.
13466
13467         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
13468         temporary Expression objects.
13469
13470 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
13471
13472         * interface.cs: workaround bug in method overloading resolution
13473         (there is already a bugzilla bug for it).
13474
13475 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13476
13477         We could also solve this problem by having a separate path for
13478         performing type lookups, instead of DoResolve, we could have a
13479         ResolveType entry point, and only participating pieces of the
13480         production (simplename, deref, array) would implement this. 
13481
13482         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
13483         signal SimpleName to only resolve type names and not attempt to
13484         resolve anything else.
13485
13486         * expression.cs (Cast): Set the flag.
13487
13488         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
13489
13490         * class.cs: Only report 108 if there is no `new' modifier.
13491
13492         * cs-parser.jay: rework foreach statement to work with the new
13493         changes to the policy on SimpleNames.
13494         
13495         * report.cs: support Stacktrace on warnings as well.
13496
13497         * makefile: drop --unsafe and /unsafe from the compile.
13498
13499 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
13500
13501         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13502         lookups here, instead of doing that at parse time.  This means
13503         that our grammar will not introduce `LocalVariableReferences' as
13504         expressions at this point.  That solves the problem of code like
13505         this:
13506
13507         class X {
13508            static void Main ()
13509            { int X = 1;
13510             { X x = null }}}
13511
13512         This is only half the fix.  The full fix requires parameters to
13513         also be handled in this way.
13514
13515         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
13516         makes the use more obvious of the DeclSpace.  The
13517         ec.TypeContainer.TypeBuilder is now only used to pull the
13518         TypeBuilder for it.
13519
13520         My theory is that I can get rid of the TypeBuilder completely from
13521         the EmitContext, and have typecasts where it is used (from
13522         DeclSpace to where it matters).  
13523
13524         The only pending problem is that the code that implements Aliases
13525         is on TypeContainer, and probably should go in DeclSpace.
13526
13527         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
13528         lookups here, instead of doing that at parse time.  This means
13529         that our grammar will not introduce `LocalVariableReferences' as
13530         expressions at this point.  That solves the problem of code like
13531         this:
13532
13533         class X {
13534            static void Main ()
13535            { int X = 1;
13536             { X x = null }}}
13537
13538         This is only half the fix.  The full fix requires parameters to
13539         also be handled in this way.
13540
13541         * class.cs (Property.DefineMethod): When implementing an interface
13542         method, set newslot, when implementing an abstract method, do not
13543         set the flag (before we tried never setting it, or always setting
13544         it, which is the difference).
13545         (Indexer.DefineMethod): same.
13546         (Method.DefineMethod): same.
13547
13548         * ecore.cs: Only set the status used flag if we get back a Field.
13549
13550         * attribute.cs: Temporary hack, so Paolo can keep working.
13551
13552 2002-03-08  Ravi Pratap  <ravi@ximian.com>
13553
13554         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
13555         the unmanaged type in the case we have a MarshalAs attribute.
13556
13557         (Resolve): Handle the case when we are parsing the special MarshalAs
13558         attribute [we need to store the unmanaged type to use later]
13559
13560         * typemanager.cs (marshal_as_attr_type): Built in type for the 
13561         MarshalAs Attribute.
13562
13563         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
13564         on parameters and accordingly set the marshalling info.
13565
13566 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
13567
13568         * class.cs: Optimizing slightly by removing redundant code after
13569         we switched to the `NoTypes' return value.
13570         (Property.DefineMethod): use NoTypes here too.
13571
13572         This fixes the bug I introduced in my last batch of changes.
13573
13574 2002-03-05  Ravi Pratap  <ravi@ximian.com>
13575
13576         * tree.cs (RecordEnum): Add. We now keep track of enums too.
13577
13578         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
13579         Enums since those are types too. 
13580
13581         * cs-parser.jay (enum_declaration): Record enums as we parse them.
13582
13583         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
13584         thanks to a call during the lookup process.
13585
13586 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
13587
13588         * statement.cs (Foreach): Lots of work to accomodate a particular
13589         kind of foreach statement that I had not kept in mind.  It is
13590         possible to have foreachs on classes that provide a GetEnumerator
13591         method that return objects that implement the "pattern" for using
13592         a foreach, there is no need to support GetEnumerator
13593         specifically. 
13594
13595         This is needed to compile nant.
13596
13597         * decl.cs: Only report 114 if the member is not `Finalize' and if
13598         the warning level is at least 2.
13599
13600         * class.cs: Moved the compare function from Method to
13601         MethodSignature. 
13602
13603         (MethodSignature.InheritableMemberSignatureCompare): Add new
13604         filter function that is used to extract inheritable methods from a
13605         class. 
13606
13607         (Method.Define): Use the new `inheritable_method_signature_filter'
13608         delegate
13609
13610         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
13611         command. 
13612
13613 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
13614
13615         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
13616
13617         * cs-parser.jay: Add opt_semicolon to the interface declaration.
13618
13619         * expression.cs: Pass location information to
13620         ConvertImplicitStandard. 
13621
13622         * class.cs: Added debugging code to track return values from
13623         interfaces. 
13624
13625 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
13626
13627         * expression.cs (Is.DoResolve): If either side of the `is' is an
13628         interface, do not flag the warning.
13629
13630         * ecore.cs (ImplicitReferenceConversion): We need a separate test
13631         for interfaces
13632
13633         * report.cs: Allow for --fatal to be used with --probe.
13634
13635         * typemanager.cs (NoTypes): Move the definition for the empty Type
13636         array here. 
13637
13638         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
13639         properties. 
13640         (TypeContainer.DefineProxy): New function used to proxy to parent
13641         implementations when implementing interfaces.
13642         (TypeContainer.ParentImplements): used to lookup if our parent
13643         implements a public function that is required by an interface.
13644         (TypeContainer.VerifyPendingMethods): Hook this up.
13645
13646         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
13647         `modules' and `assemblies' arraylists into arrays.  We only grow
13648         these are the very early start up of the program, so this improves
13649         the speedof LookupType (nicely measured).
13650
13651         * expression.cs (MakeByteBlob): Replaced unsafe code with
13652         BitConverter, as suggested by Paolo.
13653
13654         * cfold.cs (ConstantFold.Binary): Special case: perform constant
13655         folding of string concatenation, but if either side is a string,
13656         and the other is not, then return null, and let the runtime use
13657         the concatenation on the string plus the object (using
13658         `Object.ToString'). 
13659
13660 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
13661
13662         Constant Folding has been implemented now.
13663
13664         * expression.cs (Unary.Reduce): Do not throw an exception, catch
13665         the error instead on types that are not supported in one's
13666         complement. 
13667
13668         * constant.cs (Constant and all children): New set of functions to
13669         perform implict and explicit conversions.
13670
13671         * ecore.cs (EnumConstant): Implement the new functions to perform
13672         conversion by proxying to the child expression.
13673
13674         * codegen.cs: (ConstantCheckState): Constant evaluation has its
13675         own separate setting that can not be turned off from the command
13676         line using --unchecked or --checked and is only controlled using
13677         the checked/unchecked statements and expressions.  This setting is
13678         used by the constant folder to flag errors.
13679
13680         * expression.cs (CheckedExpr, UncheckedExpr): Set the
13681         ConstantCheckState as well.   
13682
13683         During Resolve, they also have to flag the state, because the
13684         constant folder runs completely in the Resolve phase.
13685
13686         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
13687         well.
13688
13689 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13690
13691         * cfold.cs: New file, this file contains the constant folder.
13692
13693         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
13694         argument to track whether we are using the resulting address to
13695         load or store a value and provide better error messages. 
13696
13697         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
13698         new AddressOf arguments.
13699
13700         * statement.cs (Foreach.EmitCollectionForeach): Update
13701
13702         * expression.cs (Argument.Emit): Call AddressOf with proper
13703         arguments to track usage.
13704
13705         (New.DoEmit): Call AddressOf with new arguments.
13706
13707         (Unary.Emit): Adjust AddressOf call.
13708
13709 2002-03-01  Ravi Pratap  <ravi@ximian.com>
13710
13711         * cs-parser.jay (member_access): Change the case for pre-defined types
13712         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
13713         this suggestion.
13714
13715         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
13716         a method body.
13717
13718         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
13719         essentially like methods and apply attributes like MethodImplOptions to them too.
13720
13721         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
13722         not being null.
13723
13724         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
13725         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
13726         is the DeclSpace.
13727
13728         * Update code everywhere accordingly.
13729
13730         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
13731
13732         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
13733
13734 2002-02-28  Ravi Pratap  <ravi@ximian.com>
13735
13736         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
13737         try performing lookups against those instead of jumping straight into using
13738         the 'using' clauses.
13739
13740         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
13741
13742         (LookupType): Perform lookups in implicit parents too.
13743
13744         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
13745         sequence as RootContext.LookupType. 
13746
13747         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
13748         the various cases of namespace lookups into this method.
13749
13750 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13751
13752         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
13753         in positional arguments)
13754
13755         * class.cs (Operator): Update the AllowedModifiers to contain
13756         extern. 
13757
13758         * cs-parser.jay: Update operator declaration to allow for the
13759         operator body to be empty.
13760
13761         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
13762         values. 
13763
13764 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
13765
13766         * class.cs (Method.Emit): Label parameters.
13767
13768         * driver.cs: Return 1 or 0 as the program exit code.
13769
13770 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13771
13772         * expression.cs: Special case the `null' object when trying to
13773         auto-compute the type, as anything can be explicitly converted to
13774         that. 
13775
13776         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13777         spotting this Paolo.
13778
13779         (Expression.ImplicitNumericConversion): Perform comparissions of
13780         the type using the underlying type in the case of an enumeration
13781         rather than using the enumeration type for the compare.
13782
13783         Cope with the underlying == type case, which is not possible to
13784         catch before. 
13785
13786         (Expression.ConvertNumericExplicit): Perform comparissions of
13787         the type using the underlying type in the case of an enumeration
13788         rather than using the enumeration type for the compare.
13789
13790         * driver.cs: If the user does not supply an extension, assume .exe
13791
13792         * cs-parser.jay (if_statement): Rewrote so that we can track the
13793         location for the if statement.
13794
13795         * expression.cs (Binary.ConstantFold): Only concat strings when
13796         the operation is "+", not everything ;-)
13797
13798         * statement.cs (Statement.EmitBoolExpression): Take a location
13799         argument. 
13800         (If, While, Do): Track location.
13801
13802         * expression.cs (Binary.ResolveOperator): In the object + string
13803         case, I was missing a call to ConvertImplicit
13804
13805 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13806
13807         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13808         Location arguments. Ensure we use RootContext.LookupType to do our work
13809         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13810
13811         * interface.cs (PopulateMethod): Handle the type of the parameter being
13812         null gracefully.
13813
13814         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13815         have a params method with no fixed arguments and a call is made with no
13816         arguments.
13817
13818 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13819
13820         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13821         the verbatim-string-literal
13822
13823         * support.cs (InternalParameters.ParameterModifier): handle null
13824         fixed parameters.
13825         (InternalParameters.ParameterType): ditto.
13826
13827         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13828         duplicating the name of the variable parameter.
13829         (GetParameterByName): Fix bug where we were not looking up array
13830         paramters if they were the only present (thanks Paolo!).
13831         (GetParameterInfo): We only have an empty set of types if both
13832         fixed and array are set to null.
13833         (GetParameterInfo-idx): Handle FixedParameter == null
13834
13835         * cs-parser.jay: Handle the case where there is no catch
13836         statements (missing null test).
13837
13838 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13839
13840         * driver.cs (MainDriver): Be conservative on our command line
13841         handling.
13842
13843         Catch DirectoryNotFoundException when calling GetFiles.
13844
13845         (SplitPathAndPattern): Used to split the input specification into
13846         a path and a pattern that we can feed to Directory.GetFiles.
13847
13848 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13849
13850         * statement.cs (Fixed): Implement the last case of the Fixed
13851         statement (string handling).
13852
13853         * expression.cs (StringPtr): New class used to return a char * to
13854         a string;  Used by the Fixed statement.
13855
13856         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13857
13858         * expression.cs (Binary.ResolveOperator): Remove redundant
13859         MemberLookup pn parent type.
13860         Optimize union call, we do not need a union if the types are the same.
13861         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13862         type.
13863
13864         Specialize the use of MemberLookup everywhere, instead of using
13865         the default settings. 
13866
13867         (StackAlloc): Implement stackalloc keyword.
13868
13869         * cs-parser.jay: Add rule to parse stackalloc.
13870
13871         * driver.cs: Handle /h, /help, /?
13872
13873         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13874         before we supported unsafe code.
13875
13876         * makefile: add --unsafe to the self compilation of mcs.
13877
13878 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13879
13880         * expression.cs (PointerArithmetic): New class that is used to
13881         perform pointer arithmetic.
13882         (Binary.Resolve): Handle pointer arithmetic
13883         Handle pointer comparission.
13884         (ArrayPtr): Utility expression class that is used to take the
13885         address of an array.
13886
13887         (ElementAccess): Implement array access for pointers
13888
13889         * statement.cs (Fixed): Implement fixed statement for arrays, we
13890         are missing one more case before we are done.
13891
13892         * expression.cs (Indirection): Implement EmitAssign and set the
13893         ExprClass to Variable.  This allows pointer dereferences to be
13894         treated as variables, and to have values assigned to them.
13895
13896         * ecore.cs (Expression.StoreFromPtr): New utility function to
13897         store values dereferencing.
13898
13899 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13900
13901         * expression.cs (Binary.ResolveOperator): Ensure that we are
13902         not trying to operate on a void type - this fixes the reported
13903         bug.
13904
13905         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13906         the parent implementation is sealed.
13907
13908         * ../errors/cs0239.cs : Add.
13909
13910         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13911
13912         * typemanager.cs (unverifiable_code_type): Corresponds to 
13913         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13914         which have unsafe code in them.
13915
13916         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13917         unsafe context.
13918
13919 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13920
13921         * cs-tokenizer.cs: Add support for @"litreal strings"
13922
13923         Make tokenizer accept pre-processor directives
13924         on any column (remove the old C-like limitation). 
13925
13926         * rootcontext.cs (EmitCode): Emit any global attributes.
13927         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13928
13929         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13930
13931         * cs-parser.jay: Add support for global attributes.  
13932
13933 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13934
13935         * expression.cs (Indirection): New helper class.  Unary will
13936         create Indirection classes to be able to implement the
13937         IMemoryLocation interface on it.
13938
13939 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13940
13941         * cs-parser.jay (fixed_statement): reference the right statement.
13942
13943         * statement.cs (Fixed.Emit): Finish implementing the fixed
13944         statement for the &x case.
13945
13946 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13947
13948         * class.cs (Property.Define, Method.Define): Remove newslot when
13949         `implementing'.  
13950
13951         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13952         wrong.  NewSlot should only be used if the `new' keyword is present.
13953
13954         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13955         locating our system dir.  Sorry about this.
13956
13957 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13958
13959         * driver.cs (GetSystemDir): Compute correctly the location of our
13960         system assemblies.  I was using the compiler directory instead of
13961         the library directory.
13962
13963 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13964
13965         * expression.cs (BetterFunction): Put back in what Miguel commented out
13966         since it is the correct fix. The problem is elsewhere ;-)
13967
13968         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13969         parameters of the parms method are themselves compatible or not !
13970
13971         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13972         to check that a class implements an interface before saying that an implicit
13973         conversion was allowed. Use ImplementsInterface to do the checking.
13974
13975 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13976
13977         * class.cs (Method.Define): Track whether we are an explicit
13978         implementation or not.  And only call DefineMethodOverride if we
13979         are an explicit implementation.
13980
13981         (Property.DefineMethod): Ditto.
13982
13983 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13984
13985         * expression.cs (BetterFunction): Catch hideous bug which was
13986          preventing us from detecting ambiguous calls due to implicit casts i.e
13987         cs0121.
13988
13989 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13990
13991         * support.cs (Pair): Remove un-needed method.  I figured why I was
13992         getting the error in cs-parser.jay, the variable in a foreach loop
13993         is readonly, and the compiler does not really treat this as a variable.
13994
13995         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13996         instead of EQUALS in grammar.  
13997
13998         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13999
14000         * expression.cs (Unary.DoResolve): Check whether the argument is
14001         managed or not.
14002
14003 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
14004
14005         * support.cs: Api for Pair to set a value.  Despite the fact that
14006         the variables are public the MS C# compiler refuses to compile
14007         code that accesses the field if the variable is part of a foreach
14008         statement. 
14009
14010         * statement.cs (Fixed): Begin implementation of the fixed
14011         statement.
14012
14013         (Block.AddVariable): Return the VariableInfo on success and null
14014         on failure instead of true/false. 
14015
14016         * cs-parser.jay (foreach): Catch errors on variables already
14017         defined (we were ignoring this value before) and properly unwind
14018         the block hierarchy
14019
14020         (fixed_statement): grammar for the fixed statement.
14021
14022 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
14023
14024         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
14025         pointer types to be incretemented.
14026
14027         (SizeOf): Implement.
14028
14029         * cs-parser.jay (pointer_member_access): Implement
14030         expr->IDENTIFIER production.
14031
14032         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
14033         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
14034         on safe contexts.
14035
14036         (Unary): Implement indirection.
14037
14038         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
14039         use in non-unsafe context).
14040
14041         (SimpleName.DoResolve): Check for pointers in field access on safe
14042         contexts. 
14043
14044         (Expression.LoadFromPtr): Factor the load-indirect code in this
14045         function.  This was duplicated in UnboxCast and ParameterReference
14046
14047 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
14048
14049         * expression.cs (ComposedCast): report an error if a pointer cast
14050         is used in a safe region.
14051
14052         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
14053         pointer type casts in unsafe context.
14054
14055         * codegen.cs (EmitContext): Set up IsUnsafe.
14056
14057         * cs-parser.jay (non_expression_type): Add productions for pointer
14058         casts. 
14059
14060         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
14061         code.  We should not use force into static mode if the method is
14062         not virtual.  Fixes bug in MIS
14063
14064         * statement.cs (Do.Emit, While.Emit, For.Emit,
14065         Statement.EmitBoolExpression): Add support to Do and While to
14066         propagate infinite loop as `I do return' semantics.
14067
14068         Improve the For case to also test for boolean constants.
14069
14070         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
14071         to the list of attributes we can add.
14072
14073         Remove `EmitContext' argument.
14074
14075         * class.cs (Method.Define): Apply parameter attributes.
14076         (Constructor.Define): Apply parameter attributes.
14077         (MethodCore.LabelParameters): Move here the core of labeling
14078         parameters. 
14079
14080         * support.cs (ReflectionParameters.ParameterModifier,
14081         InternalParameters.ParameterModifier): Use IsByRef on the type and
14082         only return the OUT bit for these parameters instead of in/out/ref
14083         flags.
14084
14085         This is because I miss-understood things.  The ParameterInfo.IsIn
14086         and IsOut represent whether the parameter has the [In] and [Out]
14087         attributes set.  
14088
14089 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
14090
14091         * ecore.cs (FieldExpr.Emit): Release temporaries.
14092
14093         * assign.cs (LocalTemporary.Release): new function.
14094
14095         * codegen.cs (EmitContext.GetTemporaryStorage,
14096         EmitContext.FreeTemporaryStorage): Rework the way we deal with
14097         temporary storage.  Now we can "put back" localbuilders when we
14098         are done with them
14099
14100 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
14101
14102         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
14103         need to make a copy of the variable to generate verifiable code.
14104
14105 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
14106
14107         * driver.cs: Compute dynamically the system directory.
14108
14109         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
14110         Slower, but more generally useful.  Used by the abstract
14111         registering implementation. 
14112
14113         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
14114         the rules for the special rule on Type/instances.  First check if
14115         we have the same name, and if so, try that special static path
14116         rather than the instance path.
14117
14118 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
14119
14120         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
14121         for, while and if.
14122
14123         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
14124         Enum, ValueType, Delegate or Array for non-corlib compiles.
14125
14126         * cs-tokenizer.cs: Catch long identifiers (645)
14127
14128         * typemanager.cs (IndexerPropetyName): Ravi never tested this
14129         piece of code.
14130
14131         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
14132         fix, we were returning too early, so we were not registering
14133         pending methods from abstract classes.
14134
14135         Do not register pending methods if the class is abstract.
14136
14137         * expression.cs (Conditional.DoResolve): Report circular implicit
14138         conversions when we neecd to compute it for conditional
14139         expressions. 
14140
14141         (Is.DoResolve): If the expression is always of the provided type,
14142         flag warning 183.  If the expression can not ever be of the
14143         provided type flag warning 184.
14144
14145         * class.cs: Catch 169 as well.
14146
14147         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
14148         read. 
14149
14150 2002-01-18  Nick Drochak  <ndrochak@gol.com>
14151
14152         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
14153
14154 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
14155
14156         * interface.cs: (PopulateMethod): Check for pointers being defined
14157         only if the unsafe context is active.
14158         (PopulateProperty): ditto.
14159         (PopulateIndexer): ditto.
14160
14161         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
14162         specified.  If pointers are present, make sure that they are
14163         present in an unsafe context.
14164         (Constructor, Constructor.Define): ditto.
14165         (Field, Field.Define): ditto.
14166         (Property, Property.Define): ditto.
14167         (Event, Event.Define): ditto.
14168
14169         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
14170         hashtable if there are classes or structs defined.
14171
14172         * expression.cs (LocalVariableReference.DoResolve): Simplify this
14173         code, as the constant resolution moved.
14174
14175         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
14176         the metadata, so we can flag error 133. 
14177
14178         * decl.cs (MemberCore.UnsafeOK): New function to test that a
14179         pointer is being declared in an unsafe context.
14180
14181 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
14182
14183         * modifiers.cs (Modifiers.Check): Require a Location argument.
14184         Report error 227 for Unsafe use.
14185
14186         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
14187
14188         * statement.cs (For.Emit): If the test is null, then report that
14189         we do `return', as we wont reach anything afterwards.
14190
14191         (Switch.SwitchGoverningType): Track the expression that matched
14192         the conversion.
14193
14194         * driver.cs: Allow negative numbers as an error code to flag.
14195
14196         * cs-parser.jay: Handle 1551.
14197
14198         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
14199
14200 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14201
14202         * cs-parser.jay: Report 1518 (type declaration can only contain
14203         class, struct, interface, enum or delegate)
14204
14205         (switch_label): Report 1523 (keywords `case' or `default' must
14206         preced code)
14207
14208         (opt_switch_sections): Report 1522 (empty switch)
14209
14210         * driver.cs: Report 1515 (response file specified multiple times)
14211         Report 1516 (Source file specified multiple times).
14212
14213         * expression.cs (Argument.Resolve): Signal 1510
14214
14215         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
14216         access not allowed in static code)
14217
14218 2002-01-11  Ravi Pratap  <ravi@ximian.com>
14219
14220         * typemanager.cs (IsPointerType): Utility method which we are going
14221         to need a lot.
14222
14223         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
14224         the object type, so we take care of that.
14225
14226         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
14227
14228         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
14229         added to non-params parameters :-)
14230
14231         * typemanager.cs (CSharpName): Include 'void' type too. 
14232
14233         (void_ptr_type): Include in the set of core types.
14234
14235         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
14236         duplicating code.
14237
14238         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
14239         an unsafe context.
14240
14241         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
14242         completely forgotten about it.
14243
14244 2002-01-10  Ravi Pratap  <ravi@ximian.com>
14245
14246         * cs-parser.jay (pointer_type): Add. This begins our implementation
14247         of parsing rules for unsafe code.
14248
14249         (unsafe_statement): Implement.
14250
14251         (embedded_statement): Modify to include the above.
14252
14253         * statement.cs (Unsafe): Implement new class for unsafe blocks.
14254
14255         * codegen.cs (EmitContext.InUnsafe): Add. This determines
14256         if the current context is an unsafe one.
14257
14258         * cs-parser.jay (local_variable_pointer_type): Since local variable types
14259         are handled differently, we need separate rules for them.
14260
14261         (local_variable_declaration): Update to use local_variable_pointer_type
14262         to allow variable declarations of unmanaged pointer types.
14263
14264         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
14265         in unsafe contexts.
14266
14267         * ../errors/cs0214.cs : Add.
14268
14269 2002-01-16  Nick Drochak  <ndrochak@gol.com>
14270
14271         * makefile: remove 'response' file when cleaning.
14272
14273 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14274
14275         * cs-parser.jay: Report 1524.
14276
14277 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
14278
14279         * typemanager.cs (RegisterMethod): drop checking if we have
14280         registered this from here
14281
14282 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
14283
14284         * class.cs (Method.EmitDestructor): Implement calling our base
14285         destructor. 
14286
14287         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
14288         value of InFinally.
14289
14290         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
14291         this routine and will wrap the call in a try/catch block.  Deal
14292         with the case.
14293
14294 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
14295
14296         * ecore.cs (Expression.MemberLookup): instead of taking a
14297         parameter `same_type' that was used to tell whether we could
14298         access private members we compute our containing type from the
14299         EmitContext.
14300
14301         (FieldExpr): Added partial support for volatile fields.  This does
14302         not work for volatile fields exposed from assemblies, as I can not
14303         figure out how to extract the modreq from it.
14304
14305         Updated all the source files to use this.
14306
14307         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
14308         because it is referenced by MemberLookup very often. 
14309
14310 2002-01-09  Ravi Pratap  <ravi@ximian.com>
14311
14312         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
14313         TypeBuilder.GetCustomAttributes to retrieve what we need.
14314
14315         Get rid of redundant default_member_attr_type as this is the same as
14316         default_member_type which already exists.
14317
14318         * interface.cs, attribute.cs : Update accordingly.
14319
14320 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
14321
14322         * typemanager.cs: Enable IndexerPropertyName again.  It does not
14323         work for TYpeBuilders though.  Ravi, can you please fix this?
14324
14325         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
14326
14327         * expression.cs (Argument.Emit): Handle the case of ref objects
14328         being passed to ref functions;  
14329
14330         (ParameterReference.EmitLoad): Loads the content of the pointer
14331         without dereferencing.
14332
14333 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14334
14335         * cs-tokenizer.cs: Implemented the pre-processing expressions.
14336
14337 2002-01-08  Ravi Pratap  <ravi@ximian.com>
14338
14339         * class.cs (Indexer.DefineMethod): Incorporate the interface
14340         type in the name of the method if we are doing explicit interface
14341         implementation.
14342
14343         * expression.cs (ConversionExists): Remove as it is completely obsolete.
14344
14345         (BetterConversion): Fix extremely trivial bug where we were referring to
14346         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
14347         again !
14348
14349         * ../errors/bug16.cs : Add although we have fixed it.
14350
14351 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14352
14353         * expression.cs (BaseIndexer): Begin implementation.
14354
14355         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
14356
14357         * cs-parser.jay (indexer_declarator): Use qualified_identifier
14358         production directly to remove a shift/reduce, and implement
14359         explicit interface implementation.
14360
14361         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
14362         after a floating point suffix.
14363
14364         * expression.cs (DoNumericPromotions): Improved the conversion for
14365         uint/uint.  If we have a constant, we avoid doing a typecast to a
14366         larger type.
14367
14368         * class.cs (Indexer): Implement explicit interface implementation
14369         for indexers.
14370
14371 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
14372
14373         * class.cs: make the default instance constructor public and hidebysig.
14374
14375 2001-01-03  Ravi Pratap  <ravi@ximian.com>
14376
14377         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
14378         so we can call it from elsewhere.
14379
14380         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
14381         we emit it internally if the class has a defined indexer; otherwise the user
14382         emits it by decorating the class definition with the DefaultMemberAttribute.
14383
14384         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
14385         attribute is not used on a type which defines an indexer.
14386
14387         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
14388         character when we skip whitespace.
14389
14390         * ../errors/cs0646.cs : Add.
14391
14392 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
14393
14394         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
14395         again. 
14396
14397         * makefile: Add practical target `mcs3.exe' which builds the third
14398         generation compiler. 
14399
14400         * expression.cs (New): Fix structures constructor calling.
14401
14402         * class.cs (Property, Method, Indexer): Emit Final flag on the
14403         method if we are an interface implementation and we are not
14404         abstract. 
14405
14406         * ecore.cs (PropertyExpr): New public field `IsBase', tells
14407         whether this property is referencing a `base' method.
14408
14409         * expression.cs (Invocation.EmitCall): take an extra argument:
14410         is_base, this is used to determine whether the `call' or
14411         `callvirt' opcode should be used.
14412
14413
14414         * delegate.cs: update EmitCall.
14415
14416         * class.cs (Method.Define): Set NewSlot for the cases where we are
14417         not implementing an interface method.
14418
14419         (Property.Define): ditto.
14420
14421 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
14422
14423         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
14424         'r'.  Allows mcs to parse itself fully.
14425
14426 2002-01-02  Ravi Pratap  <ravi@ximian.com>
14427
14428         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
14429         of the number of initializers that require the InitializeArray method.
14430
14431         (CheckIndices): Store the Expression in all cases - not the plain value. Also
14432         update the above field where necessary.
14433
14434         (MakeByteBlob): Update accordingly.
14435
14436         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
14437         greater than 2.
14438
14439         (EmitDynamicInitializers): Update in accordance with the new optimization.
14440
14441         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
14442         same OpCode applies.
14443
14444         * cs-parser.jay : Fix some glaring errors I introduced.
14445
14446 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
14447
14448         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
14449         so that we can check for name clashes there too.
14450
14451         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
14452         for interface indexers.
14453
14454         * interfaces.cs (Define): Emit the default member attribute.
14455
14456         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
14457         variable was being referred to while setting the value ;-)
14458
14459 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
14460
14461         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
14462         byte-by-byte information when we know the data is zero.
14463
14464         Make the block always a multiple of 4, because
14465         DefineInitializedData has a bug.
14466
14467         * assign.cs: Fix, we should assign from the temporary, not from
14468         the source. 
14469
14470         * expression.cs (MakeByteBlob): Fix my incorrect code.
14471
14472 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
14473
14474         * typemanager.cs (EnumToUnderlying): This function is used to get
14475         the underlying type from an enumeration, because it does not
14476         always work. 
14477
14478         * constant.cs: Use the I4_S form for values between -128 and 127.
14479
14480         * statement.cs (Block.LookupLabel): Looks up a label.
14481         (Block): Drop support for labeled blocks.
14482
14483         (LabeledStatement): New kind of statement that represents a label
14484         only.
14485
14486         (Goto): Finally implement this bad boy.
14487
14488         * cs-parser.jay: Update to reflect new mechanism to implement
14489         labels.
14490
14491 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
14492
14493         * codegen.cs (EmitContext.This): a codegen property that keeps the
14494         a single instance of this instead of creating many different this
14495         instances. 
14496
14497         * delegate.cs (Delegate.DoResolve): Update to use the property;
14498
14499         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
14500
14501         * expression.cs (BaseAccess.DoResolve): Ditto.
14502
14503 2001-12-29  Ravi Pratap  <ravi@ximian.com>
14504
14505         * typemanager.cs (methodimpl_attr_type): Add to hold the type
14506         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
14507
14508         (InitCoreTypes): Update accordingly.
14509
14510         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
14511         so we can quickly store the state.
14512
14513         (ApplyAttributes): Set the correct implementation flags
14514         for InternalCall methods.
14515
14516 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
14517
14518         * expression.cs (EmitCall): if a method is not virtual, then do
14519         not use callvirt on it.
14520
14521         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
14522         user defined stuff) requires the use of stobj, which takes an
14523         address on the stack instead of an array and an index.  So emit
14524         the Ldelema operation for it.
14525
14526         (EmitStoreOpcode): Use stobj for valuetypes.
14527
14528         (UnaryMutator.EmitCode): Use the right 1 value depending on
14529         whether we are dealing with int64/uint64, float or doubles.
14530
14531         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
14532         constructors that I implemented last night.
14533
14534         (Constructor.IsDefault): Fix to work properly for static
14535         constructors.
14536
14537         * cs-parser.jay (CheckDef): report method signature errors.
14538         Update error number 103 to be 132.
14539
14540         * decl.cs: New AdditionResult enumeration value: MethodExists.
14541         Although we do this check for methods later on in the semantic
14542         analysis, catching repeated default constructors is so easy that
14543         we catch these here. 
14544
14545         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
14546         promotions code.
14547
14548         (ParameterReference.EmitAssign, Emit): handle
14549         bools as bytes.
14550
14551         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
14552         (ArrayAccess.EmitStoreOpcode): ditto.
14553
14554         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
14555
14556         * expression.cs (MakeByteBlob): Complete all the missing types
14557         (uint, short, ushort, byte, sbyte)
14558
14559         * class.cs: Only init instance field initializers on instance
14560         constructors. 
14561
14562         Rename `constructors' to instance_constructors. 
14563
14564         (TypeContainer.AddConstructor): Only add constructors to the list
14565         if it is not static.
14566
14567         Make sure that we handle default_static_constructor independently
14568         everywhere where we handle instance_constructors
14569
14570 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
14571
14572         * class.cs: Do not lookup or create a base initializer for a
14573         static constructor.
14574
14575         (ConstructorInitializer.Resolve): use the proper type to lookup
14576         for constructors.
14577
14578         * cs-parser.jay: Report error 1585 (modifiers between type and name).
14579
14580         * enum.cs, interface.cs: Remove CloseType, this is taken care by
14581         in DeclSpace. 
14582
14583         * decl.cs: CloseType is now an virtual method, the default
14584         implementation just closes this type.
14585
14586 2001-12-28  Ravi Pratap  <ravi@ximian.com>
14587
14588         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
14589         to PreserveSig by default. Also emit HideBySig on such methods.
14590
14591         Basically, set the defaults to standard values.
14592
14593         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
14594         argument, if candidate is better, it can't be worse than the best !
14595
14596         (Invocation): Re-write bits to differentiate between methods being
14597         applicable in their expanded form and their normal form - for params
14598         methods of course.
14599
14600         Get rid of use_standard everywhere as only standard conversions are allowed
14601         in overload resolution. 
14602
14603         More spec conformance.
14604
14605 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14606
14607         * driver.cs: Add --timestamp, to see where the compiler spends
14608         most of its time.
14609
14610         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
14611         `this' in static code.
14612
14613         (SimpleName.DoResolve): Implement in terms of a helper function
14614         that allows static-references to be passed upstream to
14615         MemberAccess.
14616
14617         (Expression.ResolveWithSimpleName): Resolve specially simple
14618         names when called by MemberAccess to implement the special
14619         semantics. 
14620
14621         (Expression.ImplicitReferenceConversion): Handle conversions from
14622         Null to reference types before others, as Null's type is
14623         System.Object. 
14624
14625         * expression.cs (Invocation.EmitCall): Handle the special case of
14626         calling methods declared on a reference type from a ValueType
14627         (Base classes System.Object and System.Enum)
14628
14629         (MemberAccess.Resolve): Only perform lookups on Enumerations if
14630         the left hand side is a TypeExpr, not on every enumeration. 
14631
14632         (Binary.Resolve): If types are reference types, then do a cast to
14633         object on operators != and == of both arguments.
14634
14635         * typemanager.cs (FindMembers): Extract instance and static
14636         members if requested.
14637
14638         * interface.cs (PopulateProperty): Use void_type instead of null
14639         as the return type for the setter method.
14640
14641         (PopulateIndexer): ditto.
14642
14643 2001-12-27  Ravi Pratap  <ravi@ximian.com>
14644
14645         * support.cs (ReflectionParameters): Fix minor bug where we
14646         were examining the wrong parameter for the ParamArray attribute.
14647
14648         Cope with requests for the type of the parameter at position
14649         greater than the params parameter's. We now return the element
14650         type of the params array as that makes more sense.
14651
14652         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
14653         accordingly as we no longer have to extract the element type
14654         ourselves.
14655
14656         (Invocation.OverloadResolve): Update.
14657
14658 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14659
14660         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
14661         against IEnumerator, test whether the return value is a descendant
14662         of the IEnumerator interface.
14663
14664         * class.cs (Indexer.Define): Use an auxiliary method to implement
14665         the other bits of the method definition.  Begin support for
14666         explicit interface implementation.
14667
14668         (Property.DefineMethod): Use TypeManager.void_type instead of null
14669         for an empty return value.
14670
14671 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
14672
14673         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
14674         dealing with a FieldExpr which is composed of a FieldBuilder, in
14675         the code path we did extract the constant, but we should have
14676         obtained the underlying value to be able to cast it (otherwise we
14677         end up in an infinite loop, this is what Ravi was running into).
14678
14679         (ArrayCreation.UpdateIndices): Arrays might be empty.
14680
14681         (MemberAccess.ResolveMemberAccess): Add support for section
14682         14.5.4.1 that deals with the special case of E.I when E is a type
14683         and something else, that I can be a reference to a static member.
14684
14685         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
14686         handle a particular array type to create byte blobs, it is just
14687         something we dont generate byteblobs for.
14688
14689         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
14690         arguments. 
14691
14692         * location.cs (Push): remove the key from the hashtable that we
14693         are about to add.   This happens for empty files.
14694
14695         * driver.cs: Dispose files after we have parsed them.
14696
14697         (tokenize): new function that only runs the tokenizer on its
14698         input, for speed testing.
14699
14700 2001-12-26  Ravi Pratap  <ravi@ximian.com>
14701
14702         * class.cs (Event.Define): Define the private field only if there
14703         are no accessors defined.
14704
14705         * expression.cs (ResolveMemberAccess): If there is no associated
14706         field with the event, that means we have an event defined with its
14707         own accessors and we should flag error cs0070 since transforming
14708         ourselves into a field is not valid in that case.
14709
14710         * ecore.cs (SimpleName.DoResolve): Same as above.
14711
14712         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
14713         and charset to sane values.
14714
14715 2001-12-25  Ravi Pratap  <ravi@ximian.com>
14716
14717         * assign.cs (DoResolve): Perform check on events only if they 
14718         are being accessed outside the declaring type.
14719
14720         * cs-parser.jay (event_declarations): Update rules to correctly
14721         set the type of the implicit parameter etc.
14722
14723         (add_accessor, remove_accessor): Set current local parameters.
14724
14725         * expression.cs (Binary): For delegate addition and subtraction,
14726         cast the return value from the method into the appropriate delegate
14727         type.
14728
14729 2001-12-24  Ravi Pratap  <ravi@ximian.com>
14730
14731         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
14732         of these as the workaround is unnecessary.
14733
14734         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
14735         delegate data - none of that is needed at all.
14736
14737         Re-write bits to extract the instance expression and the delegate method
14738         correctly.
14739
14740         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
14741         on delegates too.
14742
14743         * attribute.cs (ApplyAttributes): New method to take care of common tasks
14744         of attaching attributes instead of duplicating code everywhere.
14745
14746         * everywhere : Update code to do attribute emission using the above method.
14747
14748 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14749
14750         * expression.cs (IsParamsMethodApplicable): if there are not
14751         parameters, return immediately.
14752
14753         * ecore.cs: The 0 literal can be implicity converted to an enum
14754         type. 
14755
14756         (SimpleName.DoResolve): First lookup the type, then lookup the
14757         members. 
14758
14759         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
14760         want to get its address.  If the InstanceExpression is not
14761         addressable, store the result in a temporary variable, then get
14762         the address of it.
14763
14764         * codegen.cs: Only display 219 errors on warning level or above. 
14765
14766         * expression.cs (ArrayAccess): Make it implement the
14767         IMemoryLocation interface.
14768
14769         (Binary.DoResolve): handle the operator == (object a, object b)
14770         and operator != (object a, object b) without incurring into a
14771         BoxedCast (because 5 != o should never be performed).
14772
14773         Handle binary enumerator operators.
14774
14775         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14776         value type, otherwise use Ldelem_ref.
14777
14778         Use precomputed names;
14779
14780         (AddressOf): Implement address of
14781
14782         * cs-parser.jay (labeled_statement): Fix recursive block
14783         addition by reworking the production.
14784
14785         * expression.cs (New.DoEmit): New has a special case:
14786                 
14787                  If we are dealing with a ValueType, we have a few
14788                  situations to deal with:
14789                 
14790                     * The target of New is a ValueType variable, that is
14791                       easy, we just pass this as the variable reference
14792                 
14793                     * The target of New is being passed as an argument,
14794                       to a boxing operation or a function that takes a
14795                       ValueType.
14796                 
14797                       In this case, we need to create a temporary variable
14798                       that is the argument of New.
14799
14800
14801 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14802
14803         * rootcontext.cs (LookupType): Check that current_type is not null before
14804         going about looking at nested types.
14805
14806         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14807         not implement the IAssignMethod interface any more.
14808
14809         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14810         where we tranform them into FieldExprs if they are being resolved from within
14811         the declaring type.
14812
14813         * ecore.cs (SimpleName.DoResolve): Do the same here.
14814
14815         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14816
14817         * ../errors/bug10.cs : Add.
14818
14819         * ../errors/cs0070.cs : Add.
14820
14821         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14822
14823         * assign.cs : Get rid of EventIsLocal everywhere.
14824
14825 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14826
14827         * ecore.cs (ConvertIntLiteral): finished the implementation.
14828
14829         * statement.cs (SwitchLabel): Convert the value we are using as a
14830         key before looking up the table.
14831
14832 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14833
14834         * codegen.cs (EmitTopBlock): Require a Location argument now.
14835
14836         * cs-parser.jay (constructor_declarator): We need to setup
14837         current_local_parameters before we parse the
14838         opt_constructor_initializer, to allow the variables to be bound
14839         to the constructor arguments.
14840
14841         * rootcontext.cs (LookupType): First lookup nested classes in our
14842         class and our parents before we go looking outside our class.
14843
14844         * expression.cs (ConstantFold): Extract/debox the values at the
14845         beginnning. 
14846
14847         * rootcontext.cs (EmitCode): Resolve the constants first before we
14848         resolve the types.  This is not really needed, but it helps debugging.
14849
14850         * statement.cs: report location.
14851
14852         * cs-parser.jay: pass location to throw statement.
14853
14854         * driver.cs: Small bug fix.
14855
14856         * report.cs: Updated format to be 4-zero filled digits.
14857
14858 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14859
14860         * expression.cs (CheckIndices): Fix minor bug where the wrong
14861         variable was being referred to ;-)
14862
14863         (DoEmit): Do not call EmitStaticInitializers when the 
14864         underlying type is System.Object.
14865
14866 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14867
14868         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14869         and do the usual workaround for SRE.
14870
14871         * class.cs (MyEventBuilder.EventType): New member to get at the type
14872         of the event, quickly.
14873
14874         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14875
14876         * assign.cs (Assign.DoResolve): Handle the case when the target
14877         is an EventExpr and perform the necessary checks.
14878
14879         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14880         interface.
14881
14882         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14883
14884         (EventExpr): Set the type in the constructor itself since we 
14885         are meant to be born fully resolved.
14886
14887         (EventExpr.Define): Revert code I wrote earlier.
14888                 
14889         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14890         instance expression is null. The instance expression is a This in that case
14891         or a null, depending on whether it is a static method or not.
14892
14893         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14894         refers to more than one method.
14895
14896         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14897         and accordingly flag errors.
14898
14899 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14900
14901         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14902
14903 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14904
14905         * location.cs (ToString): Provide useful rutine.
14906
14907 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14908
14909         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14910         objects, return the actual integral boxed.
14911
14912         * statement.cs (SwitchLabel): define an ILLabel for each
14913         SwitchLabel. 
14914
14915         (Switch.CheckSwitch): If the value is a Literal, extract
14916         the underlying literal.
14917
14918         Also in the unused hashtable we had, add the SwitchLabel so we can
14919         quickly look this value up.
14920
14921         * constant.cs: Implement a bunch of new constants.  Rewrite
14922         Literal based on this.  Made changes everywhere to adapt to this.
14923
14924         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14925         dereferencing array only once, and also copes with enumrations.
14926
14927         bytes are two bytes wide, not one.
14928
14929         (Cast): Perform constant conversions.
14930
14931         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14932         wrappers to the literals here.
14933
14934         * expression.cs (DoNumericPromotions): long literals can converted
14935         to ulong implicity (this is taken care of elsewhere, but I was
14936         missing this spot).
14937
14938         * ecore.cs (Expression.Literalize): Make the return type Literal,
14939         to improve type checking.
14940
14941         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14942
14943 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14944
14945         * literal.cs: Revert code from ravi that checked the bounds.  The
14946         bounds are sane by the definition of the type itself. 
14947
14948         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14949         need to actually look up in our parent hierarchy for interfaces
14950         implemented. 
14951
14952         * const.cs: Use the underlying type for enumerations
14953
14954         * delegate.cs: Compute the basename for the delegate creation,
14955         that should fix the delegate test case, and restore the correct
14956         Type Lookup semantics in rootcontext
14957
14958         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14959         referencing a nested type with the Reflection API is using the "+"
14960         sign. 
14961
14962         * cs-parser.jay: Do not require EOF token at the end.
14963
14964 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14965
14966         * rootcontext.cs (LookupType): Concatenate type names with
14967         a '.' instead of a '+' The test suite passes again.
14968
14969         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14970         field of the enumeration.
14971
14972         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14973         the case when the member is an EventExpr.
14974
14975         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14976         static has an associated instance expression.
14977
14978         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14979
14980         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14981
14982         * class.cs (Event.Define): Register event and perform appropriate checks
14983         for error #111.
14984
14985         We define the Add and Remove methods even if the use provides none because
14986         in that case, we provide default implementations ourselves.
14987
14988         Define a private field of the type of the event. This is done by the CSC compiler
14989         and we should be doing it too ;-)
14990
14991         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14992         More methods we use in code we generate.
14993
14994         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14995         is important.
14996
14997         (InitCoreTypes): Update accordingly for the above.
14998
14999         * class.cs (Event.Emit): Generate code for default accessors that we provide
15000
15001         (EmitDefaultMethod): Do the job in the above.
15002
15003         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
15004         appropriate place.
15005
15006 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15007
15008         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
15009         builders even if we were missing one.
15010
15011         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
15012         pass the Basename as our class name instead of the Name.  The
15013         basename will be correctly composed for us.
15014
15015         * parameter.cs (Paramters): Now takes a Location argument.
15016
15017         * decl.cs (DeclSpace.LookupType): Removed convenience function and
15018         make all the code call directly LookupType in RootContext and take
15019         this chance to pass the Location information everywhere.
15020
15021         * Everywhere: pass Location information.
15022
15023 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
15024
15025         * class.cs (Constructor.Define): Updated way of detecting the
15026         length of the parameters.
15027
15028         (TypeContainer.DefineType): Use basename as the type name for
15029         nested types.
15030
15031         (TypeContainer.Define): Do not recursively define types here, as
15032         definition is taken care in order by the RootContext.
15033
15034         * tree.cs: Keep track of namespaces in a per-file basis.
15035
15036         * parameter.cs (Parameter.ComputeSignature): Update to use
15037         DeclSpace. 
15038
15039         (Parameters.GetSignature): ditto.
15040
15041         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
15042         instead of a TypeContainer.
15043
15044         (Interface.SemanticAnalysis): Use `this' instead of our parent to
15045         resolve names.  Because we need to be resolve in our context, not
15046         our parents.
15047
15048         * driver.cs: Implement response files.
15049
15050         * class.cs (TypeContainer.DefineType): If we are defined, do not
15051         redefine ourselves.
15052
15053         (Event.Emit): Emit the code for add/remove handlers.
15054         (Event.Define): Save the MethodBuilders for add/remove.
15055
15056         * typemanager.cs: Use pair here too.
15057
15058         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
15059         DictionaryEntry requires the first argument to be non-null.  
15060
15061         (enum_declaration): Compute full name for registering the
15062         enumeration.
15063
15064         (delegate_declaration): Instead of using
15065         formal_parameter_list, use opt_formal_parameter_list as the list
15066         can be empty.
15067
15068         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
15069         (EventParsing): New property that controls whether `add' and
15070         `remove' are returned as tokens or identifiers (for events);
15071
15072 2001-12-19  Ravi Pratap  <ravi@ximian.com>
15073
15074         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
15075         use MyEventBuilder only and let it wrap the real builder for us.
15076
15077         (MyEventBuilder): Revamp constructor etc.
15078
15079         Implement all operations that we perform on EventBuilder in precisely the same
15080         way here too.
15081
15082         (FindMembers): Update to use the EventBuilder member.
15083
15084         (Event.Emit): Update accordingly.
15085
15086 2001-12-18  Ravi Pratap  <ravi@ximian.com>
15087
15088         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
15089         by calling the appropriate methods.
15090
15091         (GetCustomAttributes): Make stubs as they cannot possibly do anything
15092         useful.
15093
15094         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
15095
15096 2001-12-17  Ravi Pratap  <ravi@ximian.com>
15097
15098         * delegate.cs (Delegate.Populate): Check that the return type
15099         and various parameters types are indeed accessible.
15100
15101         * class.cs (Constructor.Define): Same here.
15102
15103         (Field.Define): Ditto.
15104
15105         (Event.Define): Ditto.
15106
15107         (Operator.Define): Check that the underlying Method defined itself
15108         correctly - so it's MethodBuilder should not be null.
15109
15110         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
15111         expression happens to be null.
15112
15113         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
15114         members but as of now we don't seem to be able to do anything really useful with it.
15115
15116         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
15117         not the EventBuilder.
15118
15119 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
15120
15121         * cs-tokenizer.cs: Add support for defines.
15122         Add support for #if, #elif, #else, #endif
15123
15124         (eval_var): evaluates a variable.
15125         (eval): stubbed for evaluating functions.
15126
15127         * cs-parser.jay: Pass the defines information
15128
15129         * driver.cs: Add --define command line option.
15130
15131         * decl.cs: Move MemberCore here.
15132
15133         Make it the base class for DeclSpace.  This allows us to catch and
15134         report 108 and 109 for everything now.
15135
15136         * class.cs (TypeContainer.Define): Extract all the members
15137         before populating and emit the warning 108 (new keyword required
15138         to override) instead of having each member implement this.
15139
15140         (MemberCore.Define): New abstract method, we will be using this in
15141         the warning reporting engine in Populate.
15142
15143         (Operator.Define): Adjust to new MemberCore protocol. 
15144
15145         * const.cs (Const): This does not derive from Expression, it is a
15146         temporary object we use to create fields, it is a MemberCore. 
15147
15148         * class.cs (Method.Define): Allow the entry point to be in a
15149         specific class.
15150
15151         * driver.cs: Rewrite the argument handler to clean it up a bit.
15152
15153         * rootcontext.cs: Made it just an auxiliary namespace feature by
15154         making everything static.
15155
15156         * driver.cs: Adapt code to use RootContext type name instead of
15157         instance variable.
15158
15159         * delegate.cs: Remove RootContext argument.
15160
15161         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
15162         argument. 
15163
15164         * class.cs (Event.Define): The lookup can fail.
15165
15166         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
15167
15168         * expression.cs: Resolve the this instance before invoking the code.
15169
15170 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
15171
15172         * cs-parser.jay: Add a production in element_access that allows
15173         the thing to become a "type" reference.  This way we can parse
15174         things like "(string [])" as a type.
15175
15176         Note that this still does not handle the more complex rules of
15177         casts. 
15178
15179
15180         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
15181
15182         * ecore.cs: (CopyNewMethods): new utility function used to
15183         assemble the list of methods from running FindMembers.
15184
15185         (MemberLookup): Rework FindMembers so that 
15186
15187 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
15188
15189         * class.cs (TypeContainer): Remove Delegates who fail to be
15190         defined.
15191
15192         * delegate.cs (Populate): Verify that we dont get null return
15193         values.   TODO: Check for AsAccessible.
15194
15195         * cs-parser.jay: Use basename to emit error 574 (destructor should
15196         have the same name as container class), not the full name.
15197
15198         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
15199         possible representation.  
15200
15201         Also implements integer type suffixes U and L.
15202
15203 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
15204
15205         * expression.cs (ArrayCreation.DoResolve): We need to do the
15206         argument resolution *always*.
15207
15208         * decl.cs: Make this hold the namespace.  Hold the root context as
15209         well.
15210         (LookupType): Move here.
15211
15212         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
15213
15214         * location.cs (Row, Name): Fixed the code, it was always returning
15215         references to the first file.
15216
15217         * interface.cs: Register properties defined through interfaces.
15218
15219         * driver.cs: Add support for globbing on the command line
15220
15221         * class.cs (Field): Make it derive from MemberCore as well.
15222         (Event): ditto.
15223
15224 2001-12-15  Ravi Pratap  <ravi@ximian.com>
15225
15226         * class.cs (Event::Define): Check that the type of the event is a delegate
15227         type else flag error #66.
15228
15229         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
15230         same.
15231
15232         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
15233         values of EntryPoint, CharSet etc etc.
15234
15235         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
15236
15237         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
15238         be null and we should ignore this. I am not sure if this is really clean. Apparently,
15239         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
15240         which needs this to do its work.
15241
15242         * ../errors/cs0066.cs : Add.
15243
15244 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
15245
15246         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
15247         helper functions.
15248
15249         * class.cs: (MethodSignature.MethodSignature): Removed hack that
15250         clears out the parameters field.
15251         (MemberSignatureCompare): Cleanup
15252
15253         (MemberCore): New base class used to share code between MethodCore
15254         and Property.
15255
15256         (RegisterRequiredImplementations) BindingFlags.Public requires
15257         either BindingFlags.Instace or Static.  Use instance here.
15258
15259         (Property): Refactored code to cope better with the full spec.
15260
15261         * parameter.cs (GetParameterInfo): Return an empty array instead
15262         of null on error.
15263
15264         * class.cs (Property): Abstract or extern properties have no bodies.
15265
15266         * parameter.cs (GetParameterInfo): return a zero-sized array.
15267
15268         * class.cs (TypeContainer.MethodModifiersValid): Move all the
15269         method modifier validation to the typecontainer so we can reuse
15270         this on properties.
15271
15272         (MethodCore.ParameterTypes): return an empty sized array of types.
15273
15274         (Property.Define): Test property modifier validity.
15275
15276         Add tests for sealed/override too.
15277
15278         (Method.Emit): abstract or extern methods have no bodies.
15279
15280 2001-12-14  Ravi Pratap  <ravi@ximian.com>
15281
15282         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
15283         thing.
15284
15285         (Method::Define, ::Emit): Modify accordingly.
15286
15287         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
15288
15289         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
15290
15291         * makefile: Pass in /unsafe.
15292
15293 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
15294
15295         * class.cs (MakeKey): Kill routine.
15296
15297         * class.cs (TypeContainer.Define): Correctly define explicit
15298         method implementations (they require the full interface name plus
15299         the method name).
15300
15301         * typemanager.cs: Deply the PtrHashtable here and stop using the
15302         lame keys.  Things work so much better.
15303
15304         This of course broke everyone who depended on `RegisterMethod' to
15305         do the `test for existance' test.  This has to be done elsewhere.
15306
15307         * support.cs (PtrHashtable): A hashtable that avoid comparing with
15308         the object stupid Equals method (because, that like fails all over
15309         the place).  We still do not use it.
15310
15311         * class.cs (TypeContainer.SetRequiredInterface,
15312         TypeContainer.RequireMethods): Killed these two routines and moved
15313         all the functionality to RegisterRequiredImplementations.
15314
15315         (TypeContainer.RegisterRequiredImplementations): This routine now
15316         registers all the implementations required in an array for the
15317         interfaces and abstract methods.  We use an array of structures
15318         which can be computed ahead of time to reduce memory usage and we
15319         also assume that lookups are cheap as most classes will not
15320         implement too many interfaces.
15321
15322         We also avoid creating too many MethodSignatures.
15323
15324         (TypeContainer.IsInterfaceMethod): Update and optionally does not
15325         clear the "pending" bit if we find that there are problems with
15326         the declaration.
15327
15328         (TypeContainer.VerifyPendingMethods): Update to report errors of
15329         methods that look like implementations but are not.
15330
15331         (TypeContainer.Define): Add support for explicit interface method
15332         implementation. 
15333
15334 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
15335
15336         * typemanager.cs: Keep track of the parameters here instead of
15337         being a feature of the TypeContainer.
15338
15339         * class.cs: Drop the registration of parameters here, as
15340         InterfaceMethods are also interface declarations.
15341
15342         * delegate.cs: Register methods with the TypeManager not only with
15343         the TypeContainer.  This code was buggy.
15344
15345         * interface.cs: Full registation here.
15346
15347 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
15348
15349         * expression.cs: Remove reducer for binary expressions, it can not
15350         be done this way.
15351
15352         * const.cs: Put here the code that used to go into constant.cs
15353
15354         * constant.cs: Put here the code for constants, this is a new base
15355         class for Literals.
15356
15357         * literal.cs: Make Literal derive from Constant.
15358
15359 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
15360
15361         * statement.cs (Return.Emit): Report error 157 if the user
15362         attempts to return from a finally block.
15363
15364         (Return.Emit): Instead of emitting a return, jump to the end of
15365         the function.
15366
15367         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
15368         LocalBuilder to store the result of the function.  ReturnLabel is
15369         the target where we jump.
15370
15371
15372 2001-12-09  Radek Doulik  <rodo@ximian.com>
15373
15374         * cs-parser.jay: remember alias in current namespace
15375
15376         * ecore.cs (SimpleName::DoResolve): use aliases for types or
15377         namespaces
15378
15379         * class.cs (LookupAlias): lookup alias in my_namespace
15380
15381         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
15382         aliases hashtable
15383         (LookupAlias): lookup alias in this and if needed in parent
15384         namespaces
15385
15386 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
15387
15388         * support.cs: 
15389
15390         * rootcontext.cs: (ModuleBuilder) Made static, first step into
15391         making things static.  I need this to avoid passing the
15392         TypeContainer when calling ParameterType.
15393
15394         * support.cs (InternalParameters.ParameterType): Remove ugly hack
15395         that did string manipulation to compute the type and then call
15396         GetType.  Use Parameter.ParameterType instead.
15397
15398         * cs-tokenizer.cs: Consume the suffix for floating values.
15399
15400         * expression.cs (ParameterReference): figure out whether this is a
15401         reference parameter or not.  Kill an extra variable by computing
15402         the arg_idx during emission.
15403
15404         * parameter.cs (Parameters.GetParameterInfo): New overloaded
15405         function that returns whether a parameter is an out/ref value or not.
15406
15407         (Parameter.ParameterType): The type of the parameter (base,
15408         without ref/out applied).
15409
15410         (Parameter.Resolve): Perform resolution here.
15411         (Parameter.ExternalType): The full type (with ref/out applied).
15412
15413         * statement.cs (Using.Emit, Using.EmitExpression): Implement
15414         support for expressions on the using statement.
15415
15416 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
15417
15418         * statement.cs (Using.EmitLocalVariableDecls): Split the
15419         localvariable handling of the using statement.
15420
15421         (Block.EmitMeta): Keep track of variable count across blocks.  We
15422         were reusing slots on separate branches of blocks.
15423
15424         (Try.Emit): Emit the general code block, we were not emitting it. 
15425
15426         Check the type of the declaration to be an IDisposable or
15427         something that can be implicity converted to it. 
15428
15429         Emit conversions if required.
15430
15431         * ecore.cs (EmptyExpression): New utility class.
15432         (Expression.ImplicitConversionExists): New utility function.
15433
15434 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
15435
15436         * statement.cs (Using): Implement.
15437
15438         * expression.cs (LocalVariableReference): Support read only variables.
15439
15440         * statement.cs: Remove the explicit emit for the Leave opcode.
15441         (VariableInfo): Add a readonly field.
15442
15443 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
15444
15445         * ecore.cs (ConvCast): new class used to encapsulate the various
15446         explicit integer conversions that works in both checked and
15447         unchecked contexts.
15448
15449         (Expression.ConvertNumericExplicit): Use new ConvCast class to
15450         properly generate the overflow opcodes.
15451
15452 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15453
15454         * statement.cs: The correct type for the EmptyExpression is the
15455         element_type, not the variable type.  Ravi pointed this out.
15456
15457 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15458
15459         * class.cs (Method::Define): Handle PInvoke methods specially
15460         by using DefinePInvokeMethod instead of the usual one.
15461
15462         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
15463         above to do the task of extracting information and defining the method.
15464
15465 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15466
15467         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
15468         of the condition for string type.
15469
15470         (Emit): Move that here. 
15471
15472         (ArrayCreation::CheckIndices): Keep string literals in their expression
15473         form.
15474
15475         (EmitDynamicInitializers): Handle strings appropriately.
15476
15477 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15478
15479         * codegen.cs (EmitContext): Replace multiple variables with a
15480         single pointer to the current Switch statement.
15481
15482         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
15483         EmitContext.
15484
15485 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15486
15487         * statement.cs 
15488
15489         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
15490         default'.
15491
15492         (Foreach.Emit): Foreach on arrays was not setting
15493         up the loop variables (for break/continue).
15494
15495         (GotoCase): Semi-implented.
15496
15497 2001-12-03  Ravi Pratap  <ravi@ximian.com>
15498
15499         * attribute.cs (CheckAttribute): Handle system attributes by using
15500         Attribute.GetAttributes to examine information we need.
15501
15502         (GetValidPlaces): Same here.
15503
15504         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
15505
15506         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
15507
15508         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
15509
15510         (Method::Define): Set appropriate flags if we have a DllImport attribute.
15511
15512         (Method::Emit): Handle the case when we are a PInvoke method.
15513
15514 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15515
15516         * expression.cs: Use ResolveWithSimpleName on compound names.
15517
15518 2001-12-02  Ravi Pratap  <ravi@ximian.com>
15519
15520         * constant.cs (EmitConstant): Make sure we resolve the associated expression
15521         before trying to reduce it.
15522
15523         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
15524
15525         * constant.cs (LookupConstantValue): Implement.
15526
15527         (EmitConstant): Use the above in emitting the constant.
15528
15529         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
15530         that are user-defined by doing a LookupConstantValue on them.
15531
15532         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
15533         too, like above.
15534
15535 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
15536
15537         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
15538
15539         (BaseAccess.DoResolve): Implement.
15540
15541         (MemberAccess.DoResolve): Split this routine into a
15542         ResolveMemberAccess routine that can be used independently
15543
15544 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
15545
15546         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
15547         As that share bits of the implementation.  Is returns a boolean,
15548         while As returns the Type that is being probed.
15549
15550 2001-12-01  Ravi Pratap  <ravi@ximian.com>
15551
15552         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
15553         instead of a Literal - much easier.
15554
15555         (EnumInTransit): Remove - utterly useless :-)
15556
15557         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
15558
15559         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
15560
15561         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
15562         chain when we have no associated expression.
15563
15564 2001-11-30  Ravi Pratap  <ravi@ximian.com>
15565
15566         * constant.cs (Define): Use Location while reporting the errror.
15567
15568         Also emit a warning when 'new' is used and there is no inherited
15569         member to hide.
15570
15571         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
15572         populated.
15573
15574         (LookupEnumValue): Implement to lookup an enum member's value and define it
15575         if necessary.
15576
15577         (Populate): Re-write accordingly to use the above routine.
15578
15579 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
15580
15581         * expression.cs (This): Fix prototype for DoResolveLValue to
15582         override the base class DoResolveLValue.
15583
15584         * cs-parser.cs: Report errors cs574 and cs575 (destructor
15585         declarations) 
15586
15587         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
15588         (we need to load the address of the field here).  This fixes
15589         test-22. 
15590
15591         (FieldExpr.DoResolveLValue): Call the DoResolve
15592         function to initialize the Instance expression.
15593
15594         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
15595         correctly the GetEnumerator operation on a value type.
15596
15597         * cs-parser.jay: Add more simple parsing error catches.
15598
15599         * statement.cs (Switch): Add support for string switches.
15600         Handle null specially.
15601
15602         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
15603
15604 2001-11-28  Ravi Pratap  <ravi@ximian.com>
15605
15606         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
15607
15608         (declare_local_constant): New helper function.
15609
15610         * statement.cs (AddConstant): Keep a separate record of constants
15611
15612         (IsConstant): Implement to determine if a variable is a constant.
15613
15614         (GetConstantExpression): Implement.
15615
15616         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
15617
15618         * statement.cs (IsVariableDefined): Re-write.
15619
15620 2001-11-27  Ravi Pratap  <ravi@ximian.com>
15621
15622         * class.cs (TypeContainer::FindMembers): Look for constants
15623         in the case when we are looking for MemberTypes.Field
15624
15625         * expression.cs (MemberAccess::DoResolve): Check that in the
15626         case we are a FieldExpr and a Literal, we are not being accessed
15627         by an instance reference.
15628
15629         * cs-parser.jay (local_constant_declaration): Implement.
15630
15631         (declaration_statement): Implement for constant declarations.
15632
15633 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
15634
15635         * statement.cs (Switch): Catch double defaults.
15636
15637         (Switch): More work on the switch() statement
15638         implementation.  It works for integral values now, need to finish
15639         string support.
15640
15641
15642 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15643
15644         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
15645         integer literals into other integer literals.  To be used by
15646         switch. 
15647
15648 2001-11-24  Ravi Pratap  <ravi@ximian.com>
15649
15650         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
15651         some memory.
15652
15653         (EmitDynamicInitializers): Cope with the above since we extract data
15654         directly from ArrayData now.
15655
15656         (ExpectInitializers): Keep track of whether initializers are mandatory
15657         or not.
15658
15659         (Bounds): Make it a hashtable to prevent the same dimension being 
15660         recorded for every element in that dimension.
15661
15662         (EmitDynamicInitializers): Fix bug which prevented the Set array method
15663         from being found.
15664
15665         Also fix bug which was causing the indices to be emitted in the reverse
15666         order.
15667
15668 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15669
15670         * expression.cs (ArrayCreation): Implement the bits that Ravi left
15671         unfinished.  They do not work, because the underlying code is
15672         sloppy.
15673
15674 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15675
15676         * cs-parser.jay: Remove bogus fixme.
15677
15678         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
15679         on Switch statement.
15680
15681 2001-11-23  Ravi Pratap  <ravi@ximian.com>
15682
15683         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
15684         the same. 
15685
15686         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
15687         parameter. Apparently, any expression is allowed. 
15688
15689         (ValidateInitializers): Update accordingly.
15690
15691         (CheckIndices): Fix some tricky bugs thanks to recursion.
15692
15693         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
15694         I was being completely brain-dead.
15695
15696         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
15697         and re-write acordingly.
15698
15699         (DelegateInvocation): Re-write accordingly.
15700
15701         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
15702
15703         (MakeByteBlob): Handle types more correctly.
15704
15705         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
15706         initialization from expressions but it is incomplete because I am a complete
15707         Dodo :-|
15708
15709 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15710
15711         * statement.cs (If.Emit): Fix a bug that generated incorrect code
15712         on If.  Basically, we have to return `true' (ie, we do return to
15713         our caller) only if both branches of the if return.
15714
15715         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
15716         short-circuit operators, handle them as short circuit operators. 
15717
15718         (Cast.DoResolve): Resolve type.
15719         (Cast.Cast): Take an expression as the target type.
15720
15721         * cs-parser.jay (cast_expression): Remove old hack that only
15722         allowed a limited set of types to be handled.  Now we take a
15723         unary_expression and we resolve to a type during semantic
15724         analysis.
15725
15726         Use the grammar productions from Rhys to handle casts (this is
15727         not complete like Rhys syntax yet, we fail to handle that corner
15728         case that C# has regarding (-x), but we will get there.
15729
15730 2001-11-22  Ravi Pratap  <ravi@ximian.com>
15731
15732         * class.cs (EmitFieldInitializer): Take care of the case when we have a
15733         field which is an array type.
15734
15735         * cs-parser.jay (declare_local_variables): Support array initialization too.
15736
15737         * typemanager.cs (MakeKey): Implement.
15738
15739         (everywhere): Use the above appropriately.
15740
15741         * cs-parser.jay (for_statement): Update for array initialization while
15742         declaring variables.
15743
15744         * ecore.cs : The error message was correct, it's the variable's names that
15745         were misleading ;-) Make the code more readable.
15746
15747         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
15748         the correct type etc.
15749
15750         (ConvertExplicit): Handle Enum types by examining the underlying type.
15751
15752 2001-11-21  Ravi Pratap  <ravi@ximian.com>
15753
15754         * parameter.cs (GetCallingConvention): Always return
15755         CallingConventions.Standard for now.
15756
15757 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15758
15759         * expression.cs (Binary.ResolveOperator): Update the values of `l'
15760         and `r' after calling DoNumericPromotions.
15761
15762         * ecore.cs: Fix error message (the types were in the wrong order).
15763
15764         * statement.cs (Foreach.ProbeCollectionType): Need to pass
15765         BindingFlags.Instance as well 
15766
15767         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
15768         implicit int literal conversion in an empty cast so that we
15769         propagate the right type upstream.
15770
15771         (UnboxCast): new class used to unbox value types.
15772         (Expression.ConvertExplicit): Add explicit type conversions done
15773         by unboxing.
15774
15775         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15776         the target type before applying the implicit LongLiterals to ULong
15777         literal cast.
15778
15779 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15780
15781         * cs-parser.jay (for_statement): Reworked the way For works: now
15782         we declare manually any variables that are introduced in
15783         for_initializer to solve the problem of having out-of-band code
15784         emition (that is what got for broken).
15785
15786         (declaration_statement): Perform the actual variable declaration
15787         that used to be done in local_variable_declaration here.
15788
15789         (local_variable_declaration): Do not declare anything, just pass
15790         the information on a DictionaryEntry
15791
15792 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15793
15794         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15795         re-write of the logic to now make it recursive.
15796
15797         (UpdateIndices): Re-write accordingly.
15798
15799         Store element data in a separate ArrayData list in the above methods.
15800
15801         (MakeByteBlob): Implement to dump the array data into a byte array.
15802
15803 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15804
15805         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15806         into CheckIndices.
15807
15808         * constant.cs (Define): Implement.
15809
15810         (EmitConstant): Re-write fully.
15811
15812         Pass in location info.
15813
15814         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15815         respectively.
15816
15817         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15818         DictionaryEntry since we need location info too.
15819
15820         (constant_declaration): Update accordingly.
15821
15822         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15823         code into another method : UpdateIndices.
15824
15825 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15826
15827         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15828         some type checking etc.
15829
15830 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15831
15832         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15833         bits to provide dimension info if the user skips doing that.
15834
15835         Update second constructor to store the rank correctly.
15836
15837 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15838
15839         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15840         and try to implement.
15841
15842         * ../errors/cs0150.cs : Add.
15843
15844         * ../errors/cs0178.cs : Add.
15845
15846 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15847
15848         * statement.cs: Implement foreach on multi-dimensional arrays. 
15849
15850         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15851         name of the params argument.
15852
15853         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15854         initializing the array.
15855
15856         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15857         we can use this elsewhere.
15858
15859         * statement.cs: Finish implementation of foreach for single
15860         dimension arrays.
15861
15862         * cs-parser.jay: Use an out-of-band stack to pass information
15863         around, I wonder why I need this.
15864
15865         foreach_block: Make the new foreach_block the current_block.
15866
15867         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15868         function used to return a static Parameters structure.  Used for
15869         empty parameters, as those are created very frequently.
15870
15871         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15872
15873 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15874
15875         * interface.cs : Default modifier is private, not public. The
15876         make verify test passes again.
15877
15878 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15879
15880         * support.cs (ReflectionParameters): Fix logic to determine
15881         whether the last parameter is a params one. Test 9 passes again.
15882
15883         * delegate.cs (Populate): Register the builders we define with
15884         RegisterParameterForBuilder. Test 19 passes again.
15885
15886         * cs-parser.jay (property_declaration): Reference $6 instead
15887         of $$ to get at the location.
15888
15889         (indexer_declaration): Similar stuff.
15890
15891         (attribute): Ditto.
15892
15893         * class.cs (Property): Register parameters for the Get and Set methods
15894         if they exist. Test 23 passes again.
15895
15896         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15897         call to EmitArguments as we are sure there aren't any params arguments. 
15898         Test 32 passes again.
15899
15900         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15901         IndexOutOfRangeException. 
15902
15903         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15904         Test 33 now passes again.
15905
15906 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15907
15908         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15909         broke a bunch of things.  Will have to come up with a better way
15910         of tracking locations.
15911
15912         * statement.cs: Implemented foreach for single dimension arrays.
15913
15914 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15915
15916         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15917         an error.  This removes the lookup from the critical path.
15918
15919         * cs-parser.jay: Removed use of temporary_loc, which is completely
15920         broken. 
15921
15922 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15923
15924         * support.cs (ReflectionParameters.ParameterModifier): Report
15925         whether the argument is a PARAMS argument or not.
15926
15927         * class.cs: Set the attribute `ParamArrayAttribute' on the
15928         parameter argument.
15929
15930         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15931         and cons_param_array_attribute (ConstructorInfo for
15932         ParamArrayAttribute)., 
15933
15934         * codegen.cs: Emit the return using the `Return' statement, that
15935         way we can report the error correctly for missing return values. 
15936
15937         * class.cs (Method.Emit): Clean up.
15938
15939         * expression.cs (Argument.Resolve): Take another argument: the
15940         location where this argument is used.  Notice that this is not
15941         part of the "Argument" class as to reduce the size of the
15942         structure (we know the approximate location anyways).
15943
15944         Test if the argument is a variable-reference, if not, then
15945         complain with a 206.
15946
15947         (Argument.Emit): Emit addresses of variables.
15948
15949         (Argument.FullDesc): Simplify.
15950
15951         (Invocation.DoResolve): Update for Argument.Resolve.
15952
15953         (ElementAccess.DoResolve): ditto.
15954
15955         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15956         method should be virtual, as this method is always virtual.
15957
15958         (NewDelegate.DoResolve): Update for Argument.Resolve.
15959
15960         * class.cs (ConstructorInitializer.DoResolve): ditto.
15961
15962         * attribute.cs (Attribute.Resolve): ditto.
15963
15964 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15965
15966         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15967
15968         * expression.cs (ParameterReference): Drop IStackStorage and implement
15969         IAssignMethod instead. 
15970
15971         (LocalVariableReference): ditto.
15972
15973         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15974         IAssignMethod instead. 
15975
15976 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15977
15978         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15979         enumerations that are used in heavily used structures derive from
15980         byte in a laughable and pathetic attempt to reduce memory usage.
15981         This is the kind of pre-optimzations that you should not do at
15982         home without adult supervision.
15983
15984         * expression.cs (UnaryMutator): New class, used to handle ++ and
15985         -- separatedly from the other unary operators.  Cleans up the
15986         code, and kills the ExpressionStatement dependency in Unary.
15987
15988         (Unary): Removed `method' and `Arguments' from this class, making
15989         it smaller, and moving it all to SimpleCall, so I can reuse this
15990         code in other locations and avoid creating a lot of transient data
15991         strucutres when not required.
15992
15993         * cs-parser.jay: Adjust for new changes.
15994
15995 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15996
15997         * enum.cs (Enum.Populate): If there is a failure during
15998         definition, return
15999
16000         * cs-parser.jay (opt_enum_base): we used to catch type errors
16001         here, but this is really incorrect.  The type error should be
16002         catched during semantic analysis.
16003
16004 2001-12-11  Ravi Pratap  <ravi@ximian.com>
16005
16006         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
16007         current_local_parameters as expected since I, in my stupidity, had forgotten
16008         to do this :-)
16009
16010         * attribute.cs (GetValidPlaces): Fix stupid bug.
16011
16012         * class.cs (Method::Emit): Perform check on applicability of attributes.
16013
16014         (Constructor::Emit): Ditto.
16015
16016         (Field::Emit): Ditto.
16017
16018         (Field.Location): Store location information.
16019
16020         (Property, Event, Indexer, Operator): Ditto.
16021
16022         * cs-parser.jay (field_declaration): Pass in location for each field.
16023
16024         * ../errors/cs0592.cs : Add.
16025
16026 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16027
16028         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
16029
16030         (InitCoreTypes): Update accordingly.
16031
16032         (RegisterAttrType, LookupAttr): Implement.
16033
16034         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
16035         info about the same.
16036
16037         (Resolve): Update to populate the above as necessary.
16038
16039         (Error592): Helper.
16040
16041         (GetValidPlaces): Helper to the above.
16042
16043         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
16044
16045         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
16046
16047 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16048
16049         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
16050
16051         * ../errors/cs0617.cs : Add.
16052
16053 2001-11-11  Ravi Pratap  <ravi@ximian.com>
16054
16055         * enum.cs (Emit): Rename to Populate to be more consistent with what
16056         we expect it to do and when exactly it is called.
16057
16058         * class.cs, rootcontext.cs : Update accordingly.
16059
16060         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
16061         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
16062
16063         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
16064
16065         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
16066         of a fieldinfo using the above, when dealing with a FieldBuilder.
16067
16068 2001-11-10  Ravi Pratap  <ravi@ximian.com>
16069
16070         * ../errors/cs0031.cs : Add.
16071
16072         * ../errors/cs1008.cs : Add.
16073
16074         * ../errrors/cs0543.cs : Add.
16075
16076         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
16077         enum type.
16078
16079         (FindMembers): Implement.
16080
16081         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
16082         enums and delegates too.
16083
16084         (enum_types): Rename to builder_to_enum.
16085
16086         (delegate_types): Rename to builder_to_delegate.
16087
16088         * delegate.cs (FindMembers): Implement.
16089
16090 2001-11-09  Ravi Pratap  <ravi@ximian.com>
16091
16092         * typemanager.cs (IsEnumType): Implement.
16093
16094         * enum.cs (Emit): Re-write parts to account for the underlying type
16095         better and perform checking etc.
16096
16097         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
16098         of the underlying type.
16099
16100         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
16101         value
16102
16103         * enum.cs (error31): Helper to report error #31.
16104
16105         * cs-parser.jay (enum_declaration): Store location of each member too.
16106
16107         * enum.cs (member_to_location): New hashtable. 
16108
16109         (AddEnumMember): Update location hashtable.
16110
16111         (Emit): Use the location of each member while reporting errors.
16112
16113 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16114
16115         * cs-parser.jay: A for_initializer if is a
16116         local_variable_declaration really ammount to have an implicit
16117         block with the variable declaration and no initializer for for.
16118
16119         * statement.cs (For.Emit): Cope with null initializers.
16120
16121         This fixes the infinite loop on for initializers.
16122
16123 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
16124
16125         * enum.cs: More cleanup.
16126
16127         * ecore.cs: Remove dead code.
16128
16129         * class.cs (Property.Emit): More simplification.
16130         (Event.Emit): ditto.
16131
16132         Reworked to have less levels of indentation.
16133
16134 2001-11-08  Ravi Pratap  <ravi@ximian.com>
16135
16136         * class.cs (Property): Emit attributes.
16137
16138         (Field): Ditto.
16139
16140         (Event): Ditto.
16141
16142         (Indexer): Ditto.
16143
16144         (Operator): Ditto.
16145
16146         * enum.cs (Emit): Ditto.
16147
16148         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
16149         Enums too.
16150
16151         * class.cs (Field, Event, etc.): Move attribute generation into the
16152         Emit method everywhere.
16153
16154         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
16155         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
16156         as we had no way of defining nested enums !
16157
16158         * rootcontext.cs : Adjust code accordingly.
16159
16160         * typemanager.cs (AddEnumType): To keep track of enum types separately.
16161
16162 2001-11-07  Ravi Pratap  <ravi@ximian.com>
16163
16164         * expression.cs (EvalConstantExpression): Move into ecore.cs
16165
16166         * enum.cs (Enum): Rename some members and make them public and readonly
16167         according to our convention.
16168
16169         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
16170         nothing else.
16171
16172         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
16173
16174         (Enum::Emit): Write a simple version for now which doesn't try to compute
16175         expressions. I shall modify this to be more robust in just a while.
16176
16177         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
16178
16179         (TypeContainer::CloseType): Create the Enum types too.
16180
16181         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
16182
16183         * expression.cs (EvalConstantExpression): Get rid of completely.
16184
16185         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
16186         user-defined values and other cases.
16187
16188         (IsValidEnumLiteral): Helper function.
16189
16190         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
16191         out there in the case we had a literal FieldExpr.
16192
16193         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
16194
16195         (Literalize): Revamp a bit to take two arguments.
16196
16197         (EnumLiteral): New class which derives from Literal to wrap enum literals.
16198
16199 2001-11-06  Ravi Pratap  <ravi@ximian.com>
16200
16201         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
16202
16203         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
16204
16205         (Resolve): Use the above to ensure we have proper initializers.
16206
16207 2001-11-05  Ravi Pratap  <ravi@ximian.com>
16208
16209         * expression.cs (Expression::EvalConstantExpression): New method to 
16210         evaluate constant expressions.
16211
16212         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
16213
16214 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
16215
16216         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
16217         in an array.
16218
16219         (Binary.ResolveOperator): Handle operator != (object a, object b)
16220         and operator == (object a, object b);
16221
16222         (Binary.DoNumericPromotions): Indicate whether the numeric
16223         promotion was possible.
16224
16225         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
16226         Implement.  
16227
16228         Made the ArrayAccess implement interface IAssignMethod instead of
16229         IStackStore as the order in which arguments are passed reflects
16230         this.
16231
16232         * assign.cs: Instead of using expr.ExprClass to select the way of
16233         assinging, probe for the IStackStore/IAssignMethod interfaces.
16234
16235         * typemanager.cs: Load InitializeArray definition.
16236
16237         * rootcontext.cs (RootContext.MakeStaticData): Used to define
16238         static data that can be used to initialize arrays. 
16239
16240 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
16241
16242         * expression.cs: Handle operator== and operator!= for booleans.
16243
16244         (Conditioal.Reduce): Implement reducer for the ?: operator.
16245
16246         (Conditional.Resolve): Implement dead code elimination.
16247
16248         (Binary.Resolve): Catch string literals and return a new
16249         concatenated string.
16250
16251         (Unary.Reduce): Implement reduction of unary expressions.
16252
16253         * ecore.cs: Split out the expression core handling here.
16254
16255         (Expression.Reduce): New method used to perform constant folding
16256         and CSE.  This is needed to support constant-expressions. 
16257
16258         * statement.cs (Statement.EmitBoolExpression): Pass true and false
16259         targets, and optimize for !x.
16260
16261 2001-11-04  Ravi Pratap  <ravi@ximian.com>
16262
16263         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
16264         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
16265         set custom atttributes.
16266
16267         * literal.cs (Literal::GetValue): New abstract method to return the actual
16268         value of the literal, cast as an object.
16269
16270         (*Literal): Implement GetValue method.
16271
16272         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
16273         expressions to the arraylist but objects of type Argument.
16274
16275         * class.cs (TypeContainer::Emit): Emit our attributes too.
16276
16277         (Method::Emit, Constructor::Emit): Ditto.
16278
16279         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
16280         to be ignoring earlier.
16281
16282 2001-11-03  Ravi Pratap  <ravi@ximian.com>
16283
16284         * attribute.cs (AttributeSection::Define): Implement to do the business
16285         of constructing a CustomAttributeBuilder.
16286
16287         (Attribute): New trivial class. Increases readability of code.  
16288
16289         * cs-parser.jay : Update accordingly.
16290
16291         (positional_argument_list, named_argument_list, named_argument): New rules
16292
16293         (attribute_arguments): Use the above so that we are more correct.
16294
16295 2001-11-02  Ravi Pratap  <ravi@ximian.com>
16296
16297         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
16298         to perform all checks for a method with a params parameter.
16299
16300         (Invocation::OverloadResolve): Update to use the above method and therefore
16301         cope correctly with params method invocations.
16302
16303         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
16304         params too.
16305
16306         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
16307         constructors in our parent too because we can't afford to miss out on 
16308         protected ones ;-)
16309
16310         * attribute.cs (AttributeSection): New name for the class Attribute
16311
16312         Other trivial changes to improve readability.
16313
16314         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
16315         use the new class names.
16316
16317 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16318
16319         * class.cs (Method::Define): Complete definition for params types too
16320
16321         (Indexer::Define): Ditto.
16322
16323         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
16324         Cope everywhere with a request for info about the array parameter.
16325
16326 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16327
16328         * tree.cs (RecordNamespace): Fix up to check for the correct key.
16329
16330         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
16331         local_variable_type to extract the string corresponding to the type.
16332
16333         (local_variable_type): Fixup the action to use the new helper method.
16334
16335         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
16336         go.
16337
16338         * expression.cs : Clean out code which uses the above.
16339
16340 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16341
16342         * typemanager.cs (RegisterMethod): Check if we already have an existing key
16343         and bale out if necessary by returning a false.
16344
16345         (RegisterProperty): Ditto.
16346
16347         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
16348         and print out appropriate error messages.
16349
16350         * interface.cs (everywhere): Ditto.
16351
16352         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
16353         location to constructor.
16354
16355         * class.cs (Property, Event, Indexer): Update accordingly.
16356
16357         * ../errors/cs111.cs : Added.
16358
16359         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
16360         of a method, as laid down by the spec.
16361
16362         (Invocation::OverloadResolve): Use the above method.
16363
16364 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16365
16366         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
16367         now take a TypeContainer and a Parameters object.
16368
16369         (ParameterData): Modify return type of ParameterModifier method to be 
16370         Parameter.Modifier and not a string.
16371
16372         (ReflectionParameters, InternalParameters): Update accordingly.
16373
16374         * expression.cs (Argument::GetParameterModifier): Same here.
16375
16376         * support.cs (InternalParameters::ParameterType): Find a better way of determining
16377         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
16378         symbol in it at all so maybe this is only for now.
16379
16380 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16381
16382         * support.cs (InternalParameters): Constructor now takes an extra argument 
16383         which is the actual Parameters class.
16384
16385         (ParameterDesc): Update to provide info on ref/out modifiers.
16386
16387         * class.cs (everywhere): Update call to InternalParameters to pass in
16388         the second argument too.
16389
16390         * support.cs (ParameterData): Add ParameterModifier, which is a method 
16391         to return the modifier info [ref/out etc]
16392
16393         (InternalParameters, ReflectionParameters): Implement the above.
16394
16395         * expression.cs (Argument::ParameterModifier): Similar function to return
16396         info about the argument's modifiers.
16397
16398         (Invocation::OverloadResolve): Update to take into account matching modifiers 
16399         too.
16400
16401         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
16402         a new SetFormalParameters object which we pass to InternalParameters.
16403
16404 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16405
16406         * expression.cs (NewArray): Merge into the ArrayCreation class.
16407
16408 2001-10-29  Ravi Pratap  <ravi@ximian.com>
16409
16410         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
16411         NewUserdefinedArray into one as there wasn't much of a use in having
16412         two separate ones.
16413
16414         * expression.cs (Argument): Change field's name to ArgType from Type.
16415
16416         (Type): New readonly property which returns the proper type, taking into 
16417         account ref/out modifiers.
16418
16419         (everywhere): Adjust code accordingly for the above.
16420
16421         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
16422         whether we are emitting for a ref or out parameter.
16423
16424         * expression.cs (Argument::Emit): Use the above field to set the state.
16425
16426         (LocalVariableReference::Emit): Update to honour the flag and emit the
16427         right stuff.
16428
16429         * parameter.cs (Attributes): Set the correct flags for ref parameters.
16430
16431         * expression.cs (Argument::FullDesc): New function to provide a full desc.
16432
16433         * support.cs (ParameterData): Add method ParameterDesc to the interface.
16434
16435         (ReflectionParameters, InternalParameters): Implement the above method.
16436
16437         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
16438         reporting errors.
16439
16440         (Invocation::FullMethodDesc): Ditto. 
16441
16442 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
16443
16444         * cs-parser.jay: Add extra production for the second form of array
16445         creation. 
16446
16447         * expression.cs (ArrayCreation): Update to reflect the above
16448         change. 
16449
16450         * Small changes to prepare for Array initialization.
16451
16452 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
16453
16454         * typemanager.cs (ImplementsInterface): interface might be null;
16455         Deal with this problem;
16456
16457         Also, we do store negative hits on the cache (null values), so use
16458         this instead of calling t.GetInterfaces on the type everytime.
16459
16460 2001-10-28  Ravi Pratap  <ravi@ximian.com>
16461
16462         * typemanager.cs (IsBuiltinType): New method to help determine the same.
16463
16464         * expression.cs (New::DoResolve): Get rid of array creation code and instead
16465         split functionality out into different classes.
16466
16467         (New::FormArrayType): Move into NewBuiltinArray.
16468
16469         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
16470         quite useless.
16471
16472         (NewBuiltinArray): New class to handle creation of built-in arrays.
16473
16474         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
16475         account creation of one-dimensional arrays.
16476
16477         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
16478
16479         (NewUserdefinedArray::DoResolve): Implement.
16480
16481         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
16482
16483         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
16484         we maintain inside the TypeManager. This is necessary to perform lookups on the
16485         module builder.
16486
16487         (LookupType): Update to perform GetType on the module builders too.     
16488
16489         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
16490
16491         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
16492
16493 2001-10-23  Ravi Pratap  <ravi@ximian.com>
16494
16495         * expression.cs (New::DoResolve): Implement guts of array creation.
16496
16497         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
16498
16499 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
16500
16501         * expression.cs: Fix bug I introduced lsat night that broke
16502         Delegates. 
16503
16504         (Expression.Resolve): Report a 246 error (can not resolve name)
16505         if we find a SimpleName in the stream.
16506
16507         (Expression.ResolveLValue): Ditto.
16508
16509         (Expression.ResolveWithSimpleName): This function is a variant of
16510         ResolveName, this one allows SimpleNames to be returned without a
16511         warning.  The only consumer of SimpleNames is MemberAccess
16512
16513 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
16514
16515         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
16516         might arrive here.  I have my doubts that this is correct.
16517
16518         * statement.cs (Lock): Implement lock statement.
16519
16520         * cs-parser.jay: Small fixes to support `lock' and `using'
16521
16522         * cs-tokenizer.cs: Remove extra space
16523
16524         * driver.cs: New flag --checked, allows to turn on integer math
16525         checking. 
16526
16527         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
16528         Threading.Monitor.Exit 
16529
16530 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
16531
16532         * expression.cs (IndexerAccess::DoResolveLValue): Set the
16533         Expression Class to be IndexerAccess.
16534
16535         Notice that Indexer::DoResolve sets the eclass to Value.
16536
16537 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
16538
16539         * class.cs (TypeContainer::Emit): Emit code for indexers.
16540
16541         * assign.cs (IAssignMethod): New interface implemented by Indexers
16542         and Properties for handling assignment.
16543
16544         (Assign::Emit): Simplify and reuse code. 
16545
16546         * expression.cs (IndexerAccess, PropertyExpr): Implement
16547         IAssignMethod, clean up old code. 
16548
16549 2001-10-22  Ravi Pratap  <ravi@ximian.com>
16550
16551         * typemanager.cs (ImplementsInterface): New method to determine if a type
16552         implements a given interface. Provides a nice cache too.
16553
16554         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
16555         method.
16556
16557         (ConvertReferenceExplicit): Ditto.
16558
16559         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
16560         various methods, with correct names etc.
16561
16562         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
16563         Operator.UnaryNegation.
16564
16565         * cs-parser.jay (operator_declarator): Be a little clever in the case where
16566         we have a unary plus or minus operator.
16567
16568         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
16569         UnaryMinus.
16570
16571         * everywhere : update accordingly.
16572
16573         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
16574         respectively.
16575
16576         * class.cs (Method::Define): For the case where we are implementing a method
16577         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
16578         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
16579
16580 2001-10-21  Ravi Pratap  <ravi@ximian.com>
16581
16582         * interface.cs (FindMembers): Implement to work around S.R.E
16583         lameness.
16584
16585         * typemanager.cs (IsInterfaceType): Implement.
16586
16587         (FindMembers): Update to handle interface types too.
16588
16589         * expression.cs (ImplicitReferenceConversion): Re-write bits which
16590         use IsAssignableFrom as that is not correct - it doesn't work.
16591
16592         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
16593         and accordingly override EmitStatement.
16594
16595         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
16596         using the correct logic :-)
16597
16598 2001-10-19  Ravi Pratap  <ravi@ximian.com>
16599
16600         * ../errors/cs-11.cs : Add to demonstrate error -11 
16601
16602 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
16603
16604         * assign.cs (Assign::Resolve): Resolve right hand side first, and
16605         then pass this as a hint to ResolveLValue.
16606
16607         * expression.cs (FieldExpr): Add Location information
16608
16609         (FieldExpr::LValueResolve): Report assignment to readonly
16610         variable. 
16611
16612         (Expression::ExprClassFromMemberInfo): Pass location information.
16613
16614         (Expression::ResolveLValue): Add new method that resolves an
16615         LValue. 
16616
16617         (Expression::DoResolveLValue): Default invocation calls
16618         DoResolve. 
16619
16620         (Indexers): New class used to keep track of indexers in a given
16621         Type. 
16622
16623         (IStackStore): Renamed from LValue, as it did not really describe
16624         what this did.  Also ResolveLValue is gone from this interface and
16625         now is part of Expression.
16626
16627         (ElementAccess): Depending on the element access type
16628
16629         * typemanager.cs: Add `indexer_name_type' as a Core type
16630         (System.Runtime.CompilerServices.IndexerNameAttribute)
16631
16632         * statement.cs (Goto): Take a location.
16633
16634 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16635
16636         * delegate.cs (Delegate::VerifyDelegate): New method to verify
16637         if two delegates are compatible.
16638
16639         (NewDelegate::DoResolve): Update to take care of the case when
16640         we instantiate a delegate from another delegate.
16641
16642         * typemanager.cs (FindMembers): Don't even try to look up members
16643         of Delegate types for now.
16644
16645 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16646
16647         * delegate.cs (NewDelegate): New class to take care of delegate
16648         instantiation.
16649
16650         * expression.cs (New): Split the delegate related code out into 
16651         the NewDelegate class.
16652
16653         * delegate.cs (DelegateInvocation): New class to handle delegate 
16654         invocation.
16655
16656         * expression.cs (Invocation): Split out delegate related code into
16657         the DelegateInvocation class.
16658
16659 2001-10-17  Ravi Pratap  <ravi@ximian.com>
16660
16661         * expression.cs (New::DoResolve): Implement delegate creation fully
16662         and according to the spec.
16663
16664         (New::DoEmit): Update to handle delegates differently.
16665
16666         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
16667         because of which we were printing out arguments in reverse order !
16668
16669         * delegate.cs (VerifyMethod): Implement to check if the given method
16670         matches the delegate.
16671
16672         (FullDelegateDesc): Implement.
16673
16674         (VerifyApplicability): Implement.
16675
16676         * expression.cs (Invocation::DoResolve): Update to accordingly handle
16677         delegate invocations too.
16678
16679         (Invocation::Emit): Ditto.
16680
16681         * ../errors/cs1593.cs : Added.
16682
16683         * ../errors/cs1594.cs : Added.
16684
16685         * delegate.cs (InstanceExpression, TargetMethod): New properties.
16686
16687 2001-10-16  Ravi Pratap  <ravi@ximian.com>
16688
16689         * typemanager.cs (intptr_type): Core type for System.IntPtr
16690
16691         (InitCoreTypes): Update for the same.
16692
16693         (iasyncresult_type, asynccallback_type): Ditto.
16694
16695         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
16696         correct.
16697
16698         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
16699         too.
16700
16701         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
16702         the builders for the 4 members of a delegate type :-)
16703
16704         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
16705         type.
16706
16707         * expression.cs (New::DoResolve): Implement guts for delegate creation.
16708
16709         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
16710
16711 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
16712
16713         * statement.cs (Break::Emit): Implement.   
16714         (Continue::Emit): Implement.
16715
16716         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16717         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16718         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16719         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
16720         end loop
16721
16722         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
16723         properties that track the label for the current loop (begin of the
16724         loop and end of the loop).
16725
16726 2001-10-15  Ravi Pratap  <ravi@ximian.com>
16727
16728         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
16729         use of emitting anything at all.
16730
16731         * class.cs, rootcontext.cs : Get rid of calls to the same.
16732
16733         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
16734
16735         (Populate): Define the constructor correctly and set the implementation
16736         attributes.
16737
16738         * typemanager.cs (delegate_types): New hashtable to hold delegates that
16739         have been defined.
16740
16741         (AddDelegateType): Implement.
16742
16743         (IsDelegateType): Implement helper method.
16744
16745         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
16746
16747         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
16748         and accordingly handle it.
16749
16750         * delegate.cs (Populate): Take TypeContainer argument.
16751         Implement bits to define the Invoke method. However, I still haven't figured out
16752         how to take care of the native int bit :-(
16753
16754         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
16755         Qualify the name of the delegate, not its return type !
16756
16757         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
16758         conversion.
16759
16760         (StandardConversionExists): Checking for array types turns out to be recursive.
16761
16762         (ConvertReferenceExplicit): Implement array conversion.
16763
16764         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
16765
16766 2001-10-12  Ravi Pratap  <ravi@ximian.com>
16767
16768         * cs-parser.jay (delegate_declaration): Store the fully qualified
16769         name as it is a type declaration.
16770
16771         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16772         readonly.
16773
16774         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16775         as TypeContainer::DefineType.
16776
16777         (Populate): Method in which all the definition of the various methods (Invoke)
16778         etc is done.
16779
16780         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16781         see.
16782
16783         (CloseDelegate): Finally creates the delegate.
16784
16785         * class.cs (TypeContainer::DefineType): Update to define delegates.
16786         (Populate, Emit and CloseType): Do the same thing here too.
16787
16788         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16789         delegates in all these operations.
16790
16791 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16792
16793         * expression.cs: LocalTemporary: a new expression used to
16794         reference a temporary that has been created.
16795
16796         * assign.cs: Handle PropertyAccess back here, so that we can
16797         provide the proper semantic access to properties.
16798
16799         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16800         a few more explicit conversions. 
16801
16802         * modifiers.cs: `NEW' modifier maps to HideBySig.
16803
16804         * expression.cs (PropertyExpr): Make this into an
16805         ExpressionStatement, and support the EmitStatement code path. 
16806
16807         Perform get/set error checking, clean up the interface.
16808
16809         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16810         them into toplevel access objects.
16811
16812 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16813
16814         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16815         SRE.
16816
16817         * typemanager.cs: Keep track here of our PropertyBuilders again to
16818         work around lameness in SRE.
16819
16820 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16821
16822         * expression.cs (LValue::LValueResolve): New method in the
16823         interface, used to perform a second resolution pass for LValues. 
16824
16825         (This::DoResolve): Catch the use of this in static methods.
16826
16827         (This::LValueResolve): Implement.
16828
16829         (This::Store): Remove warning, assigning to `this' in structures
16830         is 
16831
16832         (Invocation::Emit): Deal with invocation of
16833         methods on value types.  We need to pass the address to structure
16834         methods rather than the object itself.  (The equivalent code to
16835         emit "this" for structures leaves the entire structure on the
16836         stack instead of a pointer to it). 
16837
16838         (ParameterReference::DoResolve): Compute the real index for the
16839         argument based on whether the method takes or not a `this' pointer
16840         (ie, the method is static).
16841
16842         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16843         value types returned from functions when we need to invoke a
16844         method on the sturcture.
16845
16846
16847 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16848
16849         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16850         defining the type in the Modulebuilder or Typebuilder. This is to take
16851         care of nested types which need to be defined on the TypeBuilder using
16852         DefineNestedMethod.
16853
16854         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16855         methods in RootContext, only ported to be part of TypeContainer.
16856
16857         (TypeContainer::GetInterfaceOrClass): Ditto.
16858
16859         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16860
16861         * interface.cs (Interface::DefineInterface): New method. Does exactly
16862         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16863         too.
16864
16865         (Interface::GetInterfaces): Move from RootContext here and port.
16866
16867         (Interface::GetInterfaceByName): Same here.
16868
16869         * rootcontext.cs (ResolveTree): Re-write.
16870
16871         (PopulateTypes): Re-write.
16872
16873         * class.cs (TypeContainer::Populate): Populate nested types too.
16874         (TypeContainer::Emit): Emit nested members too.
16875
16876         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16877         instead just use the name argument passed in as it is already fully
16878         qualified.
16879
16880         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16881         to TypeContainer mapping to see if a type is user-defined.
16882
16883         * class.cs (TypeContainer::CloseType): Implement. 
16884
16885         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16886         the default constructor.
16887
16888         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16889         twice.
16890
16891         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16892
16893         * interface.cs (CloseType): Create the type here.
16894
16895         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16896         the hierarchy.
16897
16898         Remove all the methods which are now in TypeContainer.
16899
16900 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16901
16902         * delegate.cs (Define): Re-write bits to define the delegate
16903         correctly.
16904
16905 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16906
16907         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16908
16909         * expression.cs (ImplicitReferenceConversion): handle null as well
16910         as a source to convert to any reference type.
16911
16912         * statement.cs (Return): Perform any implicit conversions to
16913         expected return type.  
16914
16915         Validate use of return statement.  
16916
16917         * codegen.cs (EmitContext): Pass the expected return type here.
16918
16919         * class.cs (Method, Constructor, Property): Pass expected return
16920         type to EmitContext.
16921
16922 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16923
16924         * expression.cs: Make DoResolve take an EmitContext instead of a
16925         TypeContainer.
16926
16927         Replaced `l' and `location' for `loc', for consistency.
16928
16929         (Error, Warning): Remove unneeded Tc argument.
16930
16931         * assign.cs, literal.cs, constant.cs: Update to new calling
16932         convention. 
16933
16934         * codegen.cs: EmitContext now contains a flag indicating whether
16935         code is being generated in a static method or not.
16936
16937         * cs-parser.jay: DecomposeQI, new function that replaces the old
16938         QualifiedIdentifier.  Now we always decompose the assembled
16939         strings from qualified_identifier productions into a group of
16940         memberaccesses.
16941
16942 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16943
16944         * rootcontext.cs: Deal with field-less struct types correctly now
16945         by passing the size option to Define Type.
16946
16947         * class.cs: Removed hack that created one static field. 
16948
16949 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16950
16951         * statement.cs: Moved most of the code generation here. 
16952
16953 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16954
16955         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16956         seem very right.
16957
16958         (ElementAccess): Remove useless bits for now - keep checks as the spec
16959         says.
16960
16961 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16962
16963         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16964         and start performing checks according to the spec.
16965
16966 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16967
16968         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16969         rank_specifiers instead.
16970
16971         (rank_specifiers): Change the order in which the rank specifiers are stored
16972
16973         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16974
16975         * expression.cs (ElementAccess): Implement the LValue interface too.
16976
16977 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16978
16979         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16980         except that user defined conversions are not included.
16981
16982         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16983         perform the conversion of the return type, if necessary.
16984
16985         (New::DoResolve): Check whether we are creating an array or an object
16986         and accordingly do the needful.
16987
16988         (New::Emit): Same here.
16989
16990         (New::DoResolve): Implement guts of array creation.
16991
16992         (New::FormLookupType): Helper function.
16993
16994 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16995
16996         * codegen.cs: Removed most of the code generation here, and move the
16997         corresponding code generation bits to the statement classes. 
16998
16999         Added support for try/catch/finalize and throw.
17000
17001         * cs-parser.jay: Added support for try/catch/finalize.
17002
17003         * class.cs: Catch static methods having the flags override,
17004         virtual or abstract.
17005
17006         * expression.cs (UserCast): This user cast was not really doing
17007         what it was supposed to do.  Which is to be born in fully resolved
17008         state.  Parts of the resolution were being performed at Emit time! 
17009
17010         Fixed this code.
17011
17012 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17013
17014         * expression.cs: Implicity convert the result from UserCast.
17015
17016 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17017
17018         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
17019         prevented it from working correctly. 
17020
17021         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
17022         merely ConvertImplicit.
17023
17024 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17025
17026         * typemanager.cs: Make the LookupTypeContainer function static,
17027         and not per-instance.  
17028
17029         * class.cs: Make static FindMembers (the one that takes a Type
17030         argument). 
17031
17032         * codegen.cs: Add EmitForeach here.
17033
17034         * cs-parser.jay: Make foreach a toplevel object instead of the
17035         inline expansion, as we need to perform semantic analysis on it. 
17036
17037 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17038
17039         * expression.cs (Expression::ImplicitUserConversion): Rename to
17040         UserDefinedConversion.
17041
17042         (Expression::UserDefinedConversion): Take an extra argument specifying 
17043         whether we look for explicit user conversions too.
17044
17045         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
17046
17047         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
17048
17049         (ExplicitUserConversion): Make it a call to UserDefinedConversion
17050         with the appropriate arguments.
17051
17052         * cs-parser.jay (cast_expression): Record location too.
17053
17054         * expression.cs (Cast): Record location info.
17055
17056         (Expression::ConvertExplicit): Take location argument.
17057
17058         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
17059         to determine if we are doing explicit conversions.
17060
17061         (UserCast::Emit): Update accordingly.
17062
17063         (Expression::ConvertExplicit): Report an error if everything fails.
17064
17065         * ../errors/cs0030.cs : Add.
17066
17067 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
17068
17069         * modifiers.cs: If the ABSTRACT keyword is present, also set the
17070         virtual and newslot bits. 
17071
17072         * class.cs (TypeContainer::RegisterRequiredImplementations):
17073         Record methods we need.
17074
17075         (TypeContainer::MakeKey): Helper function to make keys for
17076         MethodBases, since the Methodbase key is useless.
17077
17078         (TypeContainer::Populate): Call RegisterRequiredImplementations
17079         before defining the methods.   
17080
17081         Create a mapping for method_builders_to_methods ahead of time
17082         instead of inside a tight loop.
17083
17084         (::RequireMethods):  Accept an object as the data to set into the
17085         hashtable so we can report interface vs abstract method mismatch.
17086
17087 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17088
17089         * report.cs: Make all of it static.
17090
17091         * rootcontext.cs: Drop object_type and value_type computations, as
17092         we have those in the TypeManager anyways.
17093
17094         Drop report instance variable too, now it is a global.
17095
17096         * driver.cs: Use try/catch on command line handling.
17097
17098         Add --probe option to debug the error reporting system with a test
17099         suite. 
17100
17101         * report.cs: Add support for exiting program when a probe
17102         condition is reached.
17103
17104 2001-10-03  Ravi Pratap  <ravi@ximian.com>
17105
17106         * expression.cs (Binary::DoNumericPromotions): Fix the case when
17107         we do a forcible conversion regardless of type, to check if 
17108         ForceConversion returns a null.
17109
17110         (Binary::error19): Use location to report error.
17111
17112         (Unary::error23): Use location here too.
17113
17114         * ../errors/cs0019.cs : Check in.
17115
17116         * ../errors/cs0023.cs : Check in.
17117
17118         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
17119         case of a non-null MethodInfo object with a length of 0 !
17120
17121         (Binary::ResolveOperator): Flag error if overload resolution fails to find
17122         an applicable member - according to the spec :-)
17123         Also fix logic to find members in base types.
17124
17125         (Unary::ResolveOperator): Same here.
17126
17127         (Unary::report23): Change name to error23 and make first argument a TypeContainer
17128         as I was getting thoroughly confused between this and error19 :-)
17129
17130         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
17131         (::FindMostEncompassedType): Implement.
17132         (::FindMostEncompassingType): Implement.
17133         (::StandardConversionExists): Implement.
17134
17135         (UserImplicitCast): Re-vamp. We now need info about most specific
17136         source and target types so that we can do the necessary conversions.
17137
17138         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
17139         mathematical union with no duplicates.
17140
17141 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17142
17143         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
17144         in order from base classes to child classes, so that we can in
17145         child classes look up in our parent for method names and
17146         attributes (required for handling abstract, virtual, new, override
17147         constructs: we need to instrospect our base class, and if we dont
17148         populate the classes in order, the introspection might be
17149         incorrect.  For example, a method could query its parent before
17150         the parent has any methods and would determine that the parent has
17151         no abstract methods (while it could have had them)).
17152
17153         (RootContext::CreateType): Record the order in which we define the
17154         classes.
17155
17156 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
17157
17158         * class.cs (TypeContainer::Populate): Also method definitions can
17159         fail now, keep track of this.
17160
17161         (TypeContainer::FindMembers): Implement support for
17162         DeclaredOnly/noDeclaredOnly flag.
17163
17164         (Constructor::Emit) Return the ConstructorBuilder.
17165
17166         (Method::Emit) Return the MethodBuilder. 
17167         Check for abstract or virtual methods to be public.
17168
17169         * rootcontext.cs (RootContext::CreateType): Register all the
17170         abstract methods required for the class to be complete and the
17171         interface methods that must be implemented. 
17172
17173         * cs-parser.jay: Report error 501 (method requires body if it is
17174         not marked abstract or extern).
17175
17176         * expression.cs (TypeOf::Emit): Implement.
17177
17178         * typemanager.cs: runtime_handle_type, new global type.
17179
17180         * class.cs (Property::Emit): Generate code for properties.
17181
17182 2001-10-02  Ravi Pratap  <ravi@ximian.com>
17183
17184         * expression.cs (Unary::ResolveOperator): Find operators on base type
17185         too - we now conform exactly to the spec.
17186
17187         (Binary::ResolveOperator): Same here.
17188
17189         * class.cs (Operator::Define): Fix minor quirk in the tests.
17190
17191         * ../errors/cs0215.cs : Added.
17192
17193         * ../errors/cs0556.cs : Added.
17194
17195         * ../errors/cs0555.cs : Added.
17196
17197 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17198
17199         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
17200         single integer which is really efficient
17201
17202 2001-10-01  Ravi Pratap  <ravi@ximian.com>
17203
17204         *  expression.cs (Expression::ImplicitUserConversion): Use location
17205         even in the case when we are examining True operators.
17206  
17207         * class.cs (Operator::Define): Perform extensive checks to conform
17208         with the rules for operator overloading in the spec.
17209
17210         * expression.cs (Expression::ImplicitReferenceConversion): Implement
17211         some of the other conversions mentioned in the spec.
17212
17213         * typemanager.cs (array_type): New static member for the System.Array built-in
17214         type.
17215
17216         (cloneable_interface): For System.ICloneable interface.
17217
17218         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
17219         we start resolving the tree and populating types.
17220
17221         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
17222  
17223 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17224
17225         * expression.cs (Expression::ExprClassFromMemberInfo,
17226         Expression::Literalize): Create literal expressions from
17227         FieldInfos which are literals.
17228
17229         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
17230         type casts, because they were wrong.  The test suite in tests
17231         caught these ones.
17232
17233         (ImplicitNumericConversion): ushort to ulong requires a widening
17234         cast. 
17235
17236         Int32 constant to long requires widening cast as well.
17237
17238         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
17239         for integers because the type on the stack is not i4.
17240
17241 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
17242
17243         * expression.cs (report118): require location argument. 
17244
17245         * parameter.cs: Do not dereference potential null value.
17246
17247         * class.cs: Catch methods that lack the `new' keyword when
17248         overriding a name.  Report warnings when `new' is used without
17249         anything being there to override.
17250
17251         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
17252
17253         * class.cs: Only add constructor to hashtable if it is non-null
17254         (as now constructors can fail on define).
17255
17256         (TypeManager, Class, Struct): Take location arguments.
17257
17258         Catch field instance initialization in structs as errors.
17259
17260         accepting_filter: a new filter for FindMembers that is static so
17261         that we dont create an instance per invocation.
17262
17263         (Constructor::Define): Catch errors where a struct constructor is
17264         parameterless 
17265
17266         * cs-parser.jay: Pass location information for various new
17267         constructs. 
17268
17269         * delegate.cs (Delegate): take a location argument.
17270
17271         * driver.cs: Do not call EmitCode if there were problesm in the
17272         Definition of the types, as many Builders wont be there. 
17273
17274         * decl.cs (Decl::Decl): Require a location argument.
17275
17276         * cs-tokenizer.cs: Handle properly hex constants that can not fit
17277         into integers, and find the most appropiate integer for it.
17278
17279         * literal.cs: Implement ULongLiteral.
17280
17281         * rootcontext.cs: Provide better information about the location of
17282         failure when CreateType fails.
17283
17284 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
17285
17286         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
17287         as well.
17288
17289         * expression.cs (Binary::CheckShiftArguments): Add missing type
17290         computation.
17291         (Binary::ResolveOperator): Add type to the logical and and logical
17292         or, Bitwise And/Or and Exclusive Or code paths, it was missing
17293         before.
17294
17295         (Binary::DoNumericPromotions): In the case where either argument
17296         is ulong (and most signed types combined with ulong cause an
17297         error) perform implicit integer constant conversions as well.
17298
17299 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17300
17301         * expression.cs (UserImplicitCast): Method should always be
17302         non-null. 
17303         (Invocation::BetterConversion): Simplified test for IntLiteral.
17304
17305         (Expression::ImplicitNumericConversion): Split this routine out.
17306         Put the code that performs implicit constant integer conversions
17307         here. 
17308
17309         (Expression::Resolve): Become a wrapper around DoResolve so we can
17310         check eclass and type being set after resolve.
17311
17312         (Invocation::Badness): Remove this dead function
17313
17314         (Binary::ResolveOperator): Do not compute the expensive argumnets
17315         unless we have a union for it.
17316
17317         (Probe::Emit): Is needs to do an isinst and then
17318         compare against null.
17319
17320         (::CanConvert): Added Location argument.  If the Location argument
17321         is null (Location.Null), then we do not report errors.  This is
17322         used by the `probe' mechanism of the Explicit conversion.  We do
17323         not want to generate an error for something that the user
17324         explicitly requested to be casted.  But the pipeline for an
17325         explicit cast first tests for potential implicit casts.
17326
17327         So for now, if the Location is null, it means `Probe only' to
17328         avoid adding another argument.   Might have to revise this
17329         strategy later.
17330
17331         (ClassCast): New class used to type cast objects into arbitrary
17332         classes (used in Explicit Reference Conversions).
17333
17334         Implement `as' as well.
17335
17336         Reverted all the patches from Ravi below: they were broken:
17337
17338                 * The use of `level' as a mechanism to stop recursive
17339                   invocations is wrong.  That was there just to catch the
17340                   bug with a strack trace but not as a way of addressing
17341                   the problem.
17342
17343                   To fix the problem we have to *understand* what is going
17344                   on and the interactions and come up with a plan, not
17345                   just get things going.
17346
17347                 * The use of the type conversion cache that I proposed
17348                   last night had an open topic: How does this work across
17349                   protection domains.  A user defined conversion might not
17350                   be public in the location where we are applying the
17351                   conversion, a different conversion might be selected
17352                   (ie, private A->B (better) but public B->A (worse),
17353                   inside A, A->B applies, but outside it, B->A will
17354                   apply).
17355
17356                 * On top of that (ie, even if the above is solved),
17357                   conversions in a cache need to be abstract.  Ie, `To
17358                   convert from an Int to a Short use an OpcodeCast', not
17359                   `To convert from an Int to a Short use the OpcodeCast on
17360                   the variable 5' (which is what this patch was doing).
17361
17362 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17363
17364         * expression.cs (Invocation::ConversionExists): Re-write to use
17365         the conversion cache
17366
17367         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
17368         cache all conversions done, not just user-defined ones.
17369
17370         (Invocation::BetterConversion): The real culprit. Use ConversionExists
17371         to determine if a conversion exists instead of acutually trying to 
17372         perform the conversion. It's faster too.
17373
17374         (Expression::ConvertExplicit): Modify to use ConversionExists to check
17375         and only then attempt the implicit conversion.
17376
17377 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17378
17379         * expression.cs (ConvertImplicit): Use a cache for conversions
17380         already found. Check level of recursion and bail out if necessary.
17381
17382 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17383
17384         * typemanager.cs (string_concat_string_string, string_concat_object_object):
17385         Export standard methods that we expect for string operations.
17386
17387         * statement.cs (Block::UsageWarning): Track usage of variables and
17388         report the errors for not used variables.
17389
17390         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
17391         operator. 
17392
17393 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17394
17395         * codegen.cs: remove unnneded code 
17396
17397         * expression.cs: Removed BuiltinTypeAccess class
17398
17399         Fix the order in which implicit conversions are
17400         done.  
17401
17402         The previous fixed dropped support for boxed conversions (adding a
17403         test to the test suite now)
17404
17405         (UserImplicitCast::CanConvert): Remove test for source being null,
17406         that code is broken.  We should not feed a null to begin with, if
17407         we do, then we should track the bug where the problem originates
17408         and not try to cover it up here.
17409
17410         Return a resolved expression of type UserImplicitCast on success
17411         rather than true/false.  Ravi: this is what I was talking about,
17412         the pattern is to use a static method as a "constructor" for
17413         objects. 
17414
17415         Also, do not create arguments until the very last minute,
17416         otherwise we always create the arguments even for lookups that
17417         will never be performed. 
17418
17419         (UserImplicitCast::Resolve): Eliminate, objects of type
17420         UserImplicitCast are born in a fully resolved state. 
17421
17422         * typemanager.cs (InitCoreTypes): Init also value_type
17423         (System.ValueType). 
17424
17425         * expression.cs (Cast::Resolve): First resolve the child expression.
17426
17427         (LValue): Add new method AddressOf to be used by
17428         the `&' operator.  
17429
17430         Change the argument of Store to take an EmitContext instead of an
17431         ILGenerator, because things like FieldExpr need to be able to call
17432         their children expression to generate the instance code. 
17433
17434         (Expression::Error, Expression::Warning): Sugar functions for
17435         reporting errors.
17436
17437         (Expression::MemberLookup): Accept a TypeContainer instead of a
17438         Report as the first argument.
17439
17440         (Expression::ResolvePrimary): Killed.  I still want to improve
17441         this as currently the code is just not right.
17442
17443         (Expression::ResolveMemberAccess): Simplify, but it is still
17444         wrong. 
17445
17446         (Unary::Resolve): Catch errors in AddressOf operators.
17447
17448         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
17449         index to a byte for the short-version, or the compiler will choose
17450         the wrong Emit call, which generates the wrong data.
17451
17452         (ParameterReference::Emit, ::Store): same.
17453
17454         (FieldExpr::AddressOf): Implement.
17455
17456         * typemanager.cs: TypeManager: made public variable instead of
17457         property.
17458
17459         * driver.cs: document --fatal.
17460
17461         * report.cs (ErrorMessage, WarningMessage): new names for the old
17462         Error and Warning classes.
17463
17464         * cs-parser.jay (member_access): Turn built-in access to types
17465         into a normal simplename
17466
17467 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17468
17469         * expression.cs (Invocation::BetterConversion): Fix to cope
17470         with q being null, since this was introducing a bug.
17471
17472         * expression.cs (ConvertImplicit): Do built-in conversions first.
17473
17474 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17475
17476         * expression.cs (UserImplicitCast::Resolve): Fix bug.
17477
17478 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17479
17480         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
17481         I had introduced long ago (what's new ?).
17482
17483         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
17484         the work of all the checking. 
17485         (ConvertImplicit): Call CanConvert and only then create object if necessary.
17486         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
17487
17488         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
17489         that is the right way. 
17490
17491         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
17492         overloading resolution. Use everywhere instead of cutting and pasting code.
17493
17494         (Binary::ResolveOperator): Use MakeUnionSet.
17495
17496         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
17497         we have to convert to bool types. Not complete yet.
17498
17499 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17500
17501         * typemanager.cs (TypeManager::CSharpName): support ushort.
17502
17503         * expression.cs (Expression::TryImplicitIntConversion): Attempts
17504         to provide an expression that performsn an implicit constant int
17505         conversion (section 6.1.6).
17506         (Expression::ConvertImplicitRequired): Reworked to include
17507         implicit constant expression conversions.
17508
17509         (Expression::ConvertNumericExplicit): Finished.
17510
17511         (Invocation::Emit): If InstanceExpression is null, then it means
17512         that we perform a call on this.
17513
17514 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17515
17516         * expression.cs (Unary::Emit): Remove some dead code.
17517         (Probe): Implement Resolve and Emit for `is'.
17518         (Expression::ConvertImplicitRequired): Attempt to do constant
17519         expression conversions here.  Maybe should be moved to
17520         ConvertImplicit, but I am not sure.
17521         (Expression::ImplicitLongConstantConversionPossible,
17522         Expression::ImplicitIntConstantConversionPossible): New functions
17523         that tell whether is it possible to apply an implicit constant
17524         expression conversion.
17525
17526         (ConvertNumericExplicit): Started work on explicit numeric
17527         conversions.
17528
17529         * cs-parser.jay: Update operator constants.
17530
17531         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
17532         (Parameters::GetSignature): Hook up VerifyArgs here.
17533         (Parameters::VerifyArgs): Verifies that no two arguments have the
17534         same name. 
17535
17536         * class.cs (Operator): Update the operator names to reflect the
17537         ones that the spec expects (as we are just stringizing the
17538         operator names).
17539
17540         * expression.cs (Unary::ResolveOperator): Fix bug: Use
17541         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
17542         previous usage did only work for our methods.
17543         (Expression::ConvertImplicit): Handle decimal implicit numeric
17544         conversions as well.
17545         (Expression::InternalTypeConstructor): Used to invoke constructors
17546         on internal types for default promotions.
17547
17548         (Unary::Emit): Implement special handling for the pre/post
17549         increment/decrement for overloaded operators, as they need to have
17550         the same semantics as the other operators.
17551
17552         (Binary::ResolveOperator): ditto.
17553         (Invocation::ConversionExists): ditto.
17554         (UserImplicitCast::Resolve): ditto.
17555
17556 2001-09-26  Ravi Pratap  <ravi@ximian.com>
17557
17558         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
17559         operator, return after emitting body. Regression tests pass again !
17560
17561         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
17562         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
17563         (Invocation::OverloadResolve): Ditto.
17564         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
17565
17566         * everywhere : update calls to the above methods accordingly.
17567
17568 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17569
17570         * assign.cs (Assign): Make it inherit from ExpressionStatement.
17571
17572         * expression.cs (ExpressionStatement): New base class used for
17573         expressions that can appear in statements, so that we can provide
17574         an alternate path to generate expression that do not leave a value
17575         on the stack.
17576
17577         (Expression::Emit, and all the derivatives): We no longer return
17578         whether a value is left on the stack or not.  Every expression
17579         after being emitted leaves a single value on the stack.
17580
17581         * codegen.cs (EmitContext::EmitStatementExpression): Use the
17582         facilties of ExpressionStatement if possible.
17583
17584         * cs-parser.jay: Update statement_expression.
17585
17586 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
17587
17588         * driver.cs: Change the wording of message
17589
17590 2001-09-25  Ravi Pratap  <ravi@ximian.com>
17591
17592         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
17593         the type of the expression to the return type of the method if
17594         we have an overloaded operator match ! The regression tests pass again !
17595         (Unary::ResolveOperator): Ditto.
17596
17597         * expression.cs (Invocation::ConversionExists): Correct the member lookup
17598         to find "op_Implicit", not "implicit" ;-)
17599         (UserImplicitCast): New class to take care of user-defined implicit conversions.
17600         (ConvertImplicit, ForceConversion): Take TypeContainer argument
17601
17602         * everywhere : Correct calls to the above accordingly.
17603
17604         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
17605         (ConvertImplicit): Do user-defined conversion if it exists.
17606
17607 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
17608
17609         * assign.cs: track location.
17610         (Resolve): Use implicit conversions on assignment.
17611
17612         * literal.cs: Oops.  Not good, Emit of short access values should
17613         pass (Bytes) or the wrong argument will be selected.
17614
17615         * expression.cs (Unary::Emit): Emit code for -expr.
17616
17617         (Unary::ResolveOperator): Handle `Substract' for non-constants
17618         (substract from zero from the non-constants).
17619         Deal with Doubles as well. 
17620
17621         (Expression::ConvertImplicitRequired): New routine that reports an
17622         error if no implicit conversion exists. 
17623
17624         (Invocation::OverloadResolve): Store the converted implicit
17625         expressions if we make them
17626
17627 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17628
17629         * class.cs (ConstructorInitializer): Take a Location argument.
17630         (ConstructorBaseInitializer): Same here.
17631         (ConstructorThisInitializer): Same here.
17632
17633         * cs-parser.jay : Update all calls accordingly.
17634
17635         * expression.cs (Unary, Binary, New): Take location argument.
17636         Update accordingly everywhere.
17637
17638         * cs-parser.jay : Update all calls to the above to take a location
17639         argument.
17640
17641         * class.cs : Ditto.
17642
17643 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17644
17645         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
17646         (Invocation::BetterConversion): Same here
17647         (Invocation::ConversionExists): Ditto.
17648
17649         (Invocation::ConversionExists): Implement.
17650
17651 2001-09-22  Ravi Pratap  <ravi@ximian.com>
17652
17653         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
17654         Also take an additional TypeContainer argument.
17655
17656         * All over : Pass in TypeContainer as argument to OverloadResolve.
17657
17658         * typemanager.cs (CSharpName): Update to check for the string type and return
17659         that too.
17660
17661         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
17662         a given method.
17663
17664 2001-09-21  Ravi Pratap  <ravi@ximian.com>
17665
17666         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
17667         (Invocation::BetterFunction): Implement.
17668         (Invocation::BetterConversion): Implement.
17669         (Invocation::ConversionExists): Skeleton, no implementation yet.
17670
17671         Okay, things work fine !
17672
17673 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
17674
17675         * typemanager.cs: declare and load enum_type, delegate_type and
17676         void_type. 
17677
17678         * expression.cs (Expression::Emit): Now emit returns a value that
17679         tells whether a value is left on the stack or not.  This strategy
17680         might be reveted tomorrow with a mechanism that would address
17681         multiple assignments.
17682         (Expression::report118): Utility routine to report mismatches on
17683         the ExprClass.
17684
17685         (Unary::Report23): Report impossible type/operator combination
17686         utility function.
17687
17688         (Unary::IsIncrementableNumber): Whether the type can be
17689         incremented or decremented with add.
17690         (Unary::ResolveOperator): Also allow enumerations to be bitwise
17691         complemented. 
17692         (Unary::ResolveOperator): Implement ++, !, ~,
17693
17694         (Invocation::Emit): Deal with new Emit convetion.
17695
17696         * All Expression derivatives: Updated their Emit method to return
17697         whether they leave values on the stack or not.
17698
17699         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
17700         stack for expressions that are statements. 
17701
17702 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17703
17704         * expression.cs (LValue): New interface.  Must be implemented by
17705         LValue objects.
17706         (LocalVariableReference, ParameterReference, FieldExpr): Implement
17707         LValue interface.
17708
17709         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
17710         interface for generating code, simplifies the code.
17711
17712 2001-09-20  Ravi Pratap  <ravi@ximian.com>
17713
17714         * expression.cs (everywhere): Comment out return statements in ::Resolve
17715         methods to avoid the warnings.
17716
17717 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17718
17719         * driver.cs (parse): Report error 2001 if we can not open the
17720         source file.
17721
17722         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
17723         not resolve it.
17724
17725         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
17726         object. 
17727
17728         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
17729         otherwise nested blocks end up with the same index.
17730
17731         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
17732
17733         * expression.cs:  Instead of having FIXMEs in the Resolve
17734         functions, throw exceptions so it is obvious that we are facing a
17735         bug. 
17736
17737         * cs-parser.jay (invocation_expression): Pass Location information.
17738
17739         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
17740         Use a basename for those routines because .NET does not like paths
17741         on them. 
17742
17743         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
17744         already defined.
17745
17746 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
17747
17748         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
17749         are loading the correct data types (throws an exception if not).
17750         (TypeManager::InitCoreTypes): Use CoreLookupType
17751
17752         * expression.cs (Unary::ResolveOperator): return the child
17753         expression for expressions which are just +expr.
17754         (Unary::ResolveOperator): Return negative literals for -LITERAL
17755         expressions (otherwise they are Unary {Literal}).
17756         (Invocation::Badness): Take into account `Implicit constant
17757         expression conversions'.
17758
17759         * literal.cs (LongLiteral): Implement long literal class.
17760         (IntLiteral): export the `Value' of the intliteral. 
17761
17762 2001-09-19  Ravi Pratap  <ravi@ximian.com>
17763
17764         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
17765
17766         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
17767         instead of 'Operator'
17768
17769         * expression.cs (Binary::ResolveOperator): Update accordingly.
17770         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17771         and 'Minus'
17772
17773         * cs-parser.jay (unary_expression): Update to use the new names.
17774
17775         * gen-treedump.cs (GetUnary): Same here.
17776
17777         * expression.cs (Unary::Resolve): Implement.
17778         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17779         operators are found instead of making noise ;-)
17780         (Unary::ResolveOperator): New method to do precisely the same thing which
17781         Binary::ResolveOperator does for Binary expressions.
17782         (Unary.method, .Arguments): Add.
17783         (Unary::OperName): Implement.   
17784         (Unary::ForceConversion): Copy and Paste !
17785
17786         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17787         a unary operator.
17788
17789         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17790         for the inbuilt operators. Only overloading works for now ;-)
17791
17792 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17793
17794         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17795         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17796
17797         * expression.cs (This::Emit): Implement. 
17798         (This::Resolve): Implement.
17799         (TypeOf:Resolve): Implement.
17800         (Expression::ResolveSimpleName): Add an implicit this to instance
17801         field references. 
17802         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17803         Bind instance variable to Field expressions.
17804         (FieldExpr::Instance): New field used to track the expression that
17805         represents the object instance.
17806         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17807         binding 
17808         (FieldExpr::Emit): Implement.
17809
17810         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17811         the last instruction contains a return opcode to avoid generating
17812         the last `ret' instruction (this generates correct code, and it is
17813         nice to pass the peverify output).
17814
17815         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17816         initializer for static and instance variables.
17817         (Constructor::Emit): Allow initializer to be null in the case of
17818         static constructors.  Only emit initializer for instance
17819         constructors. 
17820
17821         (TypeContainer::FindMembers): Return a null array if there are no
17822         matches.
17823
17824         Also fix the code for the MemberTypes.Method branch, as it was not
17825         scanning that for operators (or tried to access null variables before).
17826
17827         * assign.cs (Assign::Emit): Handle instance and static fields. 
17828
17829         * TODO: Updated.
17830
17831         * driver.cs: Stop compilation if there are parse errors.
17832
17833         * cs-parser.jay (constructor_declaration): Provide default base
17834         initializer for non-static constructors.
17835         (constructor_declarator): Do not provide a default base
17836         initializers if none was specified.
17837         Catch the fact that constructors should not have parameters.
17838
17839         * class.cs: Do not emit parent class initializers for static
17840         constructors, that should be flagged as an error.
17841
17842 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17843
17844         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17845         Move back code into TypeContainer::Populate.
17846
17847 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17848
17849         * class.cs (TypeContainer::AddConstructor): Fix the check to
17850         compare against Name, not Basename. 
17851         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17852
17853         * cs-parser.jay : Update accordingly.
17854
17855         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17856         for methods, don't forget to look into the operators too.
17857         (RegisterMethodBuilder): Helper method to take care of this for
17858         methods, constructors and operators.
17859         (Operator::Define): Completely revamp.
17860         (Operator.OperatorMethod, MethodName): New fields.
17861         (TypeContainer::Populate): Move the registering of builders into
17862         RegisterMethodBuilder.
17863         (Operator::Emit): Re-write.
17864
17865         * expression.cs (Binary::Emit): Comment out code path to emit method
17866         invocation stuff for the case when we have a user defined operator. I am
17867         just not able to get it right !
17868
17869 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17870
17871         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17872         argument. 
17873
17874         (Expression::MemberLookup): Provide a version that allows to
17875         specify the MemberTypes and BindingFlags. 
17876
17877         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17878         so it was not fetching variable information from outer blocks.
17879
17880         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17881         Beforefieldinit as it was buggy.
17882
17883         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17884         that Ravi put here.  
17885
17886         * class.cs (Constructor::Emit): Only emit if block is not null.
17887         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17888         deal with this by semantically definining it as if the user had
17889         done it.
17890
17891         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17892         constructors as we now "emit" them at a higher level.
17893
17894         (TypeContainer::DefineDefaultConstructor): Used to define the
17895         default constructors if none was provided.
17896
17897         (ConstructorInitializer): Add methods Resolve and Emit. 
17898
17899         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17900
17901 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17902
17903         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17904         the default constructor builder with our hashtable for methodbuilders
17905         to methodcores.
17906
17907         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17908         and argument_count is 0 in which case we have a match.
17909         (Binary::ResolveOperator): More null checking and miscellaneous coding
17910         style cleanup.
17911
17912 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17913
17914         * rootcontext.cs (IsNameSpace): Compare against null.
17915
17916         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17917
17918         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17919         and Unary::Operator.
17920
17921         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17922         accordingly.
17923
17924         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17925         we have overloaded operators.
17926         (Binary::ResolveOperator): Implement the part which does the operator overload
17927         resolution.
17928
17929         * class.cs (Operator::Emit): Implement.
17930         (TypeContainer::Emit): Emit the operators we have too.
17931
17932         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17933         the case when we have a user-defined operator.
17934
17935 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17936
17937         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17938
17939 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17940
17941         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17942         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17943         (Constructor::Emit): Implement.
17944         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17945         if we have no work to do. 
17946         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17947         Emit method.
17948
17949         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17950         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17951
17952         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17953         of parent.parent.
17954
17955 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17956
17957         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17958         in the source.
17959         (Tree::RecordNamespace): Method to do what the name says ;-)
17960         (Tree::Namespaces): Property to get at the namespaces hashtable.
17961
17962         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17963         keep track.
17964
17965         * rootcontext.cs (IsNamespace): Fixed it :-)
17966
17967 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17968
17969         * class.cs (TypeContainer::FindMembers): Add support for
17970         constructors. 
17971         (MethodCore): New class that encapsulates both the shared aspects
17972         of a Constructor and a Method.  
17973         (Method, Constructor): Factored pieces into MethodCore.
17974
17975         * driver.cs: Added --fatal which makes errors throw exceptions.
17976         Load System assembly as well as part of the standard library.
17977
17978         * report.cs: Allow throwing exceptions on errors for debugging.
17979
17980         * modifiers.cs: Do not use `parent', instead use the real type
17981         container to evaluate permission settings.
17982
17983         * class.cs: Put Ravi's patch back in.  He is right, and we will
17984         have to cope with the
17985
17986 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17987
17988         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17989         FamORAssem, not FamANDAssem.
17990
17991 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17992
17993         * driver.cs: Added --parse option that only parses its input files
17994         and terminates.
17995
17996         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17997         incorrect.  IsTopLevel is not used to tell whether an object is
17998         root_types or not (that can be achieved by testing this ==
17999         root_types).  But to see if this is a top-level *class* (not
18000         necessarly our "toplevel" container). 
18001
18002 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18003
18004         * enum.cs (Enum::Define): Modify to call the Lookup method on the
18005         parent instead of a direct call to GetType.
18006
18007 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18008
18009         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
18010         Modifiers.TypeAttr. This should just be a call to that method.
18011
18012         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
18013         object so that we can determine if we are top-level or not.
18014
18015         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
18016         TypeContainer too.
18017
18018         * enum.cs (Enum::Define): Ditto.
18019
18020         * modifiers.cs (FieldAttr): Re-write.
18021
18022         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
18023         (TypeContainer::HaveStaticConstructor): New property to provide access
18024         to precisely that info.
18025
18026         * modifiers.cs (MethodAttr): Re-write.
18027         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
18028
18029         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
18030         of top-level types as claimed.
18031
18032 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18033
18034         * expression.cs (MemberLookup): Fruitless attempt to lookup
18035         constructors.  Maybe I need to emit default constructors?  That
18036         might be it (currently .NET emits this for me automatically).
18037         (Invocation::OverloadResolve): Cope with Arguments == null.
18038         (Invocation::EmitArguments): new function, shared by the new
18039         constructor and us.
18040         (Invocation::Emit): Handle static and instance methods.  Emit
18041         proper call instruction for virtual or non-virtual invocations.
18042         (New::Emit): Implement.
18043         (New::Resolve): Implement.
18044         (MemberAccess:Resolve): Implement.
18045         (MethodGroupExpr::InstanceExpression): used conforming to the spec
18046         to track instances.
18047         (FieldExpr::Resolve): Set type.
18048
18049         * support.cs: Handle empty arguments.
18050                 
18051         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
18052         SimpleLookup): Auxiliary routines to help parse a qualifier
18053         identifier.  
18054
18055         Update qualifier_identifier rule.
18056
18057         * codegen.cs: Removed debugging messages.
18058
18059         * class.cs: Make this a global thing, this acts just as a "key" to
18060         objects that we might have around.
18061
18062         (Populate): Only initialize method_builders_to_methods once.
18063
18064         * expression.cs (PropertyExpr): Initialize type from the
18065         PropertyType. 
18066
18067         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
18068         Resolve pattern.  Attempt to implicitly convert value to boolean.
18069         Emit code.
18070
18071         * expression.cs: Set the type for the int32/int32 argument case.
18072         (Binary::ResolveOperator): Set the return type to boolean for
18073         comparission operators
18074
18075         * typemanager.cs: Remove debugging print code.
18076
18077         (Invocation::Resolve): resolve type.
18078
18079         * class.cs: Allocate a MemberInfo of the correct size, as the code
18080         elsewhere depends on the test to reflect the correct contents.
18081
18082         (Method::) Keep track of parameters, due to System.Reflection holes
18083
18084         (TypeContainer::Populate): Keep track of MethodBuilders to Method
18085         mapping here.
18086
18087         (TypeContainer::FindMembers): Use ArrayList and then copy an array
18088         of the exact size and return that.
18089
18090         (Class::LookupMethodByBuilder): New function that maps
18091         MethodBuilders to its methods.  Required to locate the information
18092         on methods because System.Reflection bit us again.
18093
18094         * support.cs: New file, contains an interface ParameterData and
18095         two implementations: ReflectionParameters and InternalParameters
18096         used to access Parameter information.  We will need to grow this
18097         as required.
18098
18099         * expression.cs (Invocation::GetParameterData): implement a cache
18100         and a wrapper around the ParameterData creation for methods. 
18101         (Invocation::OverloadResolve): Use new code.
18102
18103 2001-09-13  Ravi Pratap  <ravi@ximian.com>
18104
18105         * class.cs (TypeContainer::EmitField): Remove and move into 
18106         (Field::Define): here and modify accordingly.
18107         (Field.FieldBuilder): New member.
18108         (TypeContainer::Populate): Update accordingly.
18109         (TypeContainer::FindMembers): Implement.
18110
18111 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18112
18113         * statement.cs: (VariableInfo::VariableType): New field to be
18114         initialized with the full type once it is resolved. 
18115
18116 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
18117
18118         * parameter.cs (GetParameterInfo): Use a type cache to compute
18119         things only once, and to reuse this information
18120
18121         * expression.cs (LocalVariableReference::Emit): Implement.
18122         (OpcodeCast::Emit): fix.
18123
18124         (ParameterReference::Resolve): Implement.
18125         (ParameterReference::Emit): Implement.
18126
18127         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
18128         that are expressions need to stay as Expressions.
18129
18130         * typemanager.cs (CSharpName): Returns the C# name of a type if
18131         possible. 
18132
18133         * expression.cs (Expression::ConvertImplicit): New function that
18134         implements implicit type conversions.
18135
18136         (Expression::ImplicitReferenceConversion): Implements implicit
18137         reference conversions.
18138
18139         (EmptyCast): New type for transparent casts.
18140
18141         (OpcodeCast): New type for casts of types that are performed with
18142         a sequence of bytecodes.
18143
18144         (BoxedCast): New type used for casting value types into reference
18145         types.  Emits a box opcode.
18146
18147         (Binary::DoNumericPromotions): Implements numeric promotions of
18148         and computation of the Binary::Type.
18149
18150         (Binary::EmitBranchable): Optimization.
18151
18152         (Binary::Emit): Implement code emission for expressions.
18153
18154         * typemanager.cs (TypeManager): Added two new core types: sbyte
18155         and byte.
18156
18157 2001-09-12  Ravi Pratap  <ravi@ximian.com>
18158
18159         * class.cs (TypeContainer::FindMembers): Method which does exactly
18160         what Type.FindMembers does, only we don't have to use reflection. No
18161         implementation yet.
18162
18163         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
18164         typecontainer objects as we need to get at them.
18165         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
18166
18167         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
18168         typecontainer object.
18169
18170         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
18171         of just a Report object.
18172
18173 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18174
18175         * class.cs (Event::Define): Go back to using the prefixes "add_" and
18176         "remove_"
18177         (TypeContainer::Populate): Now define the delegates of the type too.
18178         (TypeContainer.Delegates): Property to access the list of delegates defined
18179         in the type.
18180
18181         * delegates.cs (Delegate::Define): Implement partially.
18182
18183         * modifiers.cs (TypeAttr): Handle more flags.
18184
18185 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18186
18187         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
18188         and not <=
18189         (Operator::Define): Re-write logic to get types by using the LookupType method
18190         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
18191         (Indexer::Define): Ditto.
18192         (Event::Define): Ditto.
18193         (Property::Define): Ditto.
18194
18195 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18196
18197         * class.cs (TypeContainer::Populate): Now define operators too. 
18198         (TypeContainer.Operators): New property to access the list of operators
18199         in a type.
18200         (Operator.OperatorMethodBuilder): New member to hold the method builder
18201         for the operator we are defining.
18202         (Operator::Define): Implement.
18203
18204 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18205
18206         * class.cs (Event::Define): Make the prefixes of the accessor methods
18207         addOn_ and removeOn_ 
18208
18209         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
18210         of the location being passed in too. Ideally, this should go later since all
18211         error reporting should be done through the Report object.
18212
18213         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
18214         (Populate): Iterate thru the indexers we have and define them too.
18215         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
18216         for the get and set accessors.
18217         (Indexer::Define): Implement.
18218
18219 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
18220
18221         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
18222         my previous implementation, did not work.
18223
18224         * typemanager.cs: Add a couple of missing types (the longs).
18225
18226         * literal.cs: Use TypeManager.bool_type instead of getting it.
18227
18228         * expression.cs (EventExpr): New kind of expressions.
18229         (Expressio::ExprClassFromMemberInfo): finish
18230
18231 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
18232
18233         * assign.cs: Emit stores to static fields differently.
18234
18235 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18236
18237         * Merge in changes and adjust code to tackle conflicts. Backed out my
18238         code in Assign::Resolve ;-) 
18239
18240 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18241
18242         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
18243         instead Report.Error and also pass in the location.
18244         (CSharpParser::Lexer): New readonly property to return the reference
18245         to the Tokenizer object.
18246         (declare_local_variables): Use Report.Error with location instead of plain 
18247         old error.
18248         (CheckDef): Ditto.
18249
18250         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
18251         (Operator.CheckBinaryOperator): Ditto.
18252
18253         * cs-parser.jay (operator_declarator): Update accordingly.
18254
18255         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
18256         (CheckBinaryOperator): Same here.
18257
18258         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
18259         on the name without any prefixes of namespace names etc. This is because we
18260         already might have something already fully qualified like 
18261         'System.Console.WriteLine'
18262
18263         * assign.cs (Resolve): Begin implementation. Stuck ;-)
18264
18265 2001-09-07  Ravi Pratap  <ravi@ximian.com>
18266
18267         * cs-tokenizer.cs (location): Return a string which also contains
18268         the file name.
18269
18270         * expression.cs (ElementAccess): New class for expressions of the
18271         type 'element access.'
18272         (BaseAccess): New class for expressions of the type 'base access.'
18273         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
18274         respectively.
18275
18276         * cs-parser.jay (element_access): Implement action.
18277         (base_access): Implement actions.
18278         (checked_expression, unchecked_expression): Implement.
18279
18280         * cs-parser.jay (local_variable_type): Correct and implement.
18281         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
18282
18283         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
18284
18285         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
18286         name and the specifiers.
18287
18288         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
18289
18290         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
18291         making them all public ;-)
18292
18293         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
18294         class anyways.
18295
18296 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
18297
18298         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
18299         PropertyExprs.
18300         (FieldExpr, PropertyExprs): New resolved expressions.
18301         (SimpleName::MemberStaticCheck): Perform static checks for access
18302         to non-static fields on static methods. Maybe this should be
18303         generalized for MemberAccesses. 
18304         (SimpleName::ResolveSimpleName): More work on simple name
18305         resolution. 
18306
18307         * cs-parser.jay (primary_expression/qualified_identifier): track
18308         the parameter index.
18309
18310         * codegen.cs (CodeGen::Save): Catch save exception, report error.
18311         (EmitContext::EmitBoolExpression): Chain to expression generation
18312         instead of temporary hack.
18313         (::EmitStatementExpression): Put generic expression code generation.
18314
18315         * assign.cs (Assign::Emit): Implement variable assignments to
18316         local variables, parameters and fields.
18317
18318 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
18319
18320         * statement.cs (Block::GetVariableInfo): New method, returns the
18321         VariableInfo for a variable name in a block.
18322         (Block::GetVariableType): Implement in terms of GetVariableInfo
18323
18324         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
18325         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
18326
18327 2001-09-06  Ravi Pratap  <ravi@ximian.com>
18328
18329         * cs-parser.jay (operator_declaration): Continue on my quest : update
18330         to take attributes argument.
18331         (event_declaration): Ditto.
18332         (enum_declaration): Ditto.
18333         (indexer_declaration): Ditto.
18334
18335         * class.cs (Operator::Operator): Update constructor accordingly.
18336         (Event::Event): Ditto.
18337
18338         * delegate.cs (Delegate::Delegate): Same here.
18339
18340         * enum.cs (Enum::Enum): Same here.
18341
18342 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18343
18344         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
18345
18346         * ../tests/cs0658.cs : New file to demonstrate error 0658.
18347
18348         * attribute.cs (Attributes): New class to encapsulate all attributes which were
18349         being passed around as an arraylist.
18350         (Attributes::AddAttribute): Method to add attribute sections.
18351
18352         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
18353         (struct_declaration): Update accordingly.
18354         (constant_declaration): Update.
18355         (field_declaration): Update.
18356         (method_header): Update.
18357         (fixed_parameter): Update.
18358         (parameter_array): Ditto.
18359         (property_declaration): Ditto.
18360         (destructor_declaration): Ditto.
18361
18362         * class.cs (Struct::Struct): Update constructors accordingly.
18363         (Class::Class): Ditto.
18364         (Field::Field): Ditto.
18365         (Method::Method): Ditto.
18366         (Property::Property): Ditto.
18367         (TypeContainer::OptAttribute): update property's return type.
18368
18369         * interface.cs (Interface.opt_attributes): New member.
18370         (Interface::Interface): Update to take the extra Attributes argument.
18371
18372         * parameter.cs (Parameter::Parameter): Ditto.
18373
18374         * constant.cs (Constant::Constant): Ditto.
18375
18376         * interface.cs (InterfaceMemberBase): New OptAttributes field.
18377         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
18378         the attributes as a parameter.
18379         (InterfaceProperty): Update constructor call.
18380         (InterfaceEvent): Ditto.
18381         (InterfaceMethod): Ditto.
18382         (InterfaceIndexer): Ditto.
18383
18384         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
18385         pass the attributes too.
18386         (interface_event_declaration): Ditto.
18387         (interface_property_declaration): Ditto.
18388         (interface_method_declaration): Ditto.
18389         (interface_declaration): Ditto.
18390
18391 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
18392
18393         * class.cs (Method::Define): Track the "static Main" definition to
18394         create an entry point. 
18395
18396         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
18397         EntryPoint if we find it. 
18398
18399         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
18400         (EmitContext::ig): Make this variable public.
18401
18402         * driver.cs: Make the default output file be the first file name
18403         with the .exe extension.  
18404
18405         Detect empty compilations
18406
18407         Handle various kinds of output targets.  Handle --target and
18408         rename -t to --dumper.
18409
18410         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
18411         methods inherited from Expression return now an Expression.  This
18412         will is used during the tree rewriting as we resolve them during
18413         semantic analysis.
18414
18415         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
18416         the spec.  Missing entirely is the information about
18417         accessability of elements of it.
18418
18419         (Expression::ExprClassFromMemberInfo): New constructor for
18420         Expressions that creates a fully initialized Expression based on
18421         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
18422         a Type.
18423
18424         (Invocation::Resolve): Begin implementing resolution of invocations.
18425
18426         * literal.cs (StringLiteral):  Implement Emit.
18427
18428 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18429
18430         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
18431         member.
18432
18433 2001-09-04  Ravi Pratap  <ravi@ximian.com>
18434
18435         * cs-parser.jay (attribute_arguments): Implement actions.
18436         (attribute): Fix bug in production. Implement action.
18437         (attribute_list): Implement.
18438         (attribute_target): Implement.
18439         (attribute_target_specifier, opt_target_specifier): Implement
18440         (CheckAttributeTarget): New method to check if the attribute target
18441         is valid.
18442         (attribute_section): Implement.
18443         (opt_attributes): Implement.
18444
18445         * attribute.cs : New file to handle attributes.
18446         (Attribute): Class to hold attribute info.
18447
18448         * cs-parser.jay (opt_attribute_target_specifier): Remove production
18449         (attribute_section): Modify production to use 2 different rules to 
18450         achieve the same thing. 1 s/r conflict down !
18451         Clean out commented, useless, non-reducing dimension_separator rules.
18452
18453         * class.cs (TypeContainer.attributes): New member to hold list
18454         of attributes for a type.
18455         (Struct::Struct): Modify to take one more argument, the attribute list.
18456         (Class::Class): Ditto.
18457         (Field::Field): Ditto.
18458         (Method::Method): Ditto.
18459         (Property::Property): Ditto.
18460
18461         * cs-parser.jay (struct_declaration): Update constructor call to
18462         pass in the attributes too.
18463         (class_declaration): Ditto.
18464         (constant_declaration): Ditto.
18465         (field_declaration): Ditto.
18466         (method_header): Ditto.
18467         (fixed_parameter): Ditto.
18468         (parameter_array): Ditto.
18469         (property_declaration): Ditto.
18470
18471         * constant.cs (Constant::Constant): Update constructor similarly.
18472         Use System.Collections.
18473
18474         * parameter.cs (Parameter::Parameter): Update as above.
18475
18476 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18477
18478         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
18479         (TypeContainer.delegates): New member to hold list of delegates.
18480
18481         * cs-parser.jay (delegate_declaration): Implement the action correctly 
18482         this time as I seem to be on crack ;-)
18483
18484 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
18485
18486         * rootcontext.cs (RootContext::IsNamespace): new function, used to
18487         tell whether an identifier represents a namespace.
18488
18489         * expression.cs (NamespaceExpr): A namespace expression, used only
18490         temporarly during expression resolution.
18491         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
18492         utility functions to resolve names on expressions.
18493
18494 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
18495
18496         * codegen.cs: Add hook for StatementExpressions. 
18497
18498         * class.cs: Fix inverted test for static flag in methods.
18499
18500 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18501
18502         * class.cs (Operator::CheckUnaryOperator): Correct error number used
18503         to make it coincide with MS' number.
18504         (Operator::CheckBinaryOperator): Ditto.
18505
18506         * ../errors/errors.txt : Remove error numbers added earlier.
18507
18508         * ../errors/cs1019.cs : Test case for error # 1019
18509
18510         * ../errros/cs1020.cs : Test case for error # 1020
18511
18512         * cs-parser.jay : Clean out commented cruft.
18513         (dimension_separators, dimension_separator): Comment out. Ostensibly not
18514         used anywhere - non-reducing rule.
18515         (namespace_declarations): Non-reducing rule - comment out.
18516
18517         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
18518         with TypeContainer::AddEnum.
18519
18520         * delegate.cs : New file for delegate handling classes.
18521         (Delegate): Class for declaring delegates.
18522
18523         * makefile : Update.
18524
18525         * cs-parser.jay (delegate_declaration): Implement.
18526
18527 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
18528
18529         * class.cs (Event::Define): Implement.
18530         (Event.EventBuilder): New member.
18531
18532         * class.cs (TypeContainer::Populate): Update to define all enums and events
18533         we have.
18534         (Events): New property for the events arraylist we hold. Shouldn't we move to using
18535         readonly fields for all these cases ?
18536
18537 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18538
18539         * class.cs (Property): Revamp to use the convention of making fields readonly.
18540         Accordingly modify code elsewhere.
18541
18542         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
18543         the Define method of the Property class.
18544
18545         * class.cs : Clean up applied patch and update references to variables etc. Fix 
18546         trivial bug.
18547         (TypeContainer::Populate): Update to define all the properties we have. Also
18548         define all enumerations.
18549
18550         * enum.cs (Define): Implement.
18551
18552 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18553
18554         * cs-parser.jay (overloadable_operator): The semantic value is an
18555         enum of the Operator class.
18556         (operator_declarator): Implement actions.
18557         (operator_declaration): Implement.
18558
18559         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
18560         validity of definitions.
18561         (Operator::CheckBinaryOperator): Static method to check for binary operators
18562         (TypeContainer::AddOperator): New method to add an operator to a type.
18563
18564         * cs-parser.jay (indexer_declaration): Added line to actually call the
18565         AddIndexer method so it gets added ;-)
18566
18567         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
18568         already taken care of by the MS compiler ?  
18569
18570 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18571
18572         * class.cs (Operator): New class for operator declarations.
18573         (Operator::OpType): Enum for the various operators.
18574
18575 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18576
18577         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
18578         ostensibly handle this in semantic analysis.
18579
18580         * cs-parser.jay (general_catch_clause): Comment out
18581         (specific_catch_clauses, specific_catch_clause): Ditto.
18582         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
18583         (catch_args, opt_catch_args): New productions.
18584         (catch_clause): Rewrite to use the new productions above
18585         (catch_clauses): Modify accordingly.
18586         (opt_catch_clauses): New production to use in try_statement
18587         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
18588         and re-write the code in the actions to extract the specific and
18589         general catch clauses by being a little smart ;-)
18590
18591         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
18592         Hooray, try and catch statements parse fine !
18593
18594 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18595
18596         * statement.cs (Block::GetVariableType): Fix logic to extract the type
18597         string from the hashtable of variables.
18598
18599         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
18600         I end up making that mistake ;-)
18601         (catch_clauses): Fixed gross error which made Key and Value of the 
18602         DictionaryEntry the same : $1 !!
18603
18604 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18605
18606         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
18607
18608         * cs-parser.jay (event_declaration): Correct to remove the semicolon
18609         when the add and remove accessors are specified. 
18610
18611 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18612
18613         * cs-parser.jay (IndexerDeclaration): New helper class to hold
18614         information about indexer_declarator.
18615         (indexer_declarator): Implement actions.
18616         (parsing_indexer): New local boolean used to keep track of whether
18617         we are parsing indexers or properties. This is necessary because 
18618         implicit_parameters come into picture even for the get accessor in the 
18619         case of an indexer.
18620         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
18621
18622         * class.cs (Indexer): New class for indexer declarations.
18623         (TypeContainer::AddIndexer): New method to add an indexer to a type.
18624         (TypeContainer::indexers): New member to hold list of indexers for the
18625         type.
18626
18627 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18628
18629         * cs-parser.jay (add_accessor_declaration): Implement action.
18630         (remove_accessor_declaration): Implement action.
18631         (event_accessors_declaration): Implement
18632         (variable_declarators): swap statements for first rule - trivial.
18633
18634         * class.cs (Event): New class to hold information about event
18635         declarations.
18636         (TypeContainer::AddEvent): New method to add an event to a type
18637         (TypeContainer::events): New member to hold list of events.
18638
18639         * cs-parser.jay (event_declaration): Implement actions.
18640
18641 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18642
18643         * cs-parser.jay (dim_separators): Implement. Make it a string
18644         concatenating all the commas together, just as they appear.
18645         (opt_dim_separators): Modify accordingly
18646         (rank_specifiers): Update accordingly. Basically do the same
18647         thing - instead, collect the brackets here.
18648         (opt_rank_sepcifiers): Modify accordingly.
18649         (array_type): Modify to actually return the complete type string
18650         instead of ignoring the rank_specifiers.
18651         (expression_list): Implement to collect the expressions
18652         (variable_initializer): Implement. We make it a list of expressions
18653         essentially so that we can handle the array_initializer case neatly too.
18654         (variable_initializer_list): Implement.
18655         (array_initializer): Make it a list of variable_initializers
18656         (opt_array_initializer): Modify accordingly.
18657
18658         * expression.cs (New::NType): Add enumeration to help us
18659         keep track of whether we have an object/delegate creation
18660         or an array creation.
18661         (New:NewType, New::Rank, New::Indices, New::Initializers): New
18662         members to hold data about array creation.
18663         (New:New): Modify to update NewType
18664         (New:New): New Overloaded contructor for the array creation
18665         case.
18666
18667         * cs-parser.jay (array_creation_expression): Implement to call
18668         the overloaded New constructor.
18669
18670 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
18671
18672         * class.cs (TypeContainer::Constructors): Return member
18673         constructors instead of returning null.
18674
18675 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
18676
18677         * typemanager.cs (InitCoreTypes): Initialize the various core
18678         types after we have populated the type manager with the user
18679         defined types (this distinction will be important later while
18680         compiling corlib.dll)
18681
18682         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
18683         on Expression Classification.  Now all expressions have a method
18684         `Resolve' and a method `Emit'.
18685
18686         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
18687         generation from working.     Also add some temporary debugging
18688         code. 
18689
18690 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
18691
18692         * codegen.cs: Lots of code generation pieces.  This is only the
18693         beginning, will continue tomorrow with more touches of polish.  We
18694         handle the fundamentals of if, while, do, for, return.  Others are
18695         trickier and I need to start working on invocations soon.
18696
18697         * gen-treedump.cs: Bug fix, use s.Increment here instead of
18698         s.InitStatement. 
18699
18700         * codegen.cs (EmitContext): New struct, used during code
18701         emission to keep a context.   Most of the code generation will be
18702         here. 
18703
18704         * cs-parser.jay: Add embedded blocks to the list of statements of
18705         this block.  So code generation proceeds in a top down fashion.
18706
18707 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
18708
18709         * statement.cs: Add support for multiple child blocks.
18710
18711 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
18712
18713         * codegen.cs (EmitCode): New function, will emit the code for a
18714         Block of code given a TypeContainer and its ILGenerator. 
18715
18716         * statement.cs (Block): Standard public readonly optimization.
18717         (Block::Block constructors): Link children. 
18718         (Block::Child): Child Linker.
18719         (Block::EmitVariables): Emits IL variable declarations.
18720
18721         * class.cs: Drop support for MethodGroups here, delay until
18722         Semantic Analysis.
18723         (Method::): Applied the same simplification that I did before, and
18724         move from Properties to public readonly fields.
18725         (Method::ParameterTypes): Returns the parameter types for the
18726         function, and implements a cache that will be useful later when I
18727         do error checking and the semantic analysis on the methods is
18728         performed.
18729         (Constructor::GetCallingConvention): Renamed from CallingConvetion
18730         and made a method, optional argument tells whether this is a class
18731         or a structure to apply the `has-this' bit.
18732         (Method::GetCallingConvention): Implement, returns the calling
18733         convention. 
18734         (Method::Define): Defines the type, a second pass is performed
18735         later to populate the methods.
18736
18737         (Constructor::ParameterTypes): implement a cache similar to the
18738         one on Method::ParameterTypes, useful later when we do semantic
18739         analysis. 
18740
18741         (TypeContainer::EmitMethod):  New method.  Emits methods.
18742
18743         * expression.cs: Removed MethodGroup class from here.
18744
18745         * parameter.cs (Parameters::GetCallingConvention): new method.
18746
18747 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
18748
18749         * class.cs (TypeContainer::Populate): Drop RootContext from the
18750         argument. 
18751
18752         (Constructor::CallingConvention): Returns the calling convention.
18753         (Constructor::ParameterTypes): Returns the constructor parameter
18754         types. 
18755
18756         (TypeContainer::AddConstructor): Keep track of default constructor
18757         and the default static constructor.
18758
18759         (Constructor::) Another class that starts using `public readonly'
18760         instead of properties. 
18761
18762         (Constructor::IsDefault): Whether this is a default constructor. 
18763
18764         (Field::) use readonly public fields instead of properties also.
18765
18766         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
18767         track of static constructors;  If none is used, turn on
18768         BeforeFieldInit in the TypeAttributes. 
18769
18770         * cs-parser.jay (opt_argument_list): now the return can be null
18771         for the cases where there are no arguments. 
18772
18773         (constructor_declarator): If there is no implicit `base' or
18774         `this', then invoke the default parent constructor. 
18775
18776         * modifiers.cs (MethodAttr): New static function maps a set of
18777         modifiers flags into a MethodAttributes enum
18778         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18779         MethodAttr, TypeAttr to represent the various mappings where the
18780         modifiers are used.
18781         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18782
18783 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18784
18785         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18786         method arguments.
18787
18788         * interface.cs (PopulateIndexer): Implemented the code generator
18789         for interface indexers.
18790
18791 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18792
18793         * interface.cs (InterfaceMemberBase): Now we track the new status
18794         here.  
18795
18796         (PopulateProperty): Implement property population.  Woohoo!  Got
18797         Methods and Properties going today. 
18798
18799         Removed all the properties for interfaces, and replaced them with
18800         `public readonly' fields. 
18801
18802 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18803
18804         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18805         initialize their hashtables/arraylists only when they are needed
18806         instead of doing this always.
18807
18808         * parameter.cs: Handle refs and out parameters.
18809
18810         * cs-parser.jay: Use an ArrayList to construct the arguments
18811         instead of the ParameterCollection, and then cast that to a
18812         Parameter[] array.
18813
18814         * parameter.cs: Drop the use of ParameterCollection and use
18815         instead arrays of Parameters.
18816
18817         (GetParameterInfo): Use the Type, not the Name when resolving
18818         types. 
18819
18820 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18821
18822         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18823         and instead use public readonly fields.
18824
18825         * class.cs: Put back walking code for type containers.
18826
18827 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18828
18829         * class.cs (MakeConstant): Code to define constants.
18830
18831         * rootcontext.cs (LookupType): New function.  Used to locate types 
18832
18833
18834 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18835
18836         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18837         this System.Reflection code is.  Kudos to Microsoft
18838
18839         * typemanager.cs: Implement a type cache and avoid loading all
18840         types at boot time.  Wrap in LookupType the internals.  This made
18841         the compiler so much faster.  Wow.  I rule!
18842
18843         * driver.cs: Make sure we always load mscorlib first (for
18844         debugging purposes, nothing really important).
18845
18846         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18847         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18848
18849         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18850         on namespaces that have been imported using the `using' keyword.
18851
18852         * class.cs (TypeContainer::TypeAttr): Virtualize.
18853         (Class::TypeAttr): Return attributes suitable for this bad boy.
18854         (Struct::TypeAttr): ditto.
18855         Handle nested classes.
18856         (TypeContainer::) Remove all the type visiting code, it is now
18857         replaced with the rootcontext.cs code
18858
18859         * rootcontext.cs (GetClassBases): Added support for structs. 
18860
18861 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18862
18863         * interface.cs, statement.cs, class.cs, parameter.cs,
18864         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18865         Drop use of TypeRefs, and use strings instead.
18866
18867 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18868
18869         * rootcontext.cs: 
18870
18871         * class.cs (Struct::Struct): set the SEALED flags after
18872         checking the modifiers.
18873         (TypeContainer::TypeAttr): new property, returns the
18874         TypeAttributes for a class.  
18875
18876         * cs-parser.jay (type_list): Oops, list production was creating a
18877         new list of base types.
18878
18879         * rootcontext.cs (StdLib): New property.
18880         (GetInterfaceTypeByName): returns an interface by type name, and
18881         encapsulates error handling here.
18882         (GetInterfaces): simplified.
18883         (ResolveTree): Encapsulated all the tree resolution here.
18884         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18885         types. 
18886
18887         * driver.cs: Add support for --nostdlib, to avoid loading the
18888         default assemblies.
18889         (Main): Do not put tree resolution here. 
18890
18891         * rootcontext.cs: Beginning of the class resolution.
18892
18893 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18894
18895         * rootcontext.cs: Provide better error reporting. 
18896
18897         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18898
18899         * rootcontext.cs (CreateInterface): Handle the case where there
18900         are no parent interfaces.
18901
18902         (CloseTypes): Routine to flush types at the end.
18903         (CreateInterface): Track types.
18904         (GetInterfaces): Returns an array of Types from the list of
18905         defined interfaces.
18906
18907         * typemanager.c (AddUserType): Mechanism to track user types (puts
18908         the type on the global type hash, and allows us to close it at the
18909         end). 
18910
18911 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18912
18913         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18914         RecordInterface instead.
18915
18916         * cs-parser.jay: Updated to reflect changes above.
18917
18918         * decl.cs (Definition): Keep track of the TypeBuilder type that
18919         represents this type here.  Not sure we will use it in the long
18920         run, but wont hurt for now.
18921
18922         * driver.cs: Smaller changes to accomodate the new code.
18923
18924         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18925         when done. 
18926
18927         * rootcontext.cs (CreateInterface):  New method, used to create
18928         the System.TypeBuilder type for interfaces.
18929         (ResolveInterfaces): new entry point to resolve the interface
18930         hierarchy. 
18931         (CodeGen): Property, used to keep track of the code generator.
18932
18933 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18934
18935         * cs-parser.jay: Add a second production for delegate_declaration
18936         with `VOID'.
18937
18938         (enum_body): Put an opt_comma here instead of putting it on
18939         enum_body or enum_member_declarations so we can handle trailing
18940         commas on enumeration members.  Gets rid of a shift/reduce.
18941
18942         (type_list): Need a COMMA in the middle.
18943
18944         (indexer_declaration): Tell tokenizer to recognize get/set
18945
18946         * Remove old targets.
18947
18948         * Re-add the parser target.
18949
18950 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18951
18952         * cs-parser.jay: Add precendence rules for a number of operators
18953         ot reduce the number of shift/reduce conflicts in the grammar.
18954
18955 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18956
18957         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18958         and put it here.
18959
18960         Get rid of old crufty code.
18961
18962         * rootcontext.cs: Use this to keep track of the parsed
18963         representation and the defined types available to the program. 
18964
18965         * gen-treedump.cs: adjust for new convention.
18966
18967         * type.cs: Split out the type manager, and the assembly builder
18968         from here. 
18969
18970         * typemanager.cs: the type manager will live here now.
18971
18972         * cil-codegen.cs: And the code generator here. 
18973
18974 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18975
18976         * makefile: Fixed up for easy making.
18977
18978 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18979
18980         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18981         the 
18982
18983         (unary_expression): Expand pre_increment_expression and
18984         post_decrement_expression to reduce a shift/reduce.
18985
18986 2001-07-11  Simon Cozens
18987
18988         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18989
18990         Improve allow_keyword_as_indent name.
18991
18992 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18993
18994         * Adjustments for Beta2. 
18995
18996 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18997
18998         * decl.cs: Added `Define' abstract method.
18999         (InTransit): new property, used to catch recursive definitions. 
19000
19001         * interface.cs: Implement `Define'. 
19002
19003         * modifiers.cs: Map Modifiers.constants to
19004         System.Reflection.TypeAttribute flags.
19005
19006         * class.cs: Keep track of types and user-defined types.
19007         (BuilderInit): New method for creating an assembly
19008         (ResolveType): New function to launch the resolution process, only
19009         used by interfaces for now.
19010
19011         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
19012         that are inserted into the name space. 
19013
19014 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
19015
19016         * ARGH.  I have screwed up my tree so many times due to the use of
19017         rsync rather than using CVS.  Going to fix this at once. 
19018
19019         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
19020         load types.
19021
19022 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
19023
19024         * Experiment successful: Use System.Type rather that our own
19025         version of Type.  
19026
19027 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
19028
19029         * cs-parser.jay: Removed nsAliases from here.
19030
19031         Use new namespaces, handle `using XXX;' 
19032
19033         * namespace.cs: Reimplemented namespace handling, use a recursive
19034         definition of the class.  Now we can keep track of using clauses
19035         and catch invalid using clauses.
19036
19037 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
19038
19039         * gen-treedump.cs: Adapted for all the renaming.
19040
19041         * expression.cs (Expression): this class now has a Type property
19042         which returns an expression Type.
19043
19044         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
19045         `Type', as this has a different meaning now in the base
19046
19047 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
19048
19049         * interface.cs, class.cs: Removed from all the sources the
19050         references to signature computation, as we can not do method
19051         signature computation during the parsing time, as we are not
19052         trying to solve at that point distinguishing:
19053
19054         class X {
19055                 void a (Blah x) {}
19056                 void a (NS.Blah x) {}
19057         }
19058
19059         Which depending on the context might be valid or not, as we do not
19060         know if Blah is the same thing as NS.Blah at that point.
19061
19062         * Redid everything so the code uses TypeRefs now instead of
19063         Types.  TypeRefs are just temporary type placeholders, that need
19064         to be resolved.  They initially have a pointer to a string and the
19065         current scope in which they are used.  This is used later by the
19066         compiler to resolve the reference to an actual Type. 
19067
19068         * DeclSpace is no longer a CIR.Type, and neither are
19069         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
19070         are all DeclSpaces, but no Types. 
19071
19072         * type.cs (TypeRefManager): This implements the TypeRef manager,
19073         which keeps track of all the types that need to be resolved after
19074         the parsing has finished. 
19075
19076 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
19077
19078         * ARGH.  We are going to have to store `foreach' as a class rather
19079         than resolving it, as we need to verify error 1579 after name
19080         resolution.   *OR* we could keep a flag that says `This request to
19081         IEnumerator comes from a foreach statement' which we can then use
19082         to generate the error.
19083
19084 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
19085
19086         * class.cs (TypeContainer.AddMethod): we now add methods to the
19087         MethodGroup instead of the method hashtable.  
19088
19089         * expression.cs: Add MethodGroup abstraction, which gets us one
19090         step closer to the specification in the way we handle method
19091         declarations.  
19092
19093         * cs-parser.jay (primary_expression): qualified_identifier now
19094         tried to match up an identifier to a local variable reference or
19095         to a parameter reference.
19096
19097         current_local_parameters is now a parser global variable that
19098         points to the current parameters for the block, used during name
19099         lookup.
19100
19101         (property_declaration): Now creates an implicit `value' argument to
19102         the set accessor.
19103
19104 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
19105
19106         * parameter.cs: Do not use `param' arguments as part of the
19107         signature, per the spec.
19108
19109 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
19110
19111         * decl.cs: Base class for classes, structs and interfaces.  This
19112         is the "Declaration Space" 
19113
19114         * cs-parser.jay: Use CheckDef for checking declaration errors
19115         instead of having one on each function.
19116
19117         * class.cs: Factor out some code for handling error handling in
19118         accordance to the "Declarations" section in the "Basic Concepts"
19119         chapter in the ECMA C# spec.
19120
19121         * interface.cs: Make all interface member classes derive from
19122         InterfaceMemberBase.
19123
19124 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
19125
19126         * Many things: all interfaces are parsed and generated in
19127         gen-treedump.  Support for member variables, constructors,
19128         destructors, properties, constants is there.
19129
19130         Beginning of the IL backend, but very little done, just there for
19131         testing purposes. 
19132
19133 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
19134
19135         * cs-parser.jay: Fix labeled statement.
19136
19137         * cs-tokenizer.cs (escape): Escape " and ' always.
19138         ref_line, ref_name: keep track of the line/filename as instructed
19139         by #line by the compiler.
19140         Parse #line.
19141
19142 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
19143
19144         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
19145         to match the values in System.CodeDOM.
19146
19147         Divid renamed to Divide.
19148
19149         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
19150         statements. 
19151         (Statements.set): remove.
19152
19153         * System.CodeDOM/CodeCatchClause.cs: always have a valid
19154         statements. 
19155
19156         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
19157         falseStatements always have valid values. 
19158
19159         * cs-parser.jay: Use System.CodeDOM now.
19160