a5500550b3b1ae022ef0d6ad53cc8c00daf340d0
[mono.git] / mcs / gmcs / ChangeLog
1 2005-02-09  Raja R Harinath  <rharinath@novell.com>
2
3         Combine two near-redundant caches.
4         * typemanager.cs (method_params): Rename from method_internal_params.
5         (TypeManager.GetParameterData): New.  Replace
6         Invocation.GetParameterData.
7         (TypeManager.LookupParametersByBuilder): Remove.
8         * expression.cs (Invocation.method_parameter_cache): Remove.
9         (Invocation.GetParameterData): Remove.
10         Update to changes.
11         * anonymous.cs, attribute.cs, convert.cs, delegate.cs:
12         Update to changes.
13
14 2005-02-08  Raja R Harinath  <rharinath@novell.com>
15
16         Fix #72015.
17         * delegate.cs (Delegate.DefineType): When bootstrapping corlib, if
18         TypeManager.multicast_delegate_type is null, resolve it by looking
19         up "System.MulticastDelegate".
20         * rootcontext.cs (RootContext.ResolveCore): Simplify.
21
22 2005-02-07  Abin Thomas (NOSIP)  <projectmonokochi@rediffmail.com>
23             Anoob V.E (NOSIP)  <projectmonokochi@rediffmail.com>
24             Harilal P.R (NOSIP)  <projectmonokochi@rediffmail.com>
25
26         Fix cs0164.cs.
27         * statement.cs (LabeledStatement.Resolve): Don't set 'referenced'.
28         (LabeledStatement.AddReference): New.  Set 'referenced'.
29         (Goto.Resolve): Use it.
30
31 2005-02-05  John Luke  <john.luke@gmail.com>
32
33         * driver.cs: remove duplicate -doc line in Usage ()
34
35 2005-02-04  Raja R Harinath  <rharinath@novell.com>
36
37         * location.cs (Location.AddFile): Fix CS2002 error report.
38
39 2005-02-02  Martin Baulig  <martin@ximian.com>
40
41         * delegate.cs (Delegate.DefineType): Report an internal error if
42         TypeManager.multicast_delegate_type is null.  See bug #72015 for
43         details.        
44
45 2005-02-02  Raja R Harinath  <rharinath@novell.com>
46
47         Fix a crasher in a variant of #31984.
48         * const.cs (Constant.CheckBase): New override that defers the
49         new-or-override check in case the base type hasn't been populated
50         yet.
51         (Constant.Define): Ensure the new-or-override check is performed.
52
53 2005-02-01  Duncan Mak  <duncan@ximian.com>
54
55         * const.cs (LookupConstantValue): Check that `ce' is not null
56         before calling GetValue ().
57
58 2005-02-01  Raja R Harinath  <rharinath@novell.com>
59
60         Fix test-334.cs (#69519).
61         * cs-parser.jay (using_alias_directive): Pass in an expression to
62         NamespaceEntry.UsingAlias.
63         (using_namespace_directive): Pass in an expression to
64         NamespaceEntry.Using.
65         (namespace_name): Don't flatten to a string.
66         * namespace.cs (NamespaceEntry.AliasEntry): Store an expression.
67         (NamespaceEntry.AliasEntry.Resolve): Lookup using
68         ResolveAsTypeStep.
69         (NamespaceEntry.UsingEntry): Likewise.
70         (NamespaceEntry.Using,NamespaceEntry.UsingAlias): Update to
71         changes.
72         (NamespaceEntry.LookupForUsing): Remove.
73         (NamespaceEntry.LookupNamespaceOrType): Add support for dotted
74         names.
75         (NamespaceEntry.Lookup): Remove support for dotted names.
76
77 2005-02-01  Raja R Harinath  <rharinath@novell.com>
78
79         * namespace.cs (NamespaceEntry.NamespaceEntry): Simplify, and
80         split into two.
81         (NamespaceEntry.ImplicitParent): Compute on demand.
82         (NamespaceEntry.Doppelganger): New implicit namespace-entry that
83         parallels the current.
84         (NamespaceEntry.LookupForUsing): Use it.
85         (NamespaceEntry.Lookup): If the current namespace-entry is
86         implicit, don't search aliases and using tables.
87
88 2005-02-01  Raja R Harinath  <rharinath@novell.com>
89
90         Fix #31984.
91         * class.cs (TypeContainer.DoDefineMembers): Don't initialize
92         BaseCache here.
93         (TypeContainer.BaseCache): Compute on demand.
94         (TypeContainer.FindMembers): Define constants and types if they're
95         not already created.
96         (FieldMember.Define): Move resetting of ec.InUnsafe before error
97         check.
98         * const.cs (Constant.Define): Make idempotent.
99
100 2005-01-29  Miguel de Icaza  <miguel@novell.com>
101
102         * pending.cs: Produce better code (no nops produced by using Ldarg
103         + value).
104         
105         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
106         i - 1' it should be arg + 1.
107
108         Fixes bug #71819.
109
110 2005-01-28  Raja R Harinath  <rharinath@novell.com>
111
112         * attribute.cs (Attribute.CheckAttributeType): Make private
113         non-virtual.
114         (Attribute.ResolveType): Make virtual.
115         (GlobalAttribute.ResolveType,GlobalAttribute.Resolve): Simplify
116         handling of RootContext.Tree.Types.
117
118 2005-01-27  Raja R Harinath  <rharinath@novell.com>
119
120         Update attribute-handling to use the SimpleName/MemberAccess
121         mechanisms.
122         * cs-parser.jay (attribute): Pass in an expression to the
123         constructors of Attribute and GlobalAttribute.
124         * attribute.cs (Attribute): Take an expression for the name.
125         (Attribute.ResolvePossibleAttributeTypes): New.  Resolves the
126         passed in attribute name expression.
127         (Attribute.CheckAttributeType): Use it.
128         * ecore.cs (FullNamedExpression.ResolveAsTypeStep): New.
129         * expression.cs (MemberAccess.ResolveAsTypeStep): Move body to ...
130         (MemberAccess.ResolveNamespaceOrType): ... here.  Add 'silent'
131         argument to prevent error messages if the lookup fails.
132
133 2005-01-27  Marek Safar  <marek.safar@seznam.cz>
134
135         * expression.cs (Indirection): Implemented IVariable interface
136         to support indirection in AddressOf operator.
137         (PointerArithmetic.Emit): Add optimalization for case where
138         result can be precomputed.
139
140 2005-01-26  Martin Baulig  <martin@ximian.com>
141
142         * class.cs (TypeContainer.AttributeTargets): Return the correct
143         AttributeTargets depending on our `Kind' instead of throwing an
144         exception; fixes #71632.
145
146 2005-01-26  Marek Safar  <marek.safar@seznam.cz>
147
148         Fix #71257
149         * expression.cs (MemberAccess.ResolveMemberAccess): Add CS0176 test for
150         constant members.
151
152 2005-03-17  Martin Baulig  <martin@ximian.com>
153
154         * anonymous.cs (AnonymousMethod.method_modifiers): Change default
155         from `Modifiers.INTERNAL' to `Modifiers.PRIVATE'.  Fixes #73260.
156
157 2005-03-17  Martin Baulig  <martin@ximian.com>
158
159         * anonymous.cs (AnonymousMethod.EmitMethod): Changed return type
160         to bool so we can return an error condition.
161         (AnonymousDelegate.Emit): Check whether AnonymousMethod.EmitMethod()
162         returned an error.
163
164 2005-03-17  Martin Baulig  <martin@ximian.com>
165
166         * generic.cs (TypeMananager.IsIEnumerable): New public method.
167
168         * convert.cs (Convert.ImplicitReferenceConversion(Exists)): Allow
169         converting from an array-type of T to `IEnumerable<T>'.
170
171 2005-03-16  Martin Baulig  <martin@ximian.com>
172
173         * generic.cs (Nullable.Unwrap): Implement IAssignMethod.
174         (Nullable.LiftedUnaryMutator): New public class.
175
176         * expression.cs (UnaryMutator.DoResolve): Added support for
177         Nullable Types.
178
179 2005-03-14  Martin Baulig  <martin@ximian.com>
180
181         * generic.cs (Nullable.NullCoalescingOperator): Implemented.
182
183 2005-03-14  Martin Baulig  <martin@ximian.com>
184
185         * generic.cs (Nullable.LiftedBinaryOperator): Added support for
186         the comparision operators `<', `>', `<=' and `>='.
187
188 2005-03-13  Martin Baulig  <martin@ximian.com>
189
190         * generic.cs
191         (Nullable.NullLiteral): Renamed to `Nullable.NullableLiteral' to
192         avoid confusion with the `NullLiteral'.
193         (Nullable.LiftedBinaryOperator): Correctly implement `==' and '!='.
194
195 2005-03-13  Martin Baulig  <martin@ximian.com>
196
197         * expression.cs (Binary.ResolveOperator): For `==' and `!=', allow
198         comparing arbitrary types with the null literal.
199
200 2005-03-13  Martin Baulig  <martin@ximian.com>
201
202         * generic.cs (Nullable.LiftedBinaryOperator): Add support for the
203         boolean operators '&&', '||', '&' and '|'.
204         (Nullable.OperatorTrueOrFalse): New public class.
205
206         * ecore.cs (Expression.GetOperatorTrue/False): Return an `Expression'
207         instead of a `StaticCallExpr'; added support for nullables.
208
209 2005-03-10  Martin Baulig  <martin@ximian.com>
210
211         * expression.cs
212         (ArrayAccess.EmitDynamicInitializers): Use `etype.IsValueType'
213         rather than `etype.IsSubclassOf (TypeManager.value_type)'.      
214
215 2005-03-07  Martin Baulig  <martin@ximian.com>
216
217         * generic.cs (Nullable.Unwrap): Implement IMemoryLocation and make
218         it work if `expr' is not an IMemoryLocation.
219         (Nullable.Lifted): Implement IMemoryLocation.
220         (Nullable.LiftedConversion.ResolveUnderlying): Use the correct
221         target type.
222
223 2005-03-05  Martin Baulig  <martin@ximian.com>
224
225         * generic.cs (Nullable.Unwrap, Wrap): New protected classes.
226         (Nullable.Lifted): New abstract class; rewrote the lifted conversions.
227         (Nullable): Added support for lifted unary and binary operators.
228
229         * expression.cs (Unary.DoResolve): Added support for nullable types.
230         (Binary.DoResolve): Likewise.
231         (Conditional.DoResolve): Likewise.
232
233 2005-03-02  Martin Baulig  <martin@ximian.com>
234
235         * decl.cs (DeclSpace.SetParameterInfo): Make this virtual.
236
237         * class.cs (ClassPart.SetParameterInfo): Override this.
238         (PartialContainer.SetParameterInfo): Override this.
239         (TypeContainer.CheckConstraints): New protected method.
240         (PartialContainer.CheckConstraints): Override this and check
241         whether the same contraints were specified in all parts of a
242         partial generic type definition.
243         (PartialContainer.UpdateConstraints): New public method.
244
245         * generic.cs (TypeParameter.UpdateConstraints): New public method.
246
247 2005-03-02  Martin Baulig  <martin@ximian.com>
248
249         Committing a patch from Carlos Alberto Cortez to fix #72887.
250
251         * convert.cs (Convert.ExplicitReferenceConversionExists): Allow
252         casts from `T []' to `int []'.
253
254 2005-03-02  Martin Baulig  <martin@ximian.com>
255
256         * generic.cs (TypeManager.IsEqual): Make this symmetric.
257
258         * expression.cs (Binary.ResolveOperator): When resolving a
259         BinaryDelegate, use `TypeManager.IsEqual (l, r)' rather than just
260         `=='.  Fixes #71866.  See gen-127.cs.
261
262 2005-03-02  Martin Baulig  <martin@ximian.com>
263
264         * class.cs (TypeContainer.DoDefineMembers): We also need a default
265         static constructor in static classes.
266
267 2005-03-02  Martin Baulig  <martin@ximian.com>
268
269         * generic.cs
270         (NullableType.Name, NullableType.FullName): Add a "?" to the name.
271         (Nullable.LiftedConversion): Added support for user-defined
272         conversions.
273
274         * cs-tokenizer.cs (Tokenizer.PutbackCloseParens): New public method.
275
276         * cs-parser.jay: Use ComposedCast everywhere instead of
277         NullableType, so we don't need to check for NullableType
278         everywhere.
279         (conditional_expression): Added `INTERR CLOSE_PARENS' rule for the
280         case where we'll be resolved into a `parenthesized_expression_0'
281         afterwards.
282
283         * convert.cs
284         (Convert.UserDefinedConversion): Added nullable conversions.
285
286 2005-02-28  Martin Baulig  <martin@ximian.com>
287
288         * generic.cs (TypeManager.IsNullableType): New static method.
289         (Nullable): New abstract class.
290         (Nullable.NullLiteral): New public class.
291         (Nullable.LiftedConversion): New public class.
292
293         * cs-parser.jay (non_expression_type): Changed `builtin_types' to
294         `builtin_types opt_nullable'.
295
296         * convert.cs
297         (Convert.ImplicitConversionStandard): Added nullable conversions.
298         (Convert.ExplicitConversionStandard): Likewise.
299         (Convert.ExplicitConversion): Likewise.
300
301 2005-02-26  Martin Baulig  <martin@ximian.com>
302
303         * expression.cs (ComposedCast.DoResolveAsTypeStep): Allow `dim' to
304         begin with a "?", for instance "?[]".  Don't do a type lookup if
305         `dim' is empty.
306
307 2005-02-25  Martin Baulig  <martin@ximian.com>
308
309         The first part of Nullable Types :-)
310
311         * generic.cs (NullableType): New public class.
312         (NullCoalescingOperator): New public class.
313         (TypeArguments.Resolve): Add a CS0306 check.
314
315         * cs-parser.jay (opt_error_modifier): Removed, this was unused.
316         (opt_nullable): New rule.
317         (type): Added `opt_nullable' to `namespace_or_type_name',
318         `builtin_types' and `pointer_type'.
319         (array_type): Added `opt_nullable'.
320         (opt_rank_specifier_or_nullable): New rule; this is the
321         combination of `opt_rank_specifier' and `opt_nullable'.
322         (opt_error): New rule; catch errors here.
323         (nullable_type_or_conditional): New rule; we use this to check for
324         nullable and still detect the conditional operator.
325         (local_variable_type): Use `opt_rank_specifier_or_nullable'
326         instead `opt_rank_specifier'.
327
328         * expression.cs (ComposedCast.DoResolveAsTypeStep): Added support
329         for nullables.
330
331 2005-02-24  Martin Baulig  <martin@ximian.com>
332
333         * README, README.Changes: Removed; they're old and obsolete.
334
335 2005-02-22  Martin Baulig  <martin@ximian.com>
336
337         * generic.cs (TypeParameter.Resolve): If resolving the constraints
338         returned an error, set `constraints' to null to avoid a crash
339         later on.
340         (TypeParameter.ResolveType): Likewise.
341
342 2005-02-22  Martin Baulig  <martin@ximian.com>
343
344         * generic.cs
345         (Constraints.ResolveTypes): Protect against being called twice.
346         (Constraints.CheckInterfaceMethod): Don't call ResolveTypes().
347         (TypeParameter.ResolveType): New public method; calls
348         constraints.ResolveTypes().
349         (TypeParameter.DefineType): Moved constraints.ResolveType() out
350         into the new ResolveType().
351         (GenericMethod.Define): Call ResolveType() on all our
352         TypeParameter's.        
353
354 2005-02-21  Martin Baulig  <martin@ximian.com>
355
356         * generic.cs
357         (TypeManager.generic_nullable_type): New static public field.
358         (TypeManager.InitGenericCoreType): Lookup "System.Nullable`1".
359
360         * rootcontext.cs
361         (RootContext.ResolveCore): Resolve "System.Nullable`1".
362
363 2005-02-15  Martin Baulig  <martin@ximian.com>
364
365         * generic.cs (ConstructedType.Constraints): Correctly check
366         constraints if the argument type is a type parameter; fixes
367         #72326. 
368
369 2005-02-02  Martin Baulig  <martin@ximian.com>
370
371         * delegate.cs (Delegate.DefineType): Report an internal error if
372         TypeManager.multicast_delegate_type is null.  See bug #72015 for
373         details.        
374
375 2005-01-29  Miguel de Icaza  <miguel@novell.com>
376
377         * pending.cs: Produce better code (no nops produced by using Ldarg
378         + value).
379         
380         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
381         i - 1' it should be arg + 1.
382
383         Fixes bug #71819.
384         
385 2005-01-26  Martin Baulig  <martin@ximian.com>
386
387         * cs-parser.jay (indexer_declarator): Don't report an error if we
388         have type parameters since we can be an explicit interface
389         implementation; fixes #71449.
390
391 2005-01-26  Martin Baulig  <martin@ximian.com>
392
393         * class.cs (TypeContainer.AttributeTargets): Return the correct
394         AttributeTargets depending on our `Kind' instead of throwing an
395         exception; fixes #71632.
396
397 2005-01-26  Martin Baulig  <martin@ximian.com>
398
399         * delegate.cs (Delegate.DefineType): Correctly define our type
400         parameters.  Fixes #71483.
401
402 2005-01-25  Raja R Harinath  <rharinath@novell.com>
403
404         Fix #71602.
405         * expression.cs (MemberAccess.DoResolve): Don't complain with
406         cs0572 when the LHS of a member access has identical name and type
407         name.
408
409 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
410
411         Fix #71651, #71675
412         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
413         CreatePermission.
414         Create custom PermissionSet only for PermissionSetAttribute.
415
416 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
417
418         Fix #71649
419         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
420         delegates in static class.
421
422 2005-01-24  Martin Baulig  <martin@ximian.com>
423
424         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
425         merging an implicit block, just use its reachability.
426
427         * statement.cs (Block.Resolve): Make the unreachable code check
428         work wrt. implicit blocks; see test-337 from #63842.
429
430 2005-01-21  Alp Toker  <alp@atoker.com>
431  
432         * cs-parser.jay: destructor_declaration's container is PartialContainer
433         not Class when partial types are used, so use Kind prop instead of
434         'is'.
435         
436 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
437
438         * cs-parser.jay: Improve error reporting when an interface
439         declares new types.
440
441 2005-01-20  Dick Porter  <dick@ximian.com>
442
443         * support.cs: SeekableStreamReader fix from Sandor Dobos
444         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
445         chars are read.  Fixes bug 70369.
446
447 2005-01-20  Raja R Harinath  <rharinath@novell.com>
448
449         * cs-parser.jay (catch_clause): Simplify current_block handling
450         somewhat.
451
452 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
453
454         * convert.cs (ImplicitStandardConversionExists): Synchronize the
455         code with ImplicitStandardConversion to handle the implicit
456         conversion of method groups into valid delegate invocations. 
457
458         The problem is that in parameter handling we were using this code
459         path.  Fixes bug #64698
460
461 2005-01-19  Raja R Harinath  <rharinath@novell.com>
462
463         * cs-parser.jay: Fix several infelicities.
464         - Avoid assigning to the parser value stack.  Code like 
465           '$3 = null' is unclean.  Synthesize a value for the code block
466           instead. 
467         - Avoid using oob_stack for storing location information.  Use ...
468         (_mark_): ... this.  New (empty) rule.  Saves the current location
469         in $$.
470         (foreach_statement): Avoid using oob_stack for current_block
471         handling.  Use technique used in for_statement and
472         using_statement.  Synthesize a value for the code block to store
473         additional intermediate information.
474
475 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
476
477         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
478         of a different type is only allowed to private fields of a
479         containing type, not on fields of a base class.
480
481         See test-174.cs and error cs0122-9.cs
482
483 2005-01-13  Raja R Harinath  <rharinath@novell.com>
484
485         Fix test-335.cs (bug #58126).
486         * cs-parser.jay (argument): Split out non-expression parts of the
487         rule into 'non_simple_argument'.
488         (invocation_expression): Support parenthesized invocations with
489         multiple arguments, and with single non-simple arguments.
490
491 2005-01-13  Raja R Harinath  <rharinath@novell.com>
492
493         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
494         places.
495
496 2005-01-12  Raja R Harinath  <rharinath@novell.com>
497
498         Fix cs0038-1.cs, cs1640-6.cs.
499         * ecore.cs (Expression.Resolve): Remove special-case for
500         SimpleName in error-handling.
501         (Expression.almostMatchedMembers): Relax access permission to
502         protected.
503         (Expression.MemberLookupFailed): Handle duplicates in
504         almostMatchedMembers list.
505         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
506         * expression.cs (New.DoResolve): Report CS1540 for more cases.
507         * typemanager.cs (GetFullNameSignature): Use the MethodBase
508         overload if the passed in MemberInfo is a MethodBase.
509
510 2005-01-25  Martin Baulig  <martin@ximian.com>
511
512         * doc.cs
513         (DocUtil.emptyParamList): Removed; use `Type.EmptyTypes' instead.
514
515 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
516
517         Fix #70749
518         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
519         for non-CAS & merge permission sets properly.
520
521 2005-01-11  Raja R Harinath  <rharinath@novell.com>
522
523         Improve standard-compliance of simple name and member access 
524         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
525         * ecore.cs (FullNamedExpression): New abstract base class 
526         for Namespaces and TypeExpressions.
527         (ResolveFlags.SimpleName): Remove.
528         (SimpleName): Remove support for dotted names.
529         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
530         DeclSpace.FindType and DeclSpace.LookupType.
531         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
532         (Expression.ExprClassName): Make member function.
533         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
534         a namespace.  Remove creation of dotted "SimpleName"s.
535         (MemberAccess.DoResolve): Likewise.
536         * decl.cs (DeclSpace.Cache): Make private.
537         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
538         (DeclSpace.FindType): Update.
539         (DeclSpace.LookupType): Move here from RootContext.  Return a 
540         FullNamedExpression.
541         * namespace.cs (Namespace): Derive from FullNamedExpression
542         so that it can be part of expression resolution.
543         (Namespace.Lookup): Return an FullNamedExpression.
544         (NamespaceEntry.LookupAlias): Lookup aliases only in current
545         namespace.
546         * rootcontext.cs (NamespaceLookup): Remove.
547         (LookupType): Move to DeclSpace.
548         * attribute.cs (CheckAttributeType): Update.
549         * doc.cs (FindDocumentedType): Remove allowAlias argument.
550         (FindDocumentedTypeNonArray): Likewise.
551
552 2005-01-11  Raja R Harinath  <rharinath@novell.com>
553
554         Fix cs0509.cs, cs1632.cs.
555         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
556         is the same as IsInterface.
557         (TypeContainer.GetClassBases): Likewise.
558         * statement.cs (LabeledStatement.ig): New field.
559         (LabeledStatement.LabelTarget): Save ILGenerator which created the
560         label.
561         (LabeledStatement.DoEmit): Check that the label was created with
562         the same ILGenerator.
563
564 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
565
566         Fix #71058
567         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
568         accessors to its properties.
569
570         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
571         from accessors to property.
572         
573 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
574
575         Fix #70722
576         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
577         only for overrides.
578         
579 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
580
581         * attribute.cs: Check for null and empty strings.  
582
583         I have lost another battle to Paolo.
584
585 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
586
587         Fix #70942
588         * class.cs (PropertyMethod): Set Parent field in ctors.
589         (SetMethod.InternalParameters): Add unsafe switch hack.
590         Override MarkForDuplicationCheck where it is appropriate.
591
592         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
593         It says whether container allows members with the same name.
594         Base default is no.
595         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
596         Removed is_method parameter.
597
598 2005-01-06  Duncan Mak  <duncan@ximian.com>
599
600         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
601         because the previous change led to incorrect reporting of CS1032
602         ("Cannot define/undefine preprocessor symbols after first token in
603         file"). Instead of using `tokens_seen' as the only flag that
604         triggers CS1040, introduce `comments_seen'. This new flag is used
605         to signify having seen comments on the current line, so it is
606         unset after a newline.
607
608 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
609
610         * doc.cs : When searching for a type, find nested type too.
611           This fixes bug #71040.
612
613 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
614
615         * doc.cs :
616           - Warn missing member comment on those classes which also does not
617             have doc comments. Fixed bug #71041.
618           - Don't warn missing doc comment on default constructor.
619             Fixed bug #71042.
620
621 2005-01-06  Duncan Mak  <duncan@ximian.com>
622
623         * cs-tokenizer.cs (xtoken): After handling traditional C-style
624         comments, set `tokens_seen' to true. This allows us to detect
625         misplaced preprocessor directives (i.e. not at the beginning of
626         the a line, nor after whitespaces). In that case, report error
627         CS1040. This fixes bug #56460.
628
629         * cs-parser.jay (interface_member_declaration): Add checks for
630         IsExplicitImpl, and report CS0541 error if an interface member is
631         defined as an explicit interface declaration.
632
633 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
634
635         Fix #70817
636         * class.cs (PropertyMethod): Set Parent field in ctors.
637         (SetMethod.InternalParameters): Add unsafe switch hack.
638         
639         * decl.cs (MemberCore.Parent): Cannot be readonly.
640
641 2005-01-06  Raja R Harinath  <rharinath@novell.com>
642
643         * decl.cs (DeclSpace.ResolveType): Remove.
644         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
645         Merge in code from ...
646         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
647         * class.cs, enum.cs: Update to changes.
648
649 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
650
651         * anonymous.cs: Ensure that we init the scope of our parent if it
652         has not been initialized yet.
653
654 2004-12-30  Duncan Mak  <duncan@ximian.com>
655
656         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
657         if field.FieldBuilder is null. Fixes #70758.
658
659         * convert.cs: Fixed some typos and updated some of the comments.
660         (ImplicitStandardConversionExists):
661         (TryImplicitIntConversion): If `target_type' is an interface and
662         the type of `ic' implements this interface, return true or a new
663         BoxedCast instead of null. This fixes #70468.
664
665 2004-12-29  Duncan Mak  <duncan@ximian.com>
666
667         * expression.cs (Argument.Emit): Check that Expr is
668         IMemoryLocation before casting to it, and report CS1510 otherwise.
669
670         This fixes #70402.
671
672 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
673
674         * statement.cs (Block.ThisVariable): remove the recursion here, to
675         make the --profile more sane.
676
677 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
678
679         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
680         assembly, by JB Evain.
681
682 2004-12-17  Raja R Harinath  <rharinath@novell.com>
683
684         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
685           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
686         "parent" refers to enclosing type/class.  "base" refers to superclass.
687
688 2004-12-17  Raja R Harinath  <rharinath@novell.com>
689
690         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
691         Ensure that we only have GlobalAttributes.
692         * attribute.cs (Attribute.Emit): Make non-virtual.
693         (GlobalAttribute.Emit): Remove.
694         (Attribute.Resolve): Make virtual.
695         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
696         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
697         the argument. Don't create one.
698         (Attribute.GetObsoleteAttribute): Likewise.
699         (Attribute.GetClsCompliantAttributeValue): Likewise.
700         * class.cs, decl.cs: Update to changes.
701
702 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
703
704         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
705         
706         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
707         
708         * statement.cs (Foreach.Resolve): Add error 186 report.
709
710 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
711
712         * expression.cs (Conditional.DoResolve): Add warning 429.
713         
714         * statement.cs (If.Resolve): Add warning 665.
715
716 2004-12-16  Raja R Harinath  <rharinath@novell.com>
717
718         New invariant: RootContext.Tree.Types.NamespaceEntry == null
719         except when in the parser, and in GlobalAttribute.
720         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
721         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
722         RootContext.Tree.Types.NamespaceEntry once work is done.
723         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
724         and resets RootContext.Tree.Types.NamespaceEntry.
725
726 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
727
728         * cs-parser.jay: Don't create a block for every variable.
729
730 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
731
732         * location.cs: Provide extra information.
733
734         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
735         variables from the captured environment, it is the ldarg_0.
736
737 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
738
739         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
740         find a conclusion.
741         
742         * class.cs: Changed warning level for 169 to avoid developer
743         displeasure from warning flooding. It will be changed back when they
744         fix most of current BCL warnings.
745         
746         * RootContext.cs: Pushed default WarningLevel to 3.
747         
748         * statement.cs: Removed unused variable.
749
750 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
751
752         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
753         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
754         Add error 502 report.
755         (StaticClass.DefineType): Add error 441 report.
756         (Class.AllowedModifiersProp): New virtual property as temporary
757         extension to AllowedModifiers.
758         (Class.DefineType): Add error 418 report. Moved ModFlags check here
759         to share implementation with StaticClass and don't call virtual
760         methods from ctor.
761         
762         * driver.cs (MainDriver): Add error 1558 test.
763
764         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
765         report. Moved error 36 test here.
766
767         * statement.cs (Throw.Resolve): Add error 724 report.
768
769         * typemanager.cs: Add out_attribute_type core type.
770         
771 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
772
773         * class.cs (TypeContainer.VerifyClsCompliance): Add error
774         3018 report.
775         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
776
777         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
778         3017 report.
779         
780         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
781
782         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
783         Add error 3023 report.
784         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
785
786         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
787         implementation.
788
789 2004-12-12  John Luke  <john.luke@gmail.com>
790
791         * driver.cs (AddArgs): take -- into account when
792         adding arguments, fixes bug 65710 
793
794 2004-12-12  Martin Baulig  <martin@ximian.com>
795
796         * expression.cs (Unary.TryReduceNegative): Added support for
797         SByteConstant and ByteConstant.
798         (Unary.Reduce): Check error values from TryReduceNegative().
799
800 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
801
802         * attributes.cs (Attribute.Resolve): Avoid multiple error report
803         and report exception as error 182.
804
805 2004-12-10  Raja R Harinath  <rharinath@novell.com>
806
807         * driver.cs (Main): Fix message when there are warnings.
808
809 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
810
811         * delegate.cs: Fixed my fix from yesterday, sorry about that.
812
813 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
814
815         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
816         Reduced number of warnings.
817         
818         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
819
820 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
821
822         * driver.cs: Removed message.
823
824         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
825
826 2004-12-08    <vargaz@freemail.hu>
827
828         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
829
830 2004-12-08  Martin Baulig  <martin@ximian.com>
831
832         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
833         instead of a CS3002 for properties and indexer.
834
835 2004-12-08  Martin Baulig  <martin@ximian.com>
836
837         * decl.cs (MemberName.ToString): Make this work again.
838
839 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
840
841         * attribute.cs (Resolve): Add error 591 detection.
842
843         * class.cs (FieldMember.Define): Add error 1547 detection.
844         (Indexer.Define): Add error 620 detection.
845         (Operator.Define): Add error 590 detection.
846
847         * ecore.cs: Missing argument for error 79.
848
849         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
850         detection.
851
852 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
853
854         Fix #70106
855         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
856         only.
857
858 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
859
860         * cs-parser.jay : handle doc comments on implicit/explicit operators.
861           Some operator comments were suppressed.
862         * doc.cs : Implicit/explicit operator name in doc comments are like
863           "op_Explicit(type)~returnType", so added suffix handling.
864
865 2005-01-21  Alp Toker  <alp@atoker.com>
866
867         * cs-parser.jay: destructor_declaration's container is PartialContainer
868         not Class when partial types are used, so use Kind prop instead of 'is'.
869
870 2004-12-12  Martin Baulig  <martin@ximian.com>
871
872         * expression.cs (Unary.TryReduceNegative): Added support for
873         SByteConstant and ByteConstant.
874         (Unary.Reduce): Check error values from TryReduceNegative().
875
876 2004-12-11  Martin Baulig  <martin@ximian.com>
877
878         * support.cs (ReflectionParameters.ParameterName): If we have a
879         `gpd', call `ParameterName' on it.
880
881         * parameter.cs (Parameter.GetParameterAttributes): New static method.
882
883         * pending.cs (PendingImplementation.DefineProxy): Call
884         DefineParameter() for all of the MethodBuilder's arguments.
885
886 2004-12-09  Martin Baulig  <martin@ximian.com>
887
888         * doc.cs (DocUtil): Make this a static class.
889
890 2004-12-09  Martin Baulig  <martin@ximian.com>
891
892         * expression.cs (Invocation.InferType): Moved the type inference
893         implementation into TypeManager.
894
895         * generics.cs (TypeManager): Moved the type inference
896         implementation here.
897
898 2004-12-09  Martin Baulig  <martin@ximian.com>
899
900         * typemanager.cs (TypeManager): Make this a partial class.
901
902         * generics.cs
903         (TypeManager): Move the generics part of `TypeManager' here.
904
905 2004-12-08  Martin Baulig  <martin@ximian.com>
906
907         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
908         instead of a CS3002 for properties and indexer.  Added CS3024
909         check for generic interfaces.
910
911         * attributes.cs (AttributeTester.AnalyzeTypeCompliance): Generic
912         instances are not CLS-compliant.
913
914 2004-12-08  Martin Baulig  <martin@ximian.com>
915
916         * cs-parser.jay
917         (void_pointer_expression): New rule for `void*', `void**' etc.
918         (typeof_expression): Add `void_pointer_expression'; fixes #66846.       
919
920 2004-12-08  Martin Baulig  <martin@ximian.com>
921
922         * expression.cs (Invocation.InferType): Removed the hack for
923         MethodCore.MayUnify().  
924
925         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Make
926         this actually work.
927
928         * class.cs (MethodCore.MayUnify): Use
929         TypeManager.MayBecomeEqualGenericTypes().       
930
931 2004-12-08  Martin Baulig  <martin@ximian.com>
932
933         * expression.cs (Is.DoResolve, As.DoResolve): If we're a type
934         parameter, box it.  Fixes #69233.
935
936 2004-12-08  Martin Baulig  <martin@ximian.com>
937
938         * generic.cs (ConstructedType.CheckConstraints): Valuetypes always
939         have the ctor constraint.  Fixes #68326.
940
941 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
942
943         * cs-parser.jay : interface comment was not consumed because of
944           extra opt_semicolon before doc handling.
945
946 2004-12-03  Raja R Harinath  <rharinath@novell.com>
947
948         Fix test-327.cs, test-328.cs, and put in early infrastructure
949         for eventually fixing #52697.
950         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
951         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
952         from other methods.
953         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
954         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
955         (VerifyUsing, error246): Update.
956         * rootcontext.cs (RootContext.NamespaceLookup): Just use
957         'NamespaceEntry.LookupNamespaceOrType'.
958
959 2004-12-07  Martin Baulig  <martin@ximian.com>
960
961         * driver.cs: Call it "BETA SOFTWARE" :-)
962
963 2004-12-06  Raja R Harinath  <rharinath@novell.com>
964
965         Fix crash on cs0657-17.cs.
966         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
967         Use RootContext.Tree.Types, not 'new RootTypes ()'.
968         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
969         the case where the NamespaceEntry gets overwritten.
970
971 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
972
973         Fixed #69195, #56821
974         * ecore.cs (ResolveBoolean): Tiny refactoring.
975
976         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
977         of right expression resolving when left is false constant and
978         operator is LogicalAnd OR true constant and operator is LogicalOr.
979
980         * statement.cs (ResolveUnreachable): Always reports warning.
981
982 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
983
984         * class.cs: Distinguish between 1721 and 1722 (just a little help
985         for the programmer).
986
987 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
988
989         * delegate.cs: Only allow this on new versions of the language. 
990
991 2004-12-02  Duncan Mak  <duncan@ximian.com>
992
993         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
994         Expression class.
995         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
996         here as a static method. Take an additional bool out parameter
997         `must_do_cs1540_check' for signaling to InstanceResolve.
998         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
999         member field from PropertyExpr class and made it an argument of
1000         the method instead.
1001         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
1002         check for MarshalByRefObject, and report CS0122 instead of CS1540.
1003         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
1004         and `remove_accessor' as well as InstanceResolve: report CS0122
1005         where applicable.
1006
1007         Fixes #70129.
1008
1009 2004-12-07  Martin Baulig  <martin@ximian.com>
1010
1011         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
1012         and CS0692 where appropriate.
1013
1014 2004-12-06  Martin Baulig  <martin@ximian.com>
1015
1016         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
1017         IsDuplicateImplementation() and improved it.
1018
1019         * expression.cs (Invocation.InferTypeArguments): Added
1020         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
1021         and removed the "ref" modifier from `infered_types'.
1022
1023         * decl.cs (MemberName.ToString): Removed the exception.
1024
1025 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
1026
1027         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
1028           comments are allowed.
1029
1030 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1031
1032         * delegate.cs: Add checks for subtypes in paramaters and return values
1033         in VerifyMethod () to add support for Covariance/Contravariance
1034         in delegates.
1035         
1036 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
1037
1038         * report.cs: Remove extra closing parenthesis.
1039
1040         * convert.cs (Error_CannotImplicitConversion): If the name of the
1041         types are the same, provide some extra information.
1042
1043 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
1044
1045         Fix bug #70102
1046         * attribute.cs (Resolve): Improved implementation of params
1047         attribute arguments.
1048
1049         * support.cs (ParameterData): Add HasParams to be faster.
1050
1051 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
1052
1053         all things are for /doc support:
1054
1055         * doc.cs: new file that supports XML documentation generation.
1056         * mcs.exe.sources: added doc.cs.
1057         * driver.cs:
1058           Handle /doc command line option.
1059           Report error 2006 instead of 5 for missing file name for /doc.
1060           Generate XML documentation when required, after type resolution.
1061         * cs-tokenizer.cs:
1062           Added support for picking up documentation (/// and /** ... */),
1063           including a new XmlCommentState enumeration.
1064         * cs-parser.jay:
1065           Added lines to fill Documentation element for field, constant,
1066           property, indexer, method, constructor, destructor, operator, event
1067           and class, struct, interface, delegate, enum.
1068           Added lines to warn incorrect comment.
1069         * rootcontext.cs :
1070           Added Documentation field (passed only when /doc was specified).
1071         * decl.cs:
1072           Added DocComment, DocCommentHeader, GenerateDocComment() and
1073           OnGenerateDocComment() and some supporting private members for
1074           /doc feature to MemberCore.
1075         * class.cs:
1076           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
1077         * delegate.cs:
1078           Added overriden DocCommentHeader.
1079         * enum.cs:
1080           Added overriden DocCommentHeader and GenerateDocComment().
1081
1082 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
1083
1084         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
1085         unwrapping the enumeration values, chain to
1086         DoConstantNumericPromotions again, so we can promote things to the
1087         fundamental types (takes care of enums that are bytes, sbytes).
1088
1089         Fixes bug #62054.
1090
1091 2004-12-01  Raja R Harinath  <rharinath@novell.com>
1092
1093         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
1094         Fix long-standing bug in type-lookup.  Use FindType instead of
1095         LookupType when ec.ResolvingTypeTree.
1096         (Attribute.ResolveType, Attribute.Resolve)
1097         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
1098         Update to changes.
1099         (Attributes.Search): Remove internal version.  Update.
1100         (Attributes.SearchMulti): Update.
1101         (Attributes.GetClsCompliantAttribute): Remove.
1102         (Attributes.GetIndexerNameAttribute): Remove.
1103         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
1104         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
1105         * class.cs (Indexer.Define): Likewise.
1106
1107 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
1108
1109         Fix bug #68790
1110         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
1111         MarshallByReference members access.
1112
1113         * expression.cs: Use CheckMarshallByRefAccess;
1114         Better error CS0197 message.
1115
1116         * report.cs: Print whole related error message.
1117
1118 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1119
1120         * class (GetClassBases): Better error 60 report.
1121         (EventProperty): Disabled warning 67 detection.
1122
1123 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1124
1125         Fix bug #60324
1126         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
1127
1128         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
1129         precise values.
1130
1131 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1132
1133         Fix bug #49488
1134         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
1135
1136         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
1137
1138 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
1139
1140         * attribute.cs (Attribute.Resolve): Refine error reporting and
1141         report a cs0117 if the identifier does not exist, to distinguish
1142         from 0617 which is a miss-use of the actual identifier.
1143
1144         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
1145         between cs0070 and cs0079.
1146
1147         * class.cs (MemberBase.DoDefine): When reporting a wrong
1148         accessibility level, we use MethodCore to compare instead of
1149         Method (this was a regression in some refactoring effort).
1150
1151         So now we correctly report cs0056 again.
1152
1153         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
1154         testing the target_type (which was known to be object_type) and
1155         not the source type (which is anonymous_method).
1156
1157         Fixed reporting of error cs1660.
1158
1159         * expression.cs (UserCast.Source): Expose the underlying cast.
1160
1161         * statement.cs (Switch.SwitchGoverningType): Sort the list of
1162         allowed types to find a match to int32 first (most common).
1163
1164         In addition, it ignores any ImplicitUserConversions that did an
1165         internal implicit conversion (as the switch statement allows only
1166         one integral conversion to exist).
1167
1168         * class.cs (PartialContainer.Create): rename `name' to
1169         `member_name' for clarity.  Then replace the string calls with a
1170         call to MemberName.GetPartialName, as now using
1171         MemberName.ToString is an error (this is due to the side effects
1172         it had, that were fixed in the past).
1173
1174         This will restore the error reporting on a number of partial class
1175         errors that were missusing this (and getting an exception as a
1176         results, which is now just a plain textual warning, because
1177         yyparse debug output would crash otherwise).
1178
1179 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1180
1181         * Makefile (PROGRAM_INSTALL_DIR): Remove.
1182
1183 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1184
1185         * rootcontext.cs (LookupType): Make sure to cache lookups that
1186         don't give us a negative result. This saves about 5% of corlib
1187         compilation time.
1188
1189 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1190
1191         * report.cs (AbstractMessage.Print): messages are sent to stderr
1192
1193         * class.cs (TypeContainer.GetClassBases): It is an error to have a
1194         non-interface in the list of interfaces (at this point, either
1195         parent was properly set, or a base class is being listed in the
1196         interfaces section).
1197
1198         This flags error 1722, and resolves the crash from bug 69259.
1199
1200 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1201
1202         * statement.cs (Using.EmitExpressionFinally): make this work right
1203         for valuetypes. Fixes 69926.
1204
1205 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1206
1207         * const.cs (Const.ChangeType): Cope with the "0 literal can be
1208         converted to an enum" here, before we try to change the underlying
1209         type.  This code exists, but it is a different code path than the
1210         one used while encoding constants.
1211
1212         (ImplicitReferenceConversionExists): In addition, resynchronized
1213         the code here, so it matches the same code in
1214         ImplicitReferenceConversionExists for the `from any class-type S
1215         to any interface-type T'.       
1216
1217 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
1218
1219         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
1220
1221 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
1222
1223         * cs-parser.jay: Use verbosity accordingly. 
1224
1225 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1226
1227         * expression.cs (Unary.ResolveOperator): Do not report warning;
1228         AddressOf reads from variable.
1229         
1230         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
1231
1232 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1233
1234         Fix bug #69462
1235
1236         * attribute.cs (Attributable): Removed CheckTargets.
1237         (Attributes.Emit): Explicit attribute targets are tested here.
1238
1239         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
1240         not enabled for interfaces.
1241
1242         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
1243         (GetAssemblyName): Ouch next bug there.
1244
1245 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1246
1247         * expression.cs: Error 275 added.
1248         
1249 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
1250
1251         Fix bug #69177 (Implemented decimal constant support)
1252
1253         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
1254         (BinaryFold): Add DecimalConstant.
1255
1256         * const.cs (Define): Decimal constant 
1257         (is not constant.
1258         (ChangeType): Add decimal type handling.
1259         (LookupConstantValue): Don't set value for decimal type but
1260         emit DecimalConstantAttribute. Needed for constant optimization.
1261
1262         * constant.cs (ToDecimal): New method.
1263         (ConvertToDecimal): New method.
1264         (IntConstant): Implemented ConvertToDecimal.
1265         (DecimalConstant.Emit): Emit optimized version for decimals in
1266         int range.
1267
1268         * expression.cs (ResolveOperator): Changed order of constant
1269         reduction to work correctly with native types which have
1270         overloaded operators.
1271         (ResolveMemberAccess): Extract constant value from attribute
1272         for decimal type.
1273
1274         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
1275
1276         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
1277         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
1278         (ChangeType): Decimal is special.
1279         (TypeToCoreType): Add decimal type.
1280
1281 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1282
1283         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
1284         decimal types.
1285
1286 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1287
1288         * class.cs (EventField.ApplyAttributeBuilder): Fix error
1289         test cs1667-5.cs.
1290
1291 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1292
1293         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
1294
1295         * pending.cs (PendingImplementation): Grab only interfaces.
1296
1297 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1298
1299         * statement.cs (ForeachHelperMethods): Add location member and
1300         error 202 detection.
1301
1302 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
1303
1304         * expression.cs (DoResolveBase): Fixed wrong warning for out
1305         variables.
1306
1307 2004-12-04  Martin Baulig  <martin@ximian.com>
1308
1309         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
1310         to check whether the conversion is ok.
1311
1312         * typemanager.cs (TypeManager.GetTypeArguments): Just return
1313         `Type.EmptyTypes' if we're not a generic TypeContainer.
1314
1315 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1316
1317         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
1318         old bug: when converting from the null literal to a pointer,
1319         return an EmptyCast, not the NullLiteral.
1320
1321         This fixes #69921, the recent null_type changes probably made this
1322         bug more prominent.
1323
1324 2004-12-03  Martin Baulig  <martin@ximian.com>
1325
1326         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1327         method as our child, call AnonymousMethod.Compatible() on it.
1328
1329 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
1330
1331         * class.cs (FieldBase): Use an unused bit field from the field to
1332         encode the `has_offset' property from the FieldMember.  This saves
1333         a couple of Ks on bootstrap compilation.
1334
1335         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1336         method as our child, return the AnonymousMethod resolved
1337         expression.
1338
1339         * expression.cs (New.DoResolve): Allow return values from
1340         NewDelegate to also include AnonymousMethods.
1341
1342         Fixes #70150.
1343
1344 2004-11-29  Raja R Harinath  <rharinath@novell.com>
1345
1346         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
1347         cs1648 report.
1348         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
1349         System.Runtime.InteropServices._Exception, since it's a base
1350         interface of the core type System.Exception in the net_2_0 profile.
1351
1352 2004-11-27  Martin Baulig  <martin@ximian.com>
1353
1354         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
1355
1356 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1357
1358         * Makefile: Convert to use executable.make.
1359         * gmcs.exe.sources: New.
1360
1361 2004-11-25  Martin Baulig  <martin@ximian.com>
1362
1363         * expression.cs (Invocation.InferType): Added support for byref types.
1364
1365 2004-11-25  Martin Baulig  <martin@ximian.com>
1366
1367         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
1368         in TypeManager.TypeToCoreType().
1369
1370 2004-11-25  Martin Baulig  <martin@ximian.com>
1371
1372         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
1373         "Dispose" method from the `current_type'.
1374         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
1375         DoDefineMembers() instead of using the MethodBuilder; this is
1376         required for generic iterators.
1377
1378         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
1379
1380 2004-11-24  Martin Baulig  <martin@ximian.com>
1381
1382         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
1383
1384 2004-11-20  Martin Baulig  <martin@ximian.com>
1385
1386         * expression.cs (Invocation.InferType): Correctly infer generic
1387         instances; see gen-103.cs.
1388         (Invocation.InferTypeArguments): If a generic method doesn't have
1389         any unbound type parameters, we don't need to infer anything.
1390
1391 2004-11-19  Raja R Harinath  <rharinath@novell.com>
1392
1393         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
1394
1395 2004-11-17  Raja R Harinath  <rharinath@novell.com>
1396
1397         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
1398         (TypeHandle.GetMemberCache): New.
1399         (TypeHandle.TypeHandle): Update.
1400         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
1401         (TypeManager.LookupParentInterfacesCache):
1402         Rename from LookupInterfaceCache.  Optimize slightly.
1403         (TypeManager.MemberLookup_FindMembers): Update.
1404         * decl.cs (MemberCache.MemberCache): Set Container to null in the
1405         multi-type variant.
1406         (AddCacheContents): Rename from AddHashtable.
1407         * class.cs (TypeContainer.parent_container): Remove.
1408         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
1409         (TypeContainer.DoDefineMembers): Don't initialize it.
1410         Update to name changes.
1411         
1412 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
1413
1414         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
1415         that factors the code to check access modifiers on override.  
1416
1417         (PropertyBase): Use the code here.
1418
1419         Patch from Lluis S'anchez, fixes bug #69361.
1420
1421 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
1422
1423         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
1424         routine that is used to report the use of a captured variable
1425         whose address has been taken.
1426
1427         There are two checks: one when variables are being captured and
1428         the other check is when the address of a variable is taken. 
1429         
1430         (because an anonymous methods might be resolved before *or* after
1431         the address has been taken) and 
1432
1433         * expression.cs (Conditional.DoResolve): Remove the special
1434         casing that Martin added to trueExpr and falseExpr being both
1435         NullLiteral.  We get the right behavior now just by introducing
1436         the null_type into the compiler. 
1437
1438         * convert.cs (ExplicitConversion): Change the code to use
1439         null_type instead of testing `expr is NullLiteral'.
1440         (ImplicitConversionStandard): use null_type too.
1441         (ImplicitReferenceConversionExists): use null_type too.
1442         (ImplicitReferenceConversion): use null_type too.
1443
1444         * literal.cs: The type of `NullLiteral' is now null_type instead
1445         of object_type. 
1446         (Resolve): Set the type here.
1447
1448         * typemanager.cs: Introduce null_type.
1449
1450 2004-11-18  Martin Baulig  <martin@ximian.com>
1451
1452         * rootcontext.cs
1453         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
1454
1455 2004-11-18  Martin Baulig  <martin@ximian.com>
1456
1457         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
1458
1459 2004-11-18  Martin Baulig  <martin@ximian.com>
1460
1461         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
1462         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
1463         call ResolveConstructedType() on it to resolve it without checking
1464         constraints.
1465         (Constraints.ResolveTypes): Check them here.
1466         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
1467         but don't check constraints.
1468         (ConstructedType.ResolveAsTypeTerminal): Override this and also
1469         check constraints here.
1470         (ConstructedType.ResolveConstructedType): New public method.  This
1471         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
1472         resolve ourselves without checking constraints.
1473
1474         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
1475
1476 2004-11-18  Martin Baulig  <martin@ximian.com>
1477
1478         * decl.cs
1479         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
1480
1481         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
1482
1483 2004-11-18  Martin Baulig  <martin@ximian.com>
1484
1485         * ecore.cs (TypeExpr.ResolveType): Removed.
1486         (Expression.ResolveAsTypeTerminal): We always return a fully
1487         resolved `TypeExpr', so we can just access its `Type'.
1488
1489         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
1490
1491 2004-11-17  Martin Baulig  <martin@ximian.com>
1492
1493         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
1494         sure we don't return any unresolved TypeExpr's.
1495         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
1496         a `TypeExpr'.
1497         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
1498
1499         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
1500         unresolved `ConstructedType's.
1501
1502 2004-11-17  Martin Baulig  <martin@ximian.com>
1503
1504         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
1505
1506 2004-11-17  Martin Baulig  <martin@ximian.com>
1507
1508         * ecore.cs
1509         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
1510
1511         * decl.cs (DeclSpace.ResolveType): Removed.
1512         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
1513
1514 2004-11-17  Martin Baulig  <martin@ximian.com>
1515
1516         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1517         direction, like FindMembers() does.  Fixes #69546, testcase is in
1518         test-315.cs.    
1519
1520 2004-11-16  Martin Baulig  <martin@ximian.com>
1521
1522         This is based on a patch from Marek Safar, see bug #69082.
1523         Fixes bugs #63705 and #67130.
1524
1525         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1526         method; create a MemberCache for an interface type and cache the
1527         result.
1528
1529         * decl.cs (IMemberContainer.ParentContainer): Removed.
1530         (IMemberContainer.ParentCache): New property.
1531         (MemberCache.SetupCacheForInterface): Removed.
1532         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1533         to create a cache for an interface's "parent".
1534
1535         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1536         interfaces too.
1537
1538 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1539
1540         * statement.cs: Avoid adding bools to a hashtable.
1541
1542 2004-11-15  Martin Baulig  <martin@ximian.com>
1543
1544         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
1545
1546 2004-11-11  Martin Baulig  <martin@ximian.com>
1547
1548         * typemanager.cs (TypeManager.GetMethodName): New method.
1549
1550         * class.cs (MethodData.Define): Include the generic arity in the
1551         name of an explicit interface; also add it to the method name.
1552
1553         * pending.cs (PendingImplementation.InterfaceMethod): The method
1554         name now includes the generic arity.
1555
1556 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1557
1558         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1559         calling an unsafe method from a safe location.
1560
1561 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1562
1563         Fix #69167
1564         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1565
1566 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1567
1568         * namespace.cs (VerifyUsing): use GetPartialName instead of
1569         ToString. 
1570
1571 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1572
1573         * statement.cs (Return.Resolve): Fix regression in typo: if
1574         `in_exc', we have to request a NeedReturnLabel, this was a typo
1575         introduced in the anonymous method check-in.  Fixes #69131.
1576
1577         * Indexers were using the ShortName when defining themselves,
1578         causing a regression in the compiler bootstrap when applying the
1579         patch from 2004-11-02 (first part), now they use their full name
1580         and the bug is gone.
1581
1582 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1583
1584         * driver.cs: Strip the path from the names of embedded resources. Fixes
1585         #68519.
1586
1587 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1588
1589         Fix error message regression: cs0104-2.cs.
1590         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1591         (AliasEntry.Resolve): Update.
1592         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1593         'silent' flag.
1594         (RootContext.LookupType): Update.
1595
1596 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1597
1598         * cs-parser.jay: Add support for handling accessor modifiers
1599         * class: Add support port accessor modifiers and error checking,
1600         define PropertyMethod.Define as virtual (not abstract anymore)
1601         * ecore.cs: Add checking for proeprties access with access modifiers
1602         * iterators.cs: Modify Accessor constructor call based in the modified
1603         constructor
1604 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1605
1606         * expression.cs (StringConcat): Handle being called twice,
1607         as when we have a concat in a field init with more than two
1608         ctors in the class
1609
1610 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1611
1612         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1613         special case explicit implementations, we should always produce
1614         the .property or .event declaration.
1615         
1616         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1617         since it will not return correct data if people use this
1618         unresolved in the presence of using statements (see test-313).
1619
1620         * class.cs (MethodData.Define): If we are an explicit interface
1621         implementation, set the method name to the full name of the
1622         interface plus the name of the method.  
1623
1624         Notice that using the method.MethodName.GetFullName() does not
1625         work, as it will only contain the name as declared on the source
1626         file (it can be a shorthand in the presence of using statements)
1627         and not the fully qualifed type name, for example:
1628
1629         using System;
1630
1631         class D : ICloneable {
1632                 object ICloneable.Clone ()  {
1633                 }
1634         }
1635
1636         Would produce a method called `ICloneable.Clone' instead of
1637         `System.ICloneable.Clone'.
1638
1639         * namespace.cs (Alias.Resolve): Use GetPartialName.
1640         
1641 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1642
1643         * cs-parser.jay: Add error 1055 report.
1644
1645 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1646
1647         * assign.cs (Assign.DoResolve): Only do the transform of
1648         assignment into a New if the types are compatible, if not, fall
1649         through and let the implicit code deal with the errors and with
1650         the necessary conversions. 
1651
1652 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1653
1654         * cs-parser.jay: Add error 1031 report.
1655
1656         * cs-tokenizer.cs: Add location for error 1038.
1657
1658 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1659
1660         * cs-parser.jay: Add error 1016 report.
1661
1662 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1663
1664         * cs-parser.jay: Add errors 1575,1611 report.
1665
1666 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1667
1668         * cs-parser.jay: Add error 1001 report.
1669
1670 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1671
1672         Fix #68850
1673         * attribute.cs (GetMarshal): Add method argument for
1674         caller identification.
1675
1676         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1677         agument for GetMarshal and RuntimeMissingSupport.
1678
1679 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1680
1681         * attribute.cs (ExtractSecurityPermissionSet): Removed
1682         TypeManager.code_access_permission_type.
1683
1684         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1685
1686 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1687
1688         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1689         for obsolete use of a variable here.   Fixes regression on errors
1690         cs0619-25 and cs0619-26.
1691
1692 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1693
1694         Fix #62358, implemented security attribute encoding.
1695
1696         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1697         Tests permitted SecurityAction for assembly or other types.
1698         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1699         data from SecurityPermissionAttribute to PermisionSet class.
1700
1701         * class.cs (ApplyAttributeBuilder): Added special handling
1702         for System.Security.Permissions.SecurityAttribute based types.
1703
1704         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1705         special handling for System.Security.Permissions.SecurityAttribute
1706         based types.
1707
1708         * enum.cs (ApplyAttributeBuilder): Added special handling
1709         for System.Security.Permissions.SecurityAttribute based types.
1710
1711         * parameter.cs (ApplyAttributeBuilder): Added special handling
1712         for System.Security.Permissions.SecurityAttribute based types.
1713
1714         * rootcontext.cs: Next 2 core types.
1715
1716         * typemanager.cs (TypeManager.security_permission_attr_type):
1717         Built in type for the SecurityPermission Attribute.
1718         (code_access_permission_type): Build in type.
1719
1720 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1721
1722         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1723         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1724         all of this information into
1725         EmitContext.EmitCapturedVariableInstance.
1726         
1727         * codegen.cs (EmitCapturedVariableInstance): move here the
1728         funcionality of emitting an ldarg.0 in the presence of a
1729         remapping.   This centralizes the instance emit code.
1730
1731         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1732         then emit a load of this: it means that we have reached the
1733         topmost ScopeInfo: the one that contains the pointer to the
1734         instance of the class hosting the anonymous method.
1735
1736         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1737         captures to the topmost CaptureContext.
1738
1739 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1740
1741         * expression.cs (LocalVariableReference): Move the knowledge about
1742         the iterators into codegen's EmitCapturedVariableInstance.
1743
1744 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1745
1746         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1747         all code paths return a value from an anonymous method (it is the
1748         same as the 161 error, but for anonymous methods).
1749
1750 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1751
1752         The introduction of anonymous methods in the compiler changed
1753         various ways of doing things in the compiler.  The most
1754         significant one is the hard split between the resolution phase
1755         and the emission phases of the compiler.
1756
1757         For instance, routines that referenced local variables no
1758         longer can safely create temporary variables during the
1759         resolution phase: they must do so from the emission phase,
1760         since the variable might have been "captured", hence access to
1761         it can not be done with the local-variable operations from the runtime.
1762         
1763         * statement.cs 
1764
1765         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1766         is a toplevel block.
1767
1768         (ToplevelBlock): A new kind of Block, these are the blocks that
1769         are created by the parser for all toplevel method bodies.  These
1770         include methods, accessors and anonymous methods.
1771
1772         These contain some extra information not found in regular blocks:
1773         A pointer to an optional CaptureContext (for tracking captured
1774         local variables and parameters).  A pointer to the parent
1775         ToplevelBlock.
1776         
1777         (Return.Resolve): Catch missmatches when returning a value from an
1778         anonymous method (error 1662).
1779         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1780         phase.
1781
1782         (Break.Resolve): ditto.
1783
1784         (SwitchLabel): instead of defining the labels during the
1785         resolution phase, we now turned the public ILLabel and ILLabelCode
1786         labels into methods called GetILLabelCode() and GetILLabel() that
1787         only define the label during the Emit phase.
1788
1789         (GotoCase): Track the SwitchLabel instead of the computed label
1790         (its contained therein).  Emit the code by using
1791         SwitchLabel.GetILLabelCode ().
1792
1793         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1794         whether the Local has been captured or not.
1795
1796         (LocalInfo.IsCaptured): New property, used to tell whether the
1797         local has been captured.
1798         
1799         * anonymous.cs: Vastly updated to contain the anonymous method
1800         support.
1801
1802         The main classes here are: CaptureContext which tracks any
1803         captured information for a toplevel block and ScopeInfo used to
1804         track the activation frames for various local variables.   
1805
1806         Each toplevel block has an optional capture context associated
1807         with it.  When a method contains an anonymous method both the
1808         toplevel method and the anonymous method will create a capture
1809         context.   When variables or parameters are captured, they are
1810         recorded on the CaptureContext that owns them, for example:
1811
1812         void Demo () {
1813              int a;
1814              MyDelegate d = delegate {
1815                  a = 1;
1816              }
1817         }
1818
1819         Here `a' will be recorded as captured on the toplevel
1820         CapturedContext, the inner captured context will not have anything
1821         (it will only have data if local variables or parameters from it
1822         are captured in a nested anonymous method.
1823
1824         The ScopeInfo is used to track the activation frames for local
1825         variables, for example:
1826
1827         for (int i = 0; i < 10; i++)
1828                 for (int j = 0; j < 10; j++){
1829                    MyDelegate d = delegate {
1830                         call (i, j);
1831                    }
1832                 }
1833
1834         At runtime this captures a single captured variable `i', but it
1835         captures 10 different versions of the variable `j'.  The variable
1836         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1837         recorded on a child.  
1838
1839         The toplevel ScopeInfo will also track information like the `this'
1840         pointer if instance variables were referenced (this is necessary
1841         as the anonymous method lives inside a nested class in the host
1842         type of the method). 
1843
1844         (AnonymousMethod): Expanded to track the Toplevel, implement
1845         `AnonymousMethod.Compatible' to tell whether an anonymous method
1846         can be converted to a target delegate type. 
1847
1848         The routine now also produces the anonymous method content
1849
1850         (AnonymousDelegate): A helper class that derives from
1851         DelegateCreation, this is used to generate the code necessary to
1852         produce the delegate for the anonymous method that was created. 
1853
1854         * assign.cs: API adjustments for new changes in
1855         Convert.ImplicitStandardConversionExists.
1856
1857         * class.cs: Adjustments to cope with the fact that now toplevel
1858         blocks are of type `ToplevelBlock'. 
1859
1860         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1861         insteda of standard blocks.
1862
1863         Flag errors if params arguments are passed to anonymous methods.
1864
1865         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1866         `CurrentAnonymousMethod' which points to the current Anonymous
1867         Method.  The variable points to the AnonymousMethod class that
1868         holds the code being compiled.  It is set in the new EmitContext
1869         created for the anonymous method.
1870
1871         (EmitContext.Phase): Introduce a variable and an enumeration to
1872         assist in enforcing some rules about when and where we are allowed
1873         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1874         only one that enfonces this right now).
1875
1876         (EmitContext.HaveCaptureInfo): new helper method that returns
1877         whether we have a CapturedContext initialized.
1878
1879         (EmitContext.CaptureVariable): New method used to register that a
1880         LocalInfo must be flagged for capturing. 
1881
1882         (EmitContext.CapturedParameter): New method used to register that a
1883         parameters must be flagged for capturing. 
1884         
1885         (EmitContext.CapturedField): New method used to register that a
1886         field must be flagged for capturing. 
1887
1888         (EmitContext.HaveCapturedVariables,
1889         EmitContext.HaveCapturedFields): Return whether there are captured
1890         variables or fields. 
1891
1892         (EmitContext.EmitMethodHostInstance): This is used to emit the
1893         instance for the anonymous method.  The instance might be null
1894         (static methods), this (for anonymous methods that capture nothing
1895         and happen to live side-by-side with the current method body) or a
1896         more complicated expression if the method has a CaptureContext.
1897
1898         (EmitContext.EmitTopBlock): Routine that drives the emission of
1899         code: it will first resolve the top block, then emit any metadata
1900         and then emit the code.  The split is done so that we can extract
1901         any anonymous methods and flag any captured variables/parameters.
1902         
1903         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1904         during this phase, the ILGenerator should not be used as labels
1905         and local variables declared here might not be accessible to any
1906         code that is part of an anonymous method.  
1907
1908         Exceptions to this include the temporary variables that are
1909         created by some statements internally for holding temporary
1910         variables. 
1911         
1912         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1913         metadata for a cb
1914
1915         (EmitContext.TemporaryReturn): This method is typically called
1916         from the Emit phase, and its the only place where we allow the
1917         ReturnLabel to be defined other than the EmitMeta.  The reason is
1918         that otherwise we would have to duplicate a lot of logic in the
1919         Resolve phases of various methods that today is on the Emit
1920         phase. 
1921
1922         (EmitContext.NeedReturnLabel): This no longer creates the label,
1923         as the ILGenerator is not valid during the resolve phase.
1924
1925         (EmitContext.EmitThis): Extended the knowledge in this class to
1926         work in anonymous methods in addition to iterators. 
1927
1928         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1929         code is necessary on the stack to access the instance to a local
1930         variable (the variable will be accessed as a field).
1931
1932         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1933         EmitContext.EmitAddressOfParameter): Routines to support
1934         parameters (not completed at this point). 
1935         
1936         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1937         will also remove the parameters.
1938
1939         * convert.cs (Convert): Define a `ConstantEC' which points to a
1940         null.  This is just to prefity some code that uses
1941         ImplicitStandardConversion code and do not have an EmitContext
1942         handy.
1943
1944         The idea is to flag explicitly that at that point in time, it is
1945         known that the conversion will not trigger the delegate checking
1946         code in implicit conversions (which requires a valid
1947         EmitContext). 
1948
1949         Everywhere: pass new EmitContext parameter since
1950         ImplicitStandardConversionExists now requires it to check for
1951         anonymous method conversions. 
1952
1953         (Convert.ImplicitStandardConversionExists): If the type of an
1954         expression is the anonymous_method_type, and the type is a
1955         delegate, we invoke the AnonymousMethod.Compatible method to check
1956         whether an implicit conversion is possible. 
1957
1958         (Convert.ImplicitConversionStandard): Only do implicit method
1959         group conversions if the language level is not ISO_1.
1960
1961         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1962         MethodInfo for the Invoke method.  used by Delegate and
1963         AnonymousDelegate.
1964
1965         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1966         method conversions if the target type is a delegate.
1967
1968         Removed extra debugging nops.
1969
1970         (LocalVariableReference): Turn the `local_info' into a public
1971         field. 
1972
1973         Add `prepared' field, the same hack used for FieldExprs to cope
1974         with composed assignments, as Local variables do not necessarily
1975         operate purely on the stack as they used to: they can be captured
1976         fields. 
1977
1978         Add `temp' for a temporary result, like fields.
1979
1980         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1981
1982         It now copes with Local variables that are captured and emits the
1983         proper instance variable to load it from a field in the captured
1984         case. 
1985
1986         (ParameterReference.DoResolveBase): During the resolve phase,
1987         capture parameters if we are in an anonymous method.
1988
1989         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1990         anonymous method, use the EmitContext helper routines to emit the
1991         parameter reference.
1992
1993         * iterators.cs: Set RemapToProxy to true/false during the
1994         EmitDispose class.
1995
1996         * parameters.cs (GetParameterByName): New helper method. 
1997
1998         * typemanager.cs (anonymous_method_type) a new type that
1999         represents an anonyous method.  This is always an internal type,
2000         used as a fencepost to test against the anonymous-methodness of an
2001         expression. 
2002         
2003 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
2004
2005         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
2006         561 report.
2007         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
2008
2009 2004-11-10  Martin Baulig  <martin@ximian.com>
2010
2011         * expression.cs (Invocation.BetterFunction): If two methods have
2012         equal parameter types, but only one of them is generic, the
2013         non-generic one wins.
2014         (New.DoResolve): Don't set `is_struct' to false if we're a generic
2015         instance; just use `Type.IsValueType' to determine whether
2016         something is a struct or not.
2017         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
2018         so we can be called multiple times.
2019
2020 2004-11-10  Martin Baulig  <martin@ximian.com>
2021
2022         * generic.cs (TypeParameter.DefineConstraints): New public method.
2023         (TypeParameter.CheckAccessLevel): Override this and return true.
2024         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
2025         override ResolveType() anymore.
2026         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
2027
2028 2004-11-10  Martin Baulig  <martin@ximian.com>
2029
2030         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
2031         call DeclSpace.ResolveNestedType() on it.
2032
2033 2004-11-10  Martin Baulig  <martin@ximian.com>
2034
2035         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
2036         non-null, call ParameterModifier() on it.
2037
2038 2004-11-10  Martin Baulig  <martin@ximian.com>
2039
2040         * iterators.cs
2041         (Iterators): Added `current_type' and `this_type' fields.
2042         (Iterators.DefineIterator): Create a new EmitContext and store it
2043         in `ec'; compute `this_type'.
2044
2045 2004-11-10  Martin Baulig  <martin@ximian.com>
2046
2047         * typemanager.cs
2048         (TypeManager.IsPrivateAccessible): New public method.
2049         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
2050
2051 2004-11-10  Martin Baulig  <martin@ximian.com>
2052
2053         * class.cs (TypeContainer.DefineType): Call
2054         TypeBuilder.DefineGenericParameters() before resolving the type
2055         parameters.
2056         (MethodData.parent_method): New protected field.
2057         (MethodData..ctor): Added `MethodInfo parent_method' argument.
2058         (MethodData.Define): Compute `parent_method'.
2059
2060         * decl.cs
2061         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
2062         (MemberCore.GetClsCompliantAttributeValue): Likewise.
2063         (DeclSpace.ec): New protected field; store the EmitContext here.
2064         (DeclSpace.EmitContext): New public property.
2065         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
2066         (DeclSpace.ResolveNestedType): New public method.
2067         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
2068         (DeclSpace.NestedAccessible): Added `Type tb' argument.
2069         (DeclSpace.FamilyAccessible): Likewise.
2070         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
2071         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
2072         EmitContext.
2073
2074         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
2075         field.
2076
2077         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
2078         (Enum.Emit): Don't create a new EmitContext.
2079
2080 2004-10-18  Martin Baulig  <martin@ximian.com>
2081
2082         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
2083         `Type' directly, but call ResolveType() on it.
2084         (Catch.Resolve): Likewise.
2085         (Foreach.Resolve): Likewise.
2086
2087 2004-10-18  Martin Baulig  <martin@ximian.com>
2088
2089         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
2090         `Type' directly, but call ResolveType() on it.
2091         (Probe.DoResolve): Likewise.
2092         (ArrayCreation.LookupType): Likewise.
2093         (TypeOf.DoResolve): Likewise.
2094         (SizeOf.DoResolve): Likewise.
2095
2096 2004-10-18  Raja R Harinath  <rharinath@novell.com>
2097
2098         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
2099         the ResolveType.
2100
2101 2004-10-17  John Luke  <john.luke@gmail.com>
2102
2103         * class.cs (Operator.GetSignatureForError): use CSharpName
2104
2105         * parameter.cs (Parameter.GetSignatureForError): Returns
2106         correct name even if was not defined.
2107
2108 2004-10-13  Raja R Harinath  <rharinath@novell.com>
2109
2110         Fix #65816.
2111         * class.cs (TypeContainer.EmitContext): New property.
2112         (DefineNestedTypes): Create an emitcontext for each part.
2113         (MethodCore.DoDefineParameters): Use container's emitcontext.
2114         Pass type array to InternalParameters.
2115         (MemberBase.DoDefine): Use container's emitcontext.
2116         (FieldMember.Define): Likewise.
2117         (Event.Define): Likewise.
2118         (SetMethod.GetParameterInfo): Change argument to EmitContext.
2119         Pass type array to InternalParameters.
2120         (SetIndexerMethod.GetParameterInfo): Likewise.
2121         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
2122         * delegate.cs (Define): Pass emitcontext to
2123         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
2124         array to InternalParameters.
2125         * expression.cs (ParameterReference.DoResolveBase): Pass
2126         emitcontext to GetParameterInfo.
2127         (ComposedCast.DoResolveAsTypeStep): Remove check on
2128         ec.ResolvingTypeTree.
2129         * parameter.cs (Parameter.Resolve): Change argument to
2130         EmitContext.  Use ResolveAsTypeTerminal.
2131         (Parameter.GetSignature): Change argument to EmitContext.
2132         (Parameters.ComputeSignature): Likewise.
2133         (Parameters.ComputeParameterTypes): Likewise.
2134         (Parameters.GetParameterInfo): Likewise.
2135         (Parameters.ComputeAndDefineParameterTypes): Likewise.
2136         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
2137         * support.cs (InternalParameters..ctor): Remove variant that takes
2138         a DeclSpace.
2139         * typemanager.cs (system_intptr_expr): New.
2140         (InitExpressionTypes): Initialize it.
2141
2142 2004-10-12  Chris Toshok  <toshok@ximian.com>
2143
2144         * cs-parser.jay: fix location for try_statement and catch_clause.
2145
2146 2004-10-18  Martin Baulig  <martin@ximian.com>
2147
2148         * class.cs (FieldMember.Define): Don't access the TypeExpr's
2149         `Type' directly, but call ResolveType() on it.
2150         (MemberBase.DoDefine): Likewise.
2151
2152         * expression.cs (New.DoResolve): Don't access the TypeExpr's
2153         `Type' directly, but call ResolveType() on it.
2154         (ComposedCast.DoResolveAsTypeStep): Likewise.
2155
2156         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
2157         `Type' directly, but call ResolveType() on it.
2158
2159 2004-10-17  John Luke  <john.luke@gmail.com>
2160
2161         * class.cs (Operator.GetSignatureForError): use CSharpName
2162
2163         * parameter.cs (Parameter.GetSignatureForError): Returns
2164         correct name even if was not defined.
2165
2166 2004-10-13  Raja R Harinath  <rharinath@novell.com>
2167
2168         Fix #65816.
2169         * class.cs (TypeContainer.EmitContext): New property.
2170         (DefineNestedTypes): Create an emitcontext for each part.
2171         (MethodCore.DoDefineParameters): Use container's emitcontext.
2172         Pass type array to InternalParameters.
2173         (MemberBase.DoDefine): Use container's emitcontext.
2174         (FieldMember.Define): Likewise.
2175         (Event.Define): Likewise.
2176         (SetMethod.GetParameterInfo): Change argument to EmitContext.
2177         Pass type array to InternalParameters.
2178         (SetIndexerMethod.GetParameterInfo): Likewise.
2179         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
2180         * delegate.cs (Define): Pass emitcontext to
2181         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
2182         array to InternalParameters.
2183         * expression.cs (ParameterReference.DoResolveBase): Pass
2184         emitcontext to GetParameterInfo.
2185         (ComposedCast.DoResolveAsTypeStep): Remove check on
2186         ec.ResolvingTypeTree.
2187         * parameter.cs (Parameter.Resolve): Change argument to
2188         EmitContext.  Use ResolveAsTypeTerminal.
2189         (Parameter.GetSignature): Change argument to EmitContext.
2190         (Parameters.ComputeSignature): Likewise.
2191         (Parameters.ComputeParameterTypes): Likewise.
2192         (Parameters.GetParameterInfo): Likewise.
2193         (Parameters.ComputeAndDefineParameterTypes): Likewise.
2194         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
2195         * support.cs (InternalParameters..ctor): Remove variant that takes
2196         a DeclSpace.
2197         * typemanager.cs (system_intptr_expr): New.
2198         (InitExpressionTypes): Initialize it.
2199
2200 2004-10-12  Chris Toshok  <toshok@ximian.com>
2201
2202         * cs-parser.jay: fix location for try_statement and catch_clause.
2203
2204 2004-10-07  Raja R Harinath  <rharinath@novell.com>
2205
2206         More DeclSpace.ResolveType avoidance.
2207         * decl.cs (MemberCore.InUnsafe): New property.
2208         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
2209         with newly created EmitContext.
2210         (FieldMember.Define): Likewise.
2211         * delegate.cs (Delegate.Define): Likewise.
2212         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
2213         only if normal name-lookup fails.
2214         (TypeExpr.DoResolve): Enable error-checking.
2215         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
2216         (SizeOf.DoResolve): Likewise.
2217         (ComposedCast.DoResolveAsTypeStep): Likewise.
2218         (StackAlloc.DoResolve): Likewise.
2219         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
2220         (Block.Unsafe): New property.
2221         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
2222         (Unsafe): Set 'unsafe' flag of contained block.
2223         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
2224         (Fixed.Resolve): Likewise.
2225         (Catch.Resolve): Likewise.
2226         (Using.ResolveLocalVariableDecls): Likewise.
2227         (Foreach.Resolve): Likewise.
2228
2229 2004-10-05  John Luke <john.luke@gmail.com>
2230
2231         * cs-parser.jay: add location to error CS0175
2232
2233 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
2234
2235         * ecore.cs (Expression.Constantity): Add support for turning null
2236         into a constant.
2237
2238         * const.cs (Const.Define): Allow constants to be reference types
2239         as long as the value is Null.
2240
2241 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
2242
2243         * namespace.cs (NamespaceEntry.Using): No matter which warning
2244         level is set, check if this namespace name has already been added.
2245
2246 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
2247
2248         * expression.cs: reftype [!=]= null should always use br[true,false].
2249         # 67410
2250
2251 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
2252
2253         Fix #67108
2254         * attribute.cs: Enum conversion moved to 
2255         GetAttributeArgumentExpression to be applied to the all
2256         expressions.
2257
2258 2004-10-01  Raja R Harinath  <rharinath@novell.com>
2259
2260         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
2261         * class.c (TypeContainer.DefineType): Flag error if
2262         base types aren't accessible due to access permissions.
2263         * decl.cs (DeclSpace.ResolveType): Move logic to
2264         Expression.ResolveAsTypeTerminal.
2265         (DeclSpace.ResolveTypeExpr): Thin layer over
2266         Expression.ResolveAsTypeTerminal.
2267         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
2268         Refactor code into NestedAccess.  Use it.
2269         (DeclSpace.NestedAccess): New.
2270         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
2271         argument to silence errors.  Check access permissions.
2272         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
2273         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
2274         (Cast.DoResolve): Likewise.
2275         (New.DoResolve): Likewise.
2276         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
2277         (TypeOf.DoResolve): Likewise.
2278
2279         * expression.cs (Invocation.BetterConversion): Return the Type of
2280         the better conversion.  Implement section 14.4.2.3 more faithfully.
2281         (Invocation.BetterFunction): Make boolean.  Make correspondence to
2282         section 14.4.2.2 explicit.
2283         (Invocation.OverloadResolve): Update.
2284         (Invocation): Remove is_base field.
2285         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
2286         (Invocation.Emit): Likewise.
2287
2288 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
2289
2290         * cs-parser.jay: Reverted 642 warning fix.
2291
2292 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2293
2294         Fix bug #66615
2295         * decl.cs (FindMemberWithSameName): Indexer can have more than
2296         1 argument.
2297
2298 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2299
2300         * expression.cs (LocalVariableReference.DoResolveLValue):
2301         Do not report warning 219 for out values.
2302         (EmptyExpression.Null): New member to avoid extra allocations.
2303
2304 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2305
2306         * cs-parser.jay: Fix wrong warning 642 report.
2307
2308         * cs-tokenizer.cs (CheckNextToken): New helper;
2309         Inspect next character if is same as expected.
2310
2311 2004-09-23  Martin Baulig  <martin@ximian.com>
2312
2313         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2314         (Convert.ImplicitReferenceConversionExists): Likewise.
2315
2316 2004-11-09  Raja R Harinath  <rharinath@novell.com>
2317
2318         * Makefile (DISTFILES): Comment out a few missing files.
2319
2320 2004-10-29  Raja R Harinath  <rharinath@novell.com>
2321
2322         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
2323         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
2324         (gmcs.exe): Invoke bootstrap-libs.
2325         (clean-local): Clean the net_2_0_bootstrap profile too.
2326         (PROGRAM_INSTALL_DIR): New.
2327         (install-local): Use it.
2328
2329 2004-10-13  Martin Baulig  <martin@ximian.com>
2330
2331         * generic.cs (TypeManager.InflatedConstraints): New nested class.
2332         (TypeParameter.DefineType): If we're a method type parameter and
2333         that method is overriding something, "inflate" its constraints.
2334
2335 2004-10-12  Martin Baulig  <martin@ximian.com>
2336
2337         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
2338         and have type arguments, create and resolve a ConstructedType.
2339
2340 2004-10-12  Martin Baulig  <martin@ximian.com>
2341
2342         * decl.cs (MemberCache.FindMemberToOverride): Use
2343         TypeManager.IsEqual() to compare the parameters and Type.Equals()
2344         to compare the invocationType.
2345
2346         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
2347         When comparing two type parameters, only do the signature-only
2348         comparision for method type parameters.
2349
2350 2004-10-11  Martin Baulig  <martin@ximian.com>
2351
2352         * report.cs: Don't make --fatal abort on warnings, we have
2353         -warnaserror for that.
2354
2355 2004-10-11  Martin Baulig  <martin@ximian.com>
2356
2357         * typemanager.cs
2358         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
2359         (TypeManager.IsEqual): Call ourself recursively instead of using
2360         Type.IsEqual(). 
2361
2362 2004-10-11  Martin Baulig  <martin@ximian.com>
2363
2364         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
2365         on our own type parameters, not on the ones we inherit from a containing
2366         class.
2367
2368         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
2369         the comparision.
2370
2371         * generic.cs (TypeParameter.Define): We may only be called once.
2372
2373         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
2374         instead of TypeManager.IsEqual().
2375
2376 2004-09-28  Martin Baulig  <martin@ximian.com>
2377
2378         * generic.cs
2379         (GenericConstraints.EffectiveBaseClass): New public property.
2380         (TypeParameter.GenericConstraints): New public property.
2381         (ConstructedType.CheckConstraints): Improved.
2382
2383         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
2384         (Convert.TypeParameterConversion): New private method; use this in
2385         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
2386         for all conversions related to type parameters.
2387
2388 2004-09-24  Martin Baulig  <martin@ximian.com>
2389
2390         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
2391         type parameter conversions for type parameters which are known to
2392         be reference types.
2393
2394 2004-09-24  Martin Baulig  <martin@ximian.com>
2395
2396         * generic.cs (GenericConstraints): Added `IsReferenceType' and
2397         `IsValueType' properties.
2398
2399         * support.cs (ReflectionConstraints): Use
2400         Type.GetGenericParameterConstraints() instead of the old hack.
2401
2402 2004-09-24  Martin Baulig  <martin@ximian.com>
2403
2404         * generic.cs (GenericConstraints): Moved here and made it an
2405         abstract class.
2406
2407         * support.cs (GenericConstraints): Moved to generic.cs.
2408
2409 2004-09-24  Martin Baulig  <martin@ximian.com>
2410
2411         * support.cs
2412         (ReflectionConstraints): Un-nested this class and made it public.
2413
2414         * typemanager.cs
2415         (TypeManager.GetTypeParameterConstraints): New public method.
2416         (TypeManager.HasConstructorConstraint): Use the attributes.
2417
2418 2004-09-24  Martin Baulig  <martin@ximian.com>
2419
2420         * support.cs (GenericConstraints): Replaced `HasConstructor',
2421         `IsReferenceType' and `IsValueType' with `Attributes'.
2422         (ReflectionParameters.ReflectionConstraints): Removed the Create()
2423         method and made the .ctor public.
2424
2425         * generic.cs (Constraints.Attributes): New public property.
2426         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
2427         `IsReferenceType' -> `HasReferenceTypeConstraint' and
2428         `IsValueType' -> `HasValueTypeConstraint'.
2429
2430 2004-09-23  Martin Baulig  <martin@ximian.com>
2431
2432         * generic.cs (Constraints): Reflect latest runtime changes.
2433
2434 2004-09-23  Martin Baulig  <martin@ximian.com>
2435
2436         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2437         (Convert.ImplicitReferenceConversionExists): Likewise.
2438
2439 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2440
2441         * class.cs (Operator.Define): Add error 448 and 559 report.
2442         
2443 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2444
2445         * class.cs (MemberBase.IsTypePermitted): New protected
2446         method for checking error CS0610.
2447
2448 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2449
2450         * class.cs (TypeContainer.HasExplicitLayout): New property
2451         Returns whether container has StructLayout attribute set Explicit.
2452         (FieldMember): New abstract class for consts and fields.
2453         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
2454         (Field): Reuse FieldMember.
2455
2456         * const.cs (Const): Reuse FieldMember.
2457
2458         * rootcontext.cs: EmitConstants call moved to class.
2459
2460 2004-09-22  Martin Baulig  <martin@ximian.com>
2461
2462         Marek and me just fixed one of our oldest bugs: #28562 :-)
2463
2464         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
2465
2466         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
2467         we're an EnumConstant, just return that.
2468         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
2469         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
2470         to get the value which'll actually be written into the attribute.
2471         However, we have to use GetValue() to access the attribute's value
2472         in the compiler.        
2473
2474 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2475
2476         * constant.cs (Constant.IsNegative): New abstract property
2477         IsNegative.
2478
2479         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
2480         (StackAlloc.DoResolve): Reused IsNegative.
2481
2482 2004-09-22  Martin Baulig  <martin@ximian.com>
2483
2484         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
2485         public method; like LookupTypeContainer, but also works for
2486         generic instances.
2487
2488         * report.cs (Report.SymbolRelatedToPreviousError): Use
2489         TypeManager.LookupGenericTypeContainer().       
2490
2491 2004-09-22  Martin Baulig  <martin@ximian.com>
2492
2493         Thanks to Peter Sestoft for this bug report.
2494
2495         * expression.cs (Conditional): If both the `trueExpr' and the
2496         `falseExpr' is a NullLiteral, return a NullLiteral.
2497
2498 2004-09-22  Martin Baulig  <martin@ximian.com>
2499
2500         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
2501         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
2502         for the "get_Current" call.
2503
2504 2004-09-21  Martin Baulig  <martin@ximian.com>
2505
2506         * convert.cs (Convert.ImplicitReferenceConversion): When
2507         converting to an interface type, first check whether we're
2508         converting from a reference type.
2509
2510 2004-09-14  Martin Baulig  <martin@ximian.com>
2511
2512         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2513
2514 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2515
2516         Fixed bug #61902
2517         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2518         called and is obsolete then this member suppress message
2519         when call is inside next [Obsolete] method or type.
2520
2521         * expression.cs: Use TestObsoleteMethodUsage member.
2522
2523 2004-09-14  Martin Baulig  <martin@ximian.com>
2524
2525         * genericparser.cs: Removed.
2526
2527 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2528
2529         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2530
2531 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2532
2533         * attribute.cs (Attribute.Resolve): Add error 653 report.
2534
2535         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2536         report.
2537         (Method.ApplyAttributeBuilder): Add error 685 report.
2538         (Operator.Define): Add error 564 report.
2539
2540         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2541
2542         * expression.cs (Invocation.DoResolve): Add error
2543         245 and 250 report.
2544
2545         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2546         error 674 report.
2547
2548 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2549
2550         * class.cs (ConstructorInitializer.Resolve):
2551         Wrong error number (515->516).
2552
2553 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2554
2555         * class.cs (Indexer.Define): Add error 631 report.
2556
2557 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2558
2559         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2560
2561 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2562
2563         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2564
2565 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2566
2567         * cs-parser.jay: Added error CS0241 report.
2568
2569 2004-09-10  Raja R Harinath  <rharinath@novell.com>
2570
2571         * cs-parser.jay (fixed_statement): Introduce a scope for the
2572         declaration in the 'fixed' statement.
2573
2574 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2575
2576         * cs-parser.jay: Added CS0230 error report.
2577
2578 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2579
2580         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2581
2582 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2583
2584         * expression.cs (Argument.Resolve): Added error CS0192 and
2585         CS0199 report.
2586
2587 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2588
2589         C# 2.0 #pragma warning feature
2590
2591         * cs-tokenizer.cs (PreProcessPragma): New method; 
2592         Handles #pragma directive.
2593
2594         * report.cs (WarningRegions): New class; Support
2595         class for #pragma warning directive. It tests whether
2596         warning is enabled for a given line.
2597
2598 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2599
2600         * const.cs: Add more descriptive error report, tahnks to
2601         Sebastien. 
2602
2603 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2604
2605         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2606
2607 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2608
2609         * expression.cs: Apply patch from Ben: Remove dead code from
2610         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2611         as that code just threw an exception anwyays.
2612
2613         * const.cs: Remove the call to the turnintoconstant, for details
2614         see bug: #63144
2615         
2616         * literal.cs: The type of the null-literal is the null type;  So
2617         we use a placeholder type (literal.cs:System.Null, defined here)
2618         for it.
2619
2620         * expression.cs (Conditional.DoResolve): Remove some old code that
2621         is no longer needed, conversions have been fixed.
2622
2623         (ArrayCreationExpression.DoResolve): Return false if we fail to
2624         resolve the inner expression.
2625
2626 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2627
2628         Fix test-290.cs.
2629         * cs-parser.jay (delegate_declaration): Record a delegate
2630         declaration as a type declaration.
2631         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2632
2633 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2634
2635         * parameter.cs: Do not crash if the type can not be resolved. 
2636
2637         * expression.cs: Report errors with unsafe pointers, fixes #64896
2638
2639 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2640
2641         * expression.cs: Pointer arith always needs to do a conv.i
2642         if the operand is a long. fix 65320
2643
2644 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2645
2646         Fixed cs0619-37.cs, cs0619-38.cs
2647
2648         * enum.cs (GetObsoleteAttribute): Removed.
2649
2650         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2651         on Enum member is double staged. The first is tested member
2652         and then enum.
2653
2654 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2655
2656         Fixed #56986, #63631, #65231
2657
2658         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2659         adds member to name container.
2660         (TypeContainer.AddToTypeContainer): New method, adds type to
2661         name container.
2662         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2663         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2664         AddOperator): Simplified by reusing AddToMemberContainer.
2665         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2666         instead of field.
2667         (Method.CheckForDuplications): Fixed implementation to test all
2668         possibilities.
2669         (MemberBase): Detection whether member is explicit interface
2670         implementation is now in constructor.
2671         (MemberBase.UpdateMemberName): Handles IndexerName.
2672         (Accessor): Changed to keep also location information.
2673         (AbstractPropertyEventMethod): Is derived from MemberCore.
2674         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2675         will be emited or not.
2676         (PropertyBase.AreAccessorsDuplicateImplementation):
2677         Tests whether accessors are not in collision with some method.
2678         (Operator): Is derived from MethodCore to simplify common
2679         operations.
2680
2681         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2682         must be performed.
2683         (DeclSpace.AddToContainer): Adds the member to defined_names
2684         table. It tests for duplications and enclosing name conflicts.
2685
2686         * enum.cs (EnumMember): Clean up to reuse the base structures
2687
2688 2004-09-03  Martin Baulig  <martin@ximian.com>
2689
2690         Merged latest changes into gmcs.  Please keep this comment in
2691         here, it makes it easier for me to see what changed in MCS since
2692         the last time I merged.
2693
2694 2004-09-03  Martin Baulig  <martin@ximian.com>
2695
2696         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2697         into TypeContainer, to make partial classes work again.
2698
2699 2004-09-03  Martin Baulig  <martin@ximian.com>
2700
2701         * rootcontext.cs (RootContext.V2): Removed.
2702
2703 2004-03-23  Martin Baulig  <martin@ximian.com>
2704
2705         * expression.cs (Invocation.OverloadResolve): Added `bool
2706         may_fail' argument and use it instead of the Location.IsNull() hack.
2707
2708 2004-09-09  Martin Baulig  <martin@ximian.com>
2709
2710         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
2711
2712 2004-09-09  Martin Baulig  <martin@ximian.com>
2713
2714         * generic.cs (TypeParameter.DefineType): Added support for
2715         explicit interface methods.
2716
2717 2004-09-09  Martin Baulig  <martin@ximian.com>
2718
2719         * README.Changes: New document.  Started to list important changes
2720         between MCS and GMCS here.
2721
2722 2004-09-08  Martin Baulig  <martin@ximian.com>
2723
2724         * class.cs
2725         (TypeContainer.CheckRecursiveDefinition): New protected method.
2726         (TypeContainer.DefineType): Move the CS0146 check into
2727         CheckRecursiveDefinition().     
2728
2729 2004-09-06  Martin Baulig  <martin@ximian.com>
2730
2731         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
2732         types for the constructor constraint.
2733
2734 2004-09-03  Martin Baulig  <martin@ximian.com>
2735
2736         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2737         into TypeContainer, to make partial classes work again.
2738
2739 2004-09-03  Martin Baulig  <martin@ximian.com>
2740
2741         * rootcontext.cs (RootContext.V2): Removed.
2742
2743 2004-03-23  Martin Baulig  <martin@ximian.com>
2744
2745         * expression.cs (Invocation.OverloadResolve): Added `bool
2746         may_fail' argument and use it instead of the Location.IsNull() hack.
2747
2748 2004-09-03  Martin Baulig  <martin@ximian.com>
2749
2750         Merged latest changes into gmcs.  Please keep this comment in
2751         here, it makes it easier for me to see what changed in MCS since
2752         the last time I merged.
2753
2754 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2755
2756         Fix #61128.
2757         * expression.cs (BetterConversion): Don't allow either conversion 
2758         to be null.  Remove redundant implicit conversion test when 'q ==
2759         null' -- when this function is invoked, we already know that the
2760         implicit conversion exists.
2761         (BetterFunction): Assume that 'best' is non-null.  Remove
2762         redundant reimplementation of IsApplicable when 'best' is null.
2763         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2764         number of arguments.
2765         (IsAncestralType): Extract from OverloadResolve.
2766         (OverloadResolve): Make robust to the MethodGroupExpr being
2767         unsorted.  Implement all the logic of Section 14.5.5.1, and
2768         support overloading of methods from multiple applicable types.
2769         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2770
2771         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2772         (RealError, Warning): Append type of report to related symbol.
2773
2774 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2775
2776         * enum.cs: Fixed CLS-Compliance checks for enum members.
2777         Error tests cs3008-8.cs, cs3014-8.cs
2778
2779 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2780
2781         Fixed bug #62342, #63102
2782         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2783         like ImplementMethod.
2784
2785 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2786
2787         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2788         Fixed bug #65170.
2789
2790 2004-09-02  Martin Baulig  <martin@ximian.com>
2791
2792         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2793         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2794         on the MethodBase.
2795
2796 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2797
2798         C# 2.0 Static classes implemented
2799
2800         * class.cs (TypeContainer): instance_constructors,
2801         initialized_fields, initialized_static_fields,
2802         default_constructor, base_inteface_types are protected to be
2803         accessible from StaticClass.
2804         (TypeContainer.DefineDefaultConstructor): New virtual method
2805         for custom default constructor generating
2806         (StaticClass): New class to handle "Static classes" feature.
2807
2808         * cs-parser.jay: Handle static keyword on class like instance
2809         of StaticClass.
2810
2811         * driver.cs: Added "/langversion" command line switch with two
2812         options (iso-1, default).
2813
2814 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2815
2816         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2817
2818 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2819
2820         * delegate.cs: Style.
2821
2822 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2823
2824         * delegate.cs: Add seperate instance expr field for miguel.
2825
2826 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2827
2828         * PointerArithmetic (Resolve): make sure we are not doing
2829         pointer arith on void*. Also, make sure we are resolved
2830         by not setting eclass until resolve.
2831
2832         All callers: Make sure that PointerArithmetic gets resolved.
2833
2834 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2835
2836         * ArrayCreation (LookupType): If the type does not resolve 
2837         to an array, give an error.
2838
2839 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2840
2841         * statement.cs (Try.Resolve): Fixed bug #64222
2842
2843 2004-08-27  Martin Baulig  <martin@ximian.com>
2844
2845         * class.cs
2846         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2847         crash here.     
2848
2849 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2850
2851         * ecore.cs (Constantify): Get underlying type via
2852         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2853         Windows in special cases.
2854
2855 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2856
2857         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2858         for obtaining also private methods.
2859         (GetRemoveMethod): Used GetRemoveMethod (true)
2860         for obtaining also private methods.
2861
2862 2004-09-02  Martin Baulig  <martin@ximian.com>
2863
2864         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2865         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2866         on the MethodBase.
2867
2868 2004-08-27  Martin Baulig  <martin@ximian.com>
2869
2870         * class.cs
2871         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2872         crash here.     
2873
2874 2004-08-25  Martin Baulig  <martin@ximian.com>
2875
2876         * support.cs (ReflectionParameters..ctor): If this is a generic
2877         method, retrieve and store its type parameters.
2878         (InternalParameters..ctor): Added `TypeParameter[]' argument.
2879         (ReflectionParameters.GenericConstraints): The argument specifies
2880         the type parameter, not the method parameter.
2881         (InternalParameters.GenericConstraints): Likewise.
2882
2883         * generic.cs (TypeParameter.DefineType): Correctly handle
2884         constraints wrt. generic methods in interfaces and their
2885         implementations.        
2886
2887 2004-08-24  Martin Baulig  <martin@ximian.com>
2888
2889         * generic.cs (TypeParameter.IsSubclassOf): New public method.
2890         (Constraints.IsSubclassOf): New internal method.
2891
2892         * typemanager.cs (TypeManager.FindMembers): Added special support
2893         for GenericTypeParameterBuilder's.      
2894         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
2895         type parameters.
2896
2897 2004-08-24  Martin Baulig  <martin@ximian.com>
2898
2899         * typemanager.cs
2900         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
2901         this for accessibility checks.
2902         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
2903         IsNestedFamilyAccessible.
2904         (TypeManager.IsSubclassOf): New method, do what the name actually
2905         says.   
2906
2907 2004-08-24  Martin Baulig  <martin@ximian.com>
2908
2909         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
2910         as a SimpleName, include the generic arity.
2911
2912 2004-08-24  Martin Baulig  <martin@ximian.com>
2913
2914         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2915         MethodAttributes.HideBySig for operators.
2916
2917 2004-08-23  Martin Baulig  <martin@ximian.com>
2918
2919         Back to the old error reporting system :-)
2920
2921         * report.cs (Message): Removed.
2922         (Report.MessageData, ErrorData, WarningData): Removed.
2923         (Report.Error, Warning): Back to the old system.
2924
2925 2004-08-23  Martin Baulig  <martin@ximian.com>
2926
2927         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2928
2929         * class.cs (TypeContainer.ParentContainer): New public virtual
2930         method; replaces the explicit interface implementation.
2931         (ClassPart.ParentContainer): Override.
2932
2933 2004-08-23  Martin Baulig  <martin@ximian.com>
2934
2935         * statement.cs (Switch): Added support for constant switches; see
2936         #59428 or test-285.cs.
2937
2938 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2939
2940         Fixed bug #62740.
2941         * statement.cs (GetEnumeratorFilter): Removed useless
2942         logic because C# specs is strict. GetEnumerator must be
2943         public.
2944
2945 2004-08-22  Martin Baulig  <martin@ximian.com>
2946
2947         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2948         a switch and may break, reset the barrier.  Fixes #59867.
2949
2950 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2951
2952         CLS-Compliance speed up (~5% for corlib)
2953
2954         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2955         New method. Tests container for CLS-Compliant names
2956
2957         * class.cs (TypeContainer.VerifyClsName): New method.
2958         Checks whether container name is CLS Compliant.
2959         (Constructor): Implements IMethodData.
2960
2961         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2962         low-case table for CLS Compliance test.
2963         (MemberCache.VerifyClsParameterConflict): New method.
2964         Checks method parameters for CS3006 error.
2965
2966         * enum.cs (EnumMember): Is derived from MemberCore.
2967         (Enum.VerifyClsName): Optimized for better performance.
2968
2969 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2970
2971         * report.cs: Renamed Error_T to Error and changed all
2972         references.
2973
2974 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2975
2976         * class.cs (TypeContainer.IndexerArrayList): New inner class
2977         container for indexers.
2978         (TypeContainer.DefaultIndexerName): New constant for default
2979         indexer name. Replaced all "Item" with this constant.
2980         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2981
2982         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2983         DefaultMemberAttribute constructor.
2984
2985 2004-08-05  Martin Baulig  <martin@ximian.com>
2986
2987         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2988         Fix bug #59429.
2989
2990 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2991
2992         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2993         multi platforms problem.
2994
2995         * compiler.csproj: Included shared files.
2996
2997 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2998
2999         Fix bug 60333, 55971 in the more general way
3000         * attribute.cs (Attribute.GetAttributeArgumentExpression):
3001         Added arg_type argument for constant conversion.
3002         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
3003
3004 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
3005
3006         Fix bug #59760
3007         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
3008         OperatorArrayList, MethodCoreArrayList for typecontainer
3009         containers. Changed class member types to these new types.
3010         (MethodArrayList.DefineMembers): Added test for CS0659.
3011
3012 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
3013
3014         * cfold.cs: Synchronize the folding with the code in expression.cs
3015         Binary.DoNumericPromotions for uint operands.
3016
3017         * attribute.cs: Revert patch from Raja, it introduced a regression
3018         while building Blam-1.2.1 (hard to isolate a test case).
3019
3020 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
3021
3022         Fix for #55382
3023         * class.cs:
3024         (TypeContainer.Define): Renamed to DefineContainerMembers because of
3025         name collision.
3026         (MethodCore.parent_method): New member. The method we're overriding
3027         if this is an override method.
3028         (MethodCore.CheckBase): Moved from Method class and made common.
3029         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
3030         private.
3031         (MethodCore.CheckForDuplications): New abstract method. For custom
3032         member duplication search in a container
3033         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
3034         method and its return type.
3035         (Event.conflict_symbol): New member. Symbol with same name in the
3036         parent class.
3037
3038         * decl.cs:
3039         (MemberCache.FindMemberWithSameName): New method. The method
3040         is looking for conflict with inherited symbols.
3041
3042 2004-08-04  Martin Baulig  <martin@ximian.com>
3043
3044         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
3045
3046         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
3047
3048 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3049
3050         * report.cs (Message): New enum for better error, warning reference in
3051         the code.
3052         (MessageData): New inner abstract class. It generally handles printing of
3053         error and warning messages.
3054         Removed unused Error, Warning, Message methods.
3055
3056 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3057
3058         Fix for cs0592-8.cs test
3059         * attribute.cs
3060         (Attributable.ValidAttributeTargets): Made public.
3061         (Attribute.ExplicitTarget): New member for explicit target value.
3062         (Attribute.CheckTargets): Now we translate explicit attribute
3063         target to Target here.
3064
3065 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
3066
3067         * ecore.cs (MethodGroupExpr): new IsBase property.
3068
3069         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
3070
3071         * delegate.cs (DelegateCreation): store a MethodGroupExpr
3072         rather than an instance expr.
3073
3074         (DelegateCreation.Emit): Use the method group rather than
3075         the instance expression. Also, if you have base.Foo as the
3076         method for a delegate, make sure to emit ldftn, not ldftnvirt.
3077
3078         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
3079
3080         (NewDelegate.DoResolve): Only check for the existance of Invoke
3081         if the method is going to be needed. Use MethodGroupExpr.
3082
3083         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
3084
3085         * expression.cs: For pointer arith., make sure to use
3086         the size of the type, not the size of the pointer to
3087         the type.
3088
3089 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3090
3091         Fix for #60722
3092         * class.cs (Class): Added error CS0502 test.
3093
3094 2004-08-03  John Luke  <jluke@cfl.rr.com>
3095             Raja R Harinath  <rharinath@novell.com>
3096
3097         Fix for #60997.
3098         * attribute.cs (Attribute.complained_before): New flag.
3099         (Attribute.ResolveType, Attribute.Resolve),
3100         (Attribute.DefinePInvokeMethod): Set it.
3101         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
3102         
3103 2004-08-03  Martin Baulig  <martin@ximian.com>
3104
3105         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
3106         use a user-defined operator; we still need to do numeric
3107         promotions in case one argument is a builtin type and the other
3108         one has an implicit conversion to that type.  Fixes #62322.
3109
3110 2004-08-18  Martin Baulig  <martin@ximian.com>
3111
3112         * class.cs (Method.Define): Use the correct method name when
3113         creating the MethodBuilder for a generic method.
3114
3115 2004-08-17  Martin Baulig  <martin@ximian.com>
3116
3117         * generic.cs (Constraints): Support type parameter constraints.
3118
3119 2004-08-16  Martin Baulig  <martin@ximian.com>
3120
3121         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
3122         (Token.GENERIC_DIMENSION): New token; this is returned if we
3123         encounter an unbound generic type in a typeof() expression.
3124
3125         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
3126         this token is only generated while parsing a typeof() expression.
3127         (typeof_expression): Removed the old unbound_type hack.
3128
3129         * generic.cs (TypeArguments.IsUnbound): New public property.
3130
3131         * decl.cs (MemberName): Added support for unbound types.
3132
3133 2004-08-14  Martin Baulig  <martin@ximian.com>
3134
3135         * typemanager.cs
3136         (TypeManager.IsEqualGenericInstance): New static method.
3137         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
3138         just used to check accessibility, so follow the rules of 26.1.6.        
3139
3140         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
3141         ConstructedType instead of a TypeExpression if we have type arguments.
3142
3143         * cs-parser.jay (typeof_expression): Support unbound generic types.
3144
3145         * ecore.cs (UnboundTypeExpression): New public class.
3146
3147 2004-08-12  Martin Baulig  <martin@ximian.com>
3148
3149         * typemanager.cs (TypeManager.IsNestedChildOf): Use
3150         TypeManager.IsEqual() rather than `=='.
3151
3152         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
3153         generic instances as well.
3154
3155 2004-08-12  Martin Baulig  <martin@ximian.com>
3156
3157         * expression.cs (Invocation.InferType): We can only infer method
3158         type parameters.  Fixes #62647.
3159
3160 2004-08-11  Martin Baulig  <martin@ximian.com>
3161
3162         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
3163         before resolving the base classes.
3164
3165 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
3166
3167         * Makefile: install .mdb file too.
3168
3169 2004-08-05  Martin Baulig  <martin@ximian.com>
3170
3171         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
3172         initializer, the current type is just the TypeBuilder, not the
3173         instantiated generic type.
3174         (FieldExpr.IsFieldInitializer): New public property.
3175
3176 2004-08-04  Martin Baulig  <martin@ximian.com>
3177
3178         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
3179
3180         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
3181
3182 2004-08-03  Martin Baulig  <martin@ximian.com>
3183
3184         * class.cs (MethodData.Define): If we're an explicit
3185         implementation, remove the generic arity from the type name.
3186
3187 2004-08-03  Martin Baulig  <martin@ximian.com>
3188
3189         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
3190         use a user-defined operator; we still need to do numeric
3191         promotions in case one argument is a builtin type and the other
3192         one has an implicit conversion to that type.  Fixes #62322.
3193
3194 2004-08-02  Martin Baulig  <martin@ximian.com>
3195
3196         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
3197         `TypeExpr[]' array.
3198         (TypeContainer.GetClassBases): Return the unexpanded list of
3199         interfaces; we expand them later.
3200         (TypeContainer.DefineType): After creating the TypeBuilder, call
3201         TypeManager.ExpandInterfaces() to get an expanded and resolved
3202         list of interfaces.
3203
3204         * ecore.cs (TypeExpr.GetInterfaces): Removed
3205
3206         * generics.cs (Constraints.InterfaceConstraints): Remove.
3207         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
3208         register the interface constraints.
3209
3210         * typemanager.cs
3211         (TypeManager.AddUserType): Removed the `ifaces' argument.
3212         (TypeManager.AddTypeParameter): Likewise.
3213         (TypeManager.AddUserInterface): Removed, was unused.
3214         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
3215         `TypeExpr[]' array for the interfaces.
3216         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
3217         has been defined, returns a list of the resolved interfaces types.
3218         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
3219         (TypeManager.GetExplicitInterfaces): Likewise.  
3220
3221 2004-08-02  Martin Baulig  <martin@ximian.com>
3222
3223         * expression.cs (Invocation.EmitCall): If we're invoking a method
3224         on a type parameter, use the new `Constrained' prefix opcode.
3225
3226 2004-08-02  Martin Baulig  <martin@ximian.com>
3227
3228         * statement.cs (LocalInfo.Flags): Added `IsThis'.
3229         (LocalInfo.IsThis): New public property.
3230         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
3231
3232 2004-08-01  Martin Baulig  <martin@ximian.com>
3233
3234         * class.cs (TypeContainer.GetClassBases): Don't set the default
3235         here since we may get called from GetPartialBases().
3236         (TypeContainer.DefineType): If GetClassBases() didn't return a
3237         parent, use the default one.
3238
3239 2004-07-30  Martin Baulig  <martin@ximian.com>
3240
3241         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
3242
3243         * class.cs (SourceMethod): New public class, derive from the
3244         symbol writer's ISourceMethod.
3245         (Method): Use the new symbol writer API.
3246
3247         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
3248         as argument and use the new symbol writer.
3249
3250         * location.cs
3251         (SourceFile): Implement the symbol writer's ISourceFile.
3252         (Location.SymbolDocument): Removed.
3253         (Location.SourceFile): New public property.
3254
3255         * symbolwriter.cs: Use the new symbol writer API.
3256
3257 2004-07-30  Raja R Harinath  <rharinath@novell.com>
3258
3259         * Makefile (install-local): Remove.  Functionality moved to
3260         executable.make.
3261
3262 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
3263
3264         * Makefile: Install mcs.exe.config file together with mcs.exe.
3265         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
3266         correct runtime version.
3267         
3268 2004-07-25  Martin Baulig  <martin@ximian.com>
3269
3270         * class.cs
3271         (TypeContainer.RegisterOrder): Removed, this was unused.
3272         (TypeContainer, interface_order): Removed.
3273         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
3274         TypeContainer as argument since we can also be called with a
3275         `PartialContainer' for a partial class/struct/interface.
3276         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
3277         of checking whether we're an `Interface' - we could be a
3278         `PartialContainer'.
3279         (PartialContainer.Register): Override; call
3280         AddClass()/AddStruct()/AddInterface() on our parent.
3281
3282         * cs-parser.jay (interface_member_declaration): Add things to the
3283         `current_container', not the `current_class'.
3284
3285         * rootcontext.cs (RegisterOrder): The overloaded version which
3286         takes an `Interface' was unused, removed.
3287
3288         * typemanager.cs (TypeManager.LookupInterface): Return a
3289         `TypeContainer', not an `Interface'.
3290         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
3291         contain a `PartialContainer' for an interface, so check it's
3292         `Kind' to figure out what it is.
3293
3294 2004-07-25  Martin Baulig  <martin@ximian.com>
3295
3296         * class.cs (Class.DefaultTypeAttributes): New public constant.
3297         (Struct.DefaultTypeAttributes): Likewise.
3298         (Interface.DefaultTypeAttributes): Likewise.
3299         (PartialContainer.TypeAttr): Override this and add the
3300         DefaultTypeAttributes.
3301
3302 2004-07-25  Martin Baulig  <martin@ximian.com>
3303
3304         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
3305         we can just use the `Parent' field instead.
3306
3307 2004-07-25  Martin Baulig  <martin@ximian.com>
3308
3309         * class.cs (TypeContainer.Emit): Renamed to EmitType().
3310
3311 2004-07-25  Martin Baulig  <martin@ximian.com>
3312
3313         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
3314         our parts before defining any methods.
3315         (TypeContainer.VerifyImplements): Make this virtual.
3316         (ClassPart.VerifyImplements): Override and call VerifyImplements()
3317         on our PartialContainer.
3318
3319 2004-07-25  Martin Baulig  <martin@ximian.com>
3320
3321         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
3322
3323         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
3324         argument, we can just use the `Parent' field instead.
3325
3326         * class.cs
3327         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
3328         (MemberBase.DoDefine): Likewise.
3329
3330 2004-07-24  Martin Baulig  <martin@ximian.com>
3331
3332         * decl.cs (MemberCore.Parent): New public field.
3333         (DeclSpace.Parent): Moved to MemberCore.
3334
3335         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
3336         (MemberBase.ctor): Added TypeContainer argument, pass it to our
3337         parent's .ctor.
3338         (FieldBase, Field, Operator): Likewise.
3339         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
3340         (EventField, Event): Likewise.
3341
3342 2004-07-23  Martin Baulig  <martin@ximian.com>
3343
3344         * class.cs (PartialContainer): New public class.
3345         (ClassPart): New public class.
3346         (TypeContainer): Added support for partial classes.
3347         (TypeContainer.GetClassBases): Splitted some of the functionality
3348         out into GetNormalBases() and GetPartialBases().
3349
3350         * cs-tokenizer.cs (Token.PARTIAL): New token.
3351         (Tokenizer.consume_identifier): Added some hacks to recognize
3352         `partial', but only if it's immediately followed by `class',
3353         `struct' or `interface'.
3354
3355         * cs-parser.jay: Added support for partial clases.
3356
3357 2004-07-23  Martin Baulig  <martin@ximian.com>
3358
3359         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
3360         a `DeclSpace' and also made it readonly.
3361         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
3362         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
3363         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
3364
3365         * cs-parser.jay: Pass the `current_class', not the
3366         `current_container' (at the moment, this is still the same thing)
3367         to a new Method, Property, Event, Indexer or Constructor.
3368
3369 2004-07-23  Martin Baulig  <martin@ximian.com>
3370
3371         * cs-parser.jay (CSharpParser): Added a new `current_class' field
3372         and removed the `current_interface' one.
3373         (struct_declaration, class_declaration, interface_declaration):
3374         Set `current_class' to the newly created class/struct/interface;
3375         set their `Bases' and call Register() before parsing their body.
3376
3377 2004-07-23  Martin Baulig  <martin@ximian.com>
3378
3379         * class.cs (Kind): New public enum.
3380         (TypeContainer): Made this class abstract.
3381         (TypeContainer.Kind): New public readonly field.
3382         (TypeContainer.CheckDef): New public method; moved here from
3383         cs-parser.jay.
3384         (TypeContainer.Register): New public abstract method.
3385         (TypeContainer.GetPendingImplementations): New public abstract
3386         method.
3387         (TypeContainer.GetClassBases): Removed the `is_class' and
3388         `is_iface' parameters.
3389         (TypeContainer.DefineNestedTypes): Formerly known as
3390         DoDefineType().
3391         (ClassOrStruct): Made this class abstract.
3392
3393         * tree.cs (RootTypes): New public type. 
3394
3395 2004-07-20  Martin Baulig  <martin@ximian.com>
3396
3397         * tree.cs (Tree.RecordNamespace): Removed.
3398         (Tree.Namespaces): Removed.
3399
3400         * rootcontext.cs (RootContext.IsNamespace): Removed.
3401
3402         * cs-parser.jay (namespace_declaration): Just create a new
3403         NamespaceEntry here.
3404
3405 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
3406
3407         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
3408         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
3409         entry to make sure it runs in the correct runtime version.
3410         
3411 2004-07-18  Martin Baulig  <martin@ximian.com>
3412
3413         * generic.cs (ConstructedType.CheckConstraints): Improved
3414         constraints checking.
3415
3416 2004-07-18  Martin Baulig  <martin@ximian.com>
3417
3418         * expression.cs (Invocation.BetterMethod): Call
3419         TypeManager.TypeToCoreType() on all types and removed my previous
3420         hack; we're already doig the right thing here.
3421
3422 2004-07-17  Martin Baulig  <martin@ximian.com>
3423
3424         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
3425
3426 2004-07-16  Martin Baulig  <martin@ximian.com>
3427
3428         * iterators.cs: Added generics support.
3429
3430 2004-07-16  Martin Baulig  <martin@ximian.com>
3431
3432         * iterators.cs: Rewrote this.  We're now using one single Proxy
3433         class for both the IEnumerable and the IEnumerator interface and
3434         `Iterator' derives from Class so we can use the high-level API.
3435
3436         * class.cs (TypeContainer.AddIterator): New method.
3437         (TypeContainer.DoDefineType): New protected virtual method, which
3438         is called from DefineType().
3439         (TypeContainer.DoDefineMembers): Call DefineType() and
3440         DefineMembers() on all our iterators.
3441         (TypeContainer.Emit): Call Emit() on all our iterators.
3442         (TypeContainer.CloseType): Call CloseType() on all our iterators.
3443
3444         * codegen.cs (EmitContext.CurrentIterator): New public field.
3445
3446 2004-07-15  Martin Baulig  <martin@ximian.com>
3447
3448         * typemanager.cs
3449         (TypeManager.not_supported_exception_type): New type.   
3450
3451 2004-07-14  Martin Baulig  <martin@ximian.com>
3452
3453         * typemanager.cs
3454         (TypeManager.generic_ienumerable_type): New type.
3455         (TypeManager.generic_ienumerator_type): New type.
3456
3457         * rootcontext.cs
3458         (RootContext.interfaces_first_stage): Added
3459         "System.Collections.Generic.IEnumerator`1" and
3460         "System.Collections.Generic.IEnumerable`1".     
3461
3462 2004-07-14  Martin Baulig  <martin@ximian.com>
3463
3464         * iterators.cs: Use real error numbers.
3465
3466 2004-07-14  Martin Baulig  <martin@ximian.com>
3467
3468         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
3469         requires this to be a System.Collection.IEnumerable and not a
3470         class implementing that interface.
3471         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
3472
3473 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
3474
3475         * class.cs: Fixed previous fix, it broke some error tests.
3476
3477 2004-07-12  Martin Baulig  <martin@ximian.com>
3478
3479         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
3480         Fixes #61293.
3481
3482 2004-07-14  Martin Baulig  <martin@ximian.com>
3483
3484         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
3485         an exclamation mark (!) for the generic arity to reflect the
3486         latest spec changes; ie. use "System.Collections.Generic.IList`1".
3487
3488 2004-07-13  Martin Baulig  <martin@ximian.com>
3489
3490         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
3491         specifiers being part of a type argument.
3492
3493 2004-07-13  Martin Baulig  <martin@ximian.com>
3494
3495         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
3496         name for generic types.
3497
3498 2004-07-13  Martin Baulig  <martin@ximian.com>
3499
3500         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
3501         bit to fix #60119.
3502
3503 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
3504
3505         * assign.cs (LocalTemporary): Add new argument: is_address,If
3506         `is_address' is true, then the value that we store is the address
3507         to the real value, and not the value itself.
3508         
3509         * ecore.cs (PropertyExpr): use the new local temporary
3510         stuff to allow us to handle X.Y += z (where X is a struct)
3511
3512 2004-07-08  Martin Baulig  <martin@ximian.com>
3513
3514         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
3515         not always return, just like we're doing in Using.Resolve().
3516
3517 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
3518
3519         * cs-parser.jay (fixed_statement): flag this as Pinned.
3520
3521 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
3522
3523         * typemanager.cs (TypeManager): Removed MakePinned method, this
3524         mechanism is replaced with the .NET 2.x compatible mechanism of
3525         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
3526
3527         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
3528         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
3529         `IsFixed' property which has a different meaning.
3530
3531 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3532
3533         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3534         visible from inside a nested class, not just the names of the
3535         immediately enclosing class.
3536         Fix for bug #60730.
3537
3538 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3539
3540         * expression.cs (BetterConversion): Remove buggy special-case
3541         handling of "implicit constant expression conversions".  At this
3542         point, we already know that the conversion is possible -- we're
3543         only checking to see which is better.
3544
3545 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3546
3547         * cs-parser.jay: Added error CS0210 test.
3548
3549 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3550
3551         * cs-parser.jay: Added error CS0134 test.
3552
3553 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3554
3555         Fix bug #52507
3556         * cs-parser.jay: Added error CS0145 test.
3557
3558 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3559
3560         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3561
3562 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3563         
3564         * expression.cs (StackAlloc.Resolve): The argument may not
3565         be a constant; deal with this case.
3566         
3567 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
3568
3569         * attribute.cs (IndexerName_GetIndexerName): Renamed to
3570         GetIndexerAttributeValue.
3571         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
3572
3573         * class.cs (Indexer.Define): Added error tests for CS0415,
3574         CS0609.
3575
3576 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
3577
3578         * attribute.cs (Attribute.Resolve): Keep field code in sync with
3579         property code.
3580
3581 2004-06-23  Martin Baulig  <martin@ximian.com>
3582
3583         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
3584         neither return nor throw, reset the barrier as well.  Fixes #60457.
3585
3586 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
3587
3588         * class.cs : EventAttributes is now set to None by default.
3589           This fixes bug #60459.
3590
3591 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3592
3593         Fix bug #60219
3594         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3595         Don't throw exception but return null (it's sufficient now).
3596
3597 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3598
3599         * typemanager.cs (GetArgumentTypes): Faster implementation.
3600
3601 2004-06-18  Martin Baulig  <martin@ximian.com>
3602
3603         * attribute.cs (Attribute.Resolve): Check whether we're an
3604         EmptyCast which a Constant child.  Fixes #60333.
3605
3606 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
3607
3608         * statement.cs (EmitCollectionForeach): Account for the fact that
3609         not all valuetypes are in areas which we can take the address of.
3610         For these variables, we store to a temporary variable. Also, make
3611         sure that we dont emit a `callvirt' on a valuetype method.
3612
3613 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3614
3615         * expression.cs (StackAlloc.DoReSolve): Added test for
3616         negative parameter (CS0247).
3617
3618 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3619
3620         Fix bug #59792
3621         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
3622
3623 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3624
3625         Fix bug #59781
3626         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
3627         ulong.
3628
3629 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3630
3631         Fix bug #58254 & cs1555.cs, cs1556.cs
3632         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
3633
3634 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3635
3636         * cs-parser.jay: Added error CS1669 test for indexers.
3637
3638 2004-06-18  Martin Baulig  <martin@ximian.com>
3639
3640         * generics.cs (GenericMethod.ctor): Don't take an Attributes
3641         argument.  Fixes #60441.
3642
3643 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
3644         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
3645         The name needs to have the actual name of the method in order
3646         for other tests (such as the one in OverloadResolve for Invoke
3647         on a delegate) to work. As well, it does not really help
3648         error reporting because the method group had multiple methods.
3649         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
3650         Make profiling work.
3651         
3652 2004-06-13  Martin Baulig  <martin@ximian.com>
3653
3654         * cs-parser.jay: Don't allow generic attributes.
3655
3656 2004-06-13  Martin Baulig  <martin@ximian.com>
3657
3658         * class.cs (MemberBase.DoDefineBase): New protected method.
3659         (MemberBase.DoDefine): Compute the `flags' in the new
3660         DoDefineBase() which must be called first.
3661         (Method.Define): Call DoDefineBase() first so we have the flags
3662         when defining the generic method.
3663
3664         * cs-parser.jay (interface_method_declaration): Support generic methods.
3665
3666 2004-06-13  Martin Baulig  <martin@ximian.com>
3667
3668         * decl.cs (TypeName): Removed.
3669         (MemberName): Removed TypeName and MemberNow; now we just have
3670         MemberName.
3671
3672         * cs-parser.jay: Don't distinguish between type arguments and type
3673         parameters in the grammar and simplified the rules a bit.  The
3674         reduce/reduce conflicts are now gone (except the one we inherited
3675         from mcs).
3676
3677 2004-06-11  Martin Baulig  <martin@ximian.com>
3678
3679         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
3680         call this twice: for params and varargs methods.
3681
3682 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3683
3684         * class.cs:
3685         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
3686
3687 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3688
3689         * attribute.cs (Attribute.GetValidTargets): Made public.
3690
3691         * class.cs: 
3692         (AbstractPropertyEventMethod): New class for better code sharing.
3693         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
3694         CS1667 report.
3695         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
3696
3697 2004-06-09  Martin Baulig  <martin@ximian.com>
3698
3699         * cs-parser.jay: Removed a reduce/reduce conflict.
3700
3701 2004-06-03  Martin Baulig  <martin@ximian.com>
3702
3703         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
3704         GetSimpleName() and return a SimpleName.
3705
3706         * ecore.cs (SimpleName.Arguments): New public field.
3707         (SimpleName): Added overloaded ctor which takes an additional
3708         TypeArguments argument.
3709         (SimpleName.SimpleNameResolve): Added support for generic methods.
3710         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
3711         formerly in MemberAccess.DoResolve(), but we also need it in
3712         SimpleNameResolve().
3713
3714         * expression.cs (MemberAccess.DoResolve): Use the new
3715         MethodGroupExpr.ResolveGeneric().       
3716
3717 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3718
3719         * decl.cs: If possible, use lookuptypedirect here. We can only do
3720         this if there is no `.' after the namespace. Avoids using
3721         LookupType, which does lots of slow processing.
3722         (FindNestedType) New method, does what it says :-).
3723         * namespace.cs: use LookupTypeDirect.
3724         * rootcontext.cs: use membercache, if possible.
3725         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3726
3727 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3728
3729         * expression.cs:
3730         According to the spec, 
3731
3732         In a member access of the form E.I, if E is a single identifier,
3733         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3734         field, property, localvariable, or parameter with the same type as
3735         the meaning of E as a type-name (§3.8), then both possible
3736         meanings of E are permitted.
3737
3738         We did not check that E as a simple-name had the same type as E as
3739         a type name.
3740
3741         This trivial check gives us 5-7% on bootstrap time.
3742
3743 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3744
3745         * expression.cs (Invocation.OverloadResolve): Avoid the
3746         use of hashtables and boxing here by allocating on demand.
3747
3748 2004-05-30  Martin Baulig  <martin@ximian.com>
3749
3750         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3751         we're doing a silent lookup.  Don't try to lookup nested types in
3752         TypeManager.object_type (thanks to Ben Maurer).
3753
3754 2004-05-30  Martin Baulig  <martin@ximian.com>
3755
3756         Committing a patch from Ben Maurer.
3757
3758         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3759
3760 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3761
3762         * convert.cs: add a trivial cache for overload operator resolution.
3763
3764 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
3765
3766         * attribute.cs
3767         (AttributeTester.GetObsoleteAttribute): Returns instance of
3768         ObsoleteAttribute when type is obsolete.
3769
3770         * class.cs
3771         (TypeContainer.VerifyObsoleteAttribute): Override.
3772         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3773         (MethodCode.VerifyObsoleteAttribute): Override.
3774         (MemberBase.VerifyObsoleteAttribute): Override.
3775
3776         * decl.cs
3777         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3778         and report proper error.
3779
3780         *delegate.cs
3781         (Delegate.VerifyObsoleteAttribute): Override.
3782
3783         * ecore.cs
3784         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3785         and report proper error.
3786         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3787
3788         * enum.cs
3789         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3790         and enum member.
3791
3792         * expression.cs
3793         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3794         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3795         Added test for ObsoleteAttribute.
3796
3797         * statement.cs
3798         (Catch): Derived from Statement.
3799
3800 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3801
3802         * decl.cs: If possible, use lookuptypedirect here. We can only do
3803         this if there is no `.' after the namespace. Avoids using
3804         LookupType, which does lots of slow processing.
3805         (FindNestedType) New method, does what it says :-).
3806         * namespace.cs: use LookupTypeDirect.
3807         * rootcontext.cs: use membercache, if possible.
3808         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3809
3810 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3811
3812         * expression.cs:
3813         According to the spec, 
3814
3815         In a member access of the form E.I, if E is a single identifier,
3816         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3817         field, property, localvariable, or parameter with the same type as
3818         the meaning of E as a type-name (§3.8), then both possible
3819         meanings of E are permitted.
3820
3821         We did not check that E as a simple-name had the same type as E as
3822         a type name.
3823
3824         This trivial check gives us 5-7% on bootstrap time.
3825
3826 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3827
3828         Fixed bug #59071 & cs0160.cs
3829         * statement.cs (Try.Resolve): Check here whether order of catch
3830         clauses matches their dependencies.
3831
3832 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3833
3834         Fixed bug #58624
3835         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
3836         unsafe type.
3837
3838 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3839
3840         * expression.cs (Invocation.OverloadResolve): Avoid the
3841         use of hashtables and boxing here by allocating on demand.
3842
3843 2004-05-30  Martin Baulig  <martin@ximian.com>
3844
3845         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3846         we're doing a silent lookup.  Don't try to lookup nested types in
3847         TypeManager.object_type (thanks to Ben Maurer).
3848
3849 2004-05-30  Martin Baulig  <martin@ximian.com>
3850
3851         Committing a patch from Ben Maurer.
3852
3853         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
3854
3855 2004-05-29  Martin Baulig  <martin@ximian.com>
3856
3857         * class.cs (IMethodData.ShouldIgnore): New method.
3858
3859         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3860         `Location' argument, we don't need it anywhere.  Use
3861         `IMethodData.ShouldIgnore ()' instead of
3862         `MethodData.GetMethodFlags ()'.
3863         (TypeManager.AddMethod): Removed.
3864         (TypeManager.AddMethod2): Renamed to AddMethod.
3865
3866 2004-05-29  Martin Baulig  <martin@ximian.com>
3867
3868         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3869
3870         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3871         converting from a class type S to an interface type and we already
3872         have an object on the stack, don't box it again.  Fixes #52578.
3873
3874 2004-05-29  Martin Baulig  <martin@ximian.com>
3875
3876         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3877         Added support for `params' parameters.  Fixes #59267.
3878
3879 2004-05-29  Martin Baulig  <martin@ximian.com>
3880
3881         * literal.cs (NullPointer): Provide a private .ctor which sets
3882         `type' to TypeManager.object_type.  Fixes #59048.
3883
3884 2004-05-29  Martin Baulig  <martin@ximian.com>
3885
3886         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3887         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3888
3889         * ecore.cs (EventExpr.instance_expr): Make the field private.
3890
3891 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3892
3893         Fixed bug #50080 & cs0214-2.cs
3894         * expression.cs (Cast.DoResolve): Check unsafe context here.
3895         
3896         * statement.cs (Resolve.DoResolve): Likewise.
3897
3898 2004-05-26  Martin Baulig  <martin@ximian.com>
3899
3900         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3901
3902         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3903         (RootContext.LookupType): Pass down the `silent' flag.
3904
3905 2004-05-25  Martin Baulig  <martin@ximian.com>
3906
3907         * expression.cs
3908         (MethodGroupExpr.IdenticalTypeName): New public property.
3909         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3910         expression actually refers to a type.
3911
3912 2004-05-25  Martin Baulig  <martin@ximian.com>
3913
3914         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3915         for #56176 and made it actually work.
3916
3917 2004-05-25  Martin Baulig  <martin@ximian.com>
3918
3919         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3920         (FieldExpr, PropertyExpr): Override and implement
3921         CacheTemporaries.  Fixes #52279.
3922
3923 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3924
3925         * location.cs: In the new compiler listing a file twice is a
3926         warning, not an error.
3927
3928 2004-05-24  Martin Baulig  <martin@ximian.com>
3929
3930         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3931         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3932
3933 2004-05-24  Martin Baulig  <martin@ximian.com>
3934
3935         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3936         walking the `using' list.  Fixes #53921.
3937
3938 2004-05-24  Martin Baulig  <martin@ximian.com>
3939
3940         * const.cs (Const.LookupConstantValue): Added support for
3941         EmptyCast's; fixes #55251.
3942
3943 2004-05-24  Martin Baulig  <martin@ximian.com>
3944
3945         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3946         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3947         which does the CS0135 check.  The reason is that we first need to
3948         check whether the variable actually exists.
3949
3950 2004-05-24  Martin Baulig  <martin@ximian.com>
3951
3952         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3953         than RootContext.LookupType() to find the explicit interface
3954         type.  Fixes #58584.
3955
3956 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3957
3958         * Makefile: Simplify.  Use executable.make.
3959         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3960
3961 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3962
3963         * decl.cs:
3964         * enum.cs:
3965         Use the invariant culture when doing String.Compare for CLS case
3966         sensitivity.
3967         
3968 2004-05-23  Martin Baulig  <martin@ximian.com>
3969
3970         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3971         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3972
3973         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3974
3975 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3976
3977         * class.cs (MemberBase.Define): Reuse MemberType member for 
3978         resolved type. Other methods can use it too.
3979
3980 2004-05-23  Martin Baulig  <martin@ximian.com>
3981
3982         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3983         the variable also exists in the current block (otherwise, we need
3984         to report a CS0103).  Fixes #58670.
3985
3986 2004-05-23  Martin Baulig  <martin@ximian.com>
3987
3988         * flowanalysis.cs (Reachability.Reachable): Compute this
3989         on-the-fly rather than storing it as a field.
3990
3991 2004-05-23  Martin Baulig  <martin@ximian.com>
3992
3993         * flowanalysis.cs (Reachability.And): Manually compute the
3994         resulting `barrier' from the reachability.      
3995        
3996 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3997
3998         Fix bug #57835
3999         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
4000         instance of ObsoleteAttribute when symbol is obsolete.
4001
4002         * class.cs
4003         (IMethodData): Extended interface for ObsoleteAttribute support.
4004
4005 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
4006
4007         * attribute.cs: Fix bug #55970
4008
4009 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
4010
4011         Fix bug #52705
4012         * attribute.cs
4013         (GetObsoleteAttribute): New method. Creates the instance of
4014         ObsoleteAttribute.
4015         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
4016         ObsoleteAttribute when member is obsolete.
4017         (AttributeTester.Report_ObsoleteMessage): Common method for
4018         Obsolete error/warning reporting.
4019
4020         * class.cs
4021         (TypeContainer.base_classs_type): New member for storing parent type.
4022
4023         * decl.cs
4024         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
4025         for this MemberCore.
4026
4027 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4028
4029         * attribute.cs, const.cs: Fix bug #58590
4030
4031 2004-05-21  Martin Baulig  <martin@ximian.com>
4032
4033         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
4034         out parameters if the end of the method is unreachable.  Fixes
4035         #58098. 
4036
4037 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4038
4039         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
4040         Hari was right, why extra method.
4041
4042 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4043
4044         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
4045
4046 2004-05-20  Martin Baulig  <martin@ximian.com>
4047
4048         * delegate.cs: Convert this file to Unix mode - like the original
4049         version in mcs is.
4050
4051 2004-05-20  Martin Baulig  <martin@ximian.com>
4052
4053         * attribute.cs: Convert this file to Unix mode - like the original
4054         version in mcs is.
4055
4056 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
4057
4058        Fix bug #58688 (MCS does not report error when the same attribute
4059        is assigned twice)
4060
4061        * attribute.cs (Attribute.Emit): Distinction between null and default.
4062
4063 2004-05-19  Raja R Harinath  <rharinath@novell.com>
4064
4065        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
4066        of a top-level attribute without an attribute target.
4067        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
4068        Make non-static.
4069        (Attribute.Conditional_GetConditionName), 
4070        (Attribute.Obsolete_GetObsoleteMessage): Update.
4071        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
4072        part of ScanForIndexerName.
4073        (Attribute.CanIgnoreInvalidAttribute): New function.
4074        (Attribute.ScanForIndexerName): Move to ...
4075        (Attributes.ScanForIndexerName): ... here.
4076        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
4077        (Attributes.Search): New internal variant that can choose not to
4078        complain if types aren't resolved.  The original signature now
4079        complains.
4080        (Attributes.GetClsCompliantAttribute): Use internal variant, with
4081        complaints suppressed.
4082        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
4083        only if it not useful.
4084        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
4085        top-level for attributes that are shared between the assembly
4086        and a top-level class.
4087        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
4088        * class.cs: Update to reflect changes.
4089        (DefineIndexers): Fuse loops.
4090        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
4091        a couple more variants of attribute names.
4092
4093 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
4094
4095         Fix bug #52585 (Implemented explicit attribute declaration)
4096
4097         * attribute.cs:
4098         (Attributable.ValidAttributeTargets): New abstract method. It gets
4099         list of valid attribute targets for explicit target declaration.
4100         (Attribute.Target): It holds target itself.
4101         (AttributeSection): Removed.
4102         (Attribute.CheckTargets): New method. It checks whether attribute
4103         target is valid for the current element.
4104
4105         * class.cs:
4106         (EventProperty): New class. For events that are declared like
4107         property (with add and remove accessors).
4108         (EventField): New class. For events that are declared like field.
4109         class.cs
4110
4111         * cs-parser.jay: Implemented explicit attribute target declaration.
4112
4113         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
4114         Override ValidAttributeTargets.
4115
4116         * parameter.cs:
4117         (ReturnParameter): Class for applying custom attributes on 
4118         the return type.
4119         (ParameterAtribute): New class. Class for applying custom
4120         attributes on the parameter type.
4121
4122 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
4123
4124         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
4125         definitions. 
4126
4127         (Method): Allow UNSAFE here.
4128
4129         * modifiers.cs: Support unsafe reporting.
4130
4131 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
4132
4133         * decl.cs: Fix bug #58478.
4134
4135 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4136
4137         * statement.cs: When checking for unreachable code on an EmptyStatement,
4138         set the location. Fixes bug #58488.
4139
4140 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
4141
4142         * driver.cs: Add -pkg handling.
4143
4144         From Gonzalo: UseShelLExecute=false
4145
4146 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
4147
4148         * attribute.cs:
4149         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
4150         for attribute.
4151         (Attribute.IsClsCompliaceRequired): Moved to base for better
4152         accesibility.
4153         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
4154         when attribute is AttributeUsageAttribute.
4155         (Attribute.GetValidTargets): Simplified.
4156         (Attribute.GetAttributeUsage): New method returns AttributeUsage
4157         attribute for this type.
4158         (Attribute.ApplyAttributes): Method renamed to Emit and make
4159         non-static.
4160         (GlobalAttributeSection): New class for special handling of global
4161         attributes (assembly, module).
4162         (AttributeSection.Emit): New method.
4163
4164         * class.cs: Implemented Attributable abstract methods.
4165         (MethodCore.LabelParameters): Moved to Parameter class.
4166         (Accessor): Is back simple class.
4167         (PropertyMethod): Implemented Attributable abstract class.
4168         (DelegateMethod): Implemented Attributable abstract class.
4169         (Event): New constructor for disctintion between normal Event
4170         and Event with accessors.
4171
4172         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
4173
4174         * codegen.cs, const.cs, decl.cs, delegate.cs:
4175         (CommonAssemblyModulClass): Implemented Attributable abstract class
4176         and simplified.
4177
4178         * enum.cs: Implement IAttributeSupport interface.
4179         (EnumMember): New class for emum members. Implemented Attributable
4180         abstract class
4181
4182         * parameter.cs:
4183         (ParameterBase): Is abstract.
4184         (ReturnParameter): New class for easier [return:] attribute handling.
4185
4186         * typemanager.cs: Removed builder_to_attr.
4187
4188 2004-05-11  Raja R Harinath  <rharinath@novell.com>
4189
4190         Fix bug #57151.
4191         * attribute.cs (Attribute.GetPositionalValue): New function.
4192         * class.cs (TypeContainer.VerifyMembers): New function.
4193         (TypeContainer.Emit): Use it.
4194         (ClassOrStruct): New base class for Class and Struct.
4195         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
4196         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
4197         class.
4198         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
4199         then each non-static field should have a FieldOffset attribute.
4200         Otherwise, none of the fields should have a FieldOffset attribute.
4201         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
4202         and FieldOffset attributes.
4203         * typemanager.cs (TypeManager.struct_layout_attribute_type)
4204         (TypeManager.field_offset_attribute_type): New core types.
4205         (TypeManager.InitCoreTypes): Initialize them.
4206
4207 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
4208
4209         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
4210         Return correct type.
4211         From bug #58270.
4212
4213 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
4214
4215         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
4216         be implicitly converted to ulong.
4217         
4218         * expression.cs: The logic for allowing operator &, | and ^ worked
4219         was wrong, it worked before because we did not report an error in
4220         an else branch.  Fixes 57895.
4221
4222         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
4223         allow volatile fields to be reference types.
4224
4225 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
4226
4227         * driver.cs: Add support for /debug-
4228
4229 2004-05-07  Raja R Harinath  <rharinath@novell.com>
4230
4231         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
4232         Add a 'complain' parameter to silence errors.
4233         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
4234         silently overlooked type-resolutions.
4235         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
4236         to reflect changes.
4237         (Attributes.Search): New function.
4238         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
4239         (Attributes.GetAttributeFullName): Remove hack.
4240         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
4241         Update to reflect changes.
4242         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
4243         Use Attributes.Search instead of nested loops.
4244
4245 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
4246
4247         * decl.cs:
4248         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
4249         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
4250         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
4251
4252         * report.cs: (Report.Warning): Renamed to Warning_T because of
4253         parameter collision.
4254
4255 2004-05-05  Raja R Harinath  <rharinath@novell.com>
4256
4257         * expression.cs (MemberAccess.ResolveMemberAccess):
4258         Exit with non-zero status after Report.Error.
4259         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
4260         Likewise.
4261         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
4262
4263 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4264
4265         * support.cs: Don't hang when the file is empty.
4266
4267 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4268
4269         * support.cs: In SeekableStreamReader, compute the preamble size of the
4270           underlying stream. Position changes should take into account that initial
4271           count of bytes.
4272
4273 2004-05-03  Todd Berman  <tberman@sevenl.net>
4274
4275         * driver.cs: remove unused GetSysVersion function.
4276
4277 2004-05-03  Todd Berman  <tberman@sevenl.net>
4278
4279         * driver.cs: Remove the hack from saturday, as well as the hack
4280         from jackson (LoadAssemblyFromGac), also adds the CWD to the
4281         link_paths to get that bit proper.
4282
4283 2004-05-01  Todd Berman  <tberman@sevenl.net>
4284
4285         * driver.cs: Try a LoadFrom before a Load, this checks the current
4286         path. This is currently a bug in mono that is be fixed, however, this
4287         provides a workaround for now. This will be removed when the bug
4288         is fixed.
4289
4290 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
4291
4292         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4293         incomplete key pairs (#57941).
4294
4295 2004-05-01  Todd Berman  <tberman@sevenl.net>
4296
4297         * driver.cs: Remove '.' from path_chars, now System.* loads properly
4298         from the GAC
4299
4300 2004-04-30  Jackson Harper  <jackson@ximian.com>
4301
4302         * codegen.cs: Open keys readonly.
4303         
4304 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4305
4306         * typemanager.cs: don't report cyclic struct layout when a struct
4307         contains 2 or more fields of the same type. Failed for Pango.AttrShape
4308         which has 2 Pango.Rectangle fields.
4309
4310 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4311
4312         * expression.cs: Handle IntPtr comparisons with IL code
4313         rather than a method call.
4314
4315 2004-04-29  Martin Baulig  <martin@ximian.com>
4316
4317         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
4318         the list of PropertyInfo's in class hierarchy and find the
4319         accessor.  Fixes #56013.
4320
4321 2004-04-29  Martin Baulig  <martin@ximian.com>
4322
4323         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
4324
4325 2004-04-29  Martin Baulig  <martin@ximian.com>
4326
4327         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4328
4329         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
4330
4331 2004-04-29  Martin Baulig  <martin@ximian.com>
4332
4333         * class.cs (ConstructorInitializer.Resolve): Check whether the
4334         parent .ctor is accessible.  Fixes #52146.
4335
4336 2004-04-29  Martin Baulig  <martin@ximian.com>
4337
4338         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4339
4340         * statement.cs (Using.EmitLocalVariableDecls): Use
4341         TypeManager.idisposable_type, not typeof (IDisposable).
4342         (Foreach.EmitCollectionForeach): Added support for valuetypes.
4343
4344 2004-04-29  Martin Baulig  <martin@ximian.com>
4345
4346         * class.cs (Event.Define): Don't emit the field and don't set
4347         RTSpecialName and SpecialName for events on interfaces.  Fixes
4348         #57703. 
4349
4350 2004-04-29  Raja R Harinath  <rharinath@novell.com>
4351
4352         Refactor Attribute.ApplyAttributes.
4353         * attribute.cs (Attributable): New base class for objects that can
4354         have Attributes applied on them.
4355         (Attribute): Make AttributeUsage fields public.
4356         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
4357         (Attribute.IsInternalCall): New property.
4358         (Attribute.UsageAttr): Convert to a public read-only property.
4359         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
4360         (Attribute.ResolveType, Attribute.Resolve)
4361         (Attribute.ScanForIndexerName): Update to reflect changes.
4362         (Attribute.CheckAttributeTarget): Re-format.
4363         (Attribute.ApplyAttributes): Refactor, to various
4364         Attributable.ApplyAttributeBuilder methods.
4365         * decl.cs (MemberCore): Make Attributable.
4366         * class.cs (Accessor): Make Attributable.
4367         (MethodData.ApplyAttributes): Use proper attribute types, not
4368         attribute names.
4369         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
4370         (TypeContainer.ApplyAttributeBuilder)
4371         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
4372         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
4373         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
4374         (Operator.ApplyAttributeBuilder): New factored-out methods.
4375         * const.cs (Const.ApplyAttributeBuilder): Likewise.
4376         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
4377         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
4378         * parameter.cs (ParameterBase): New Attributable base class
4379         that can also represent Return types.
4380         (Parameter): Update to the changes.
4381
4382 2004-04-29  Jackson Harper  <jackson@ximian.com>
4383
4384         * driver.cs: Prefer the corlib system version when looking for
4385         assemblies in the GAC. This is still a hack, but its a better hack
4386         now.
4387         
4388 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
4389
4390         * decl.cs, enum.cs: Improved error 3005 reporting.
4391   
4392         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
4393         (related_symbols): New private member for list of symbols
4394         related to reported error/warning.
4395         
4396         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
4397
4398 2004-04-29  Martin Baulig  <martin@ximian.com>
4399
4400         * ecore.cs (Expression.Constantify): If we're an enum and
4401         TypeManager.TypeToCoreType() doesn't give us another type, use
4402         t.UnderlyingSystemType.  Fixes #56178.  
4403
4404 2004-04-29  Martin Baulig  <martin@ximian.com>
4405
4406         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
4407         interfaces and for each interface, only add members directly
4408         declared in that interface.  Fixes #53255.
4409
4410 2004-04-28  Martin Baulig  <martin@ximian.com>
4411
4412         * expression.cs (ConditionalLogicalOperator): Use a temporary
4413         variable for `left' to avoid that we evaluate it more than once;
4414         bug #52588.
4415
4416 2004-04-28  Martin Baulig  <martin@ximian.com>
4417
4418         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
4419         `void[]' (CS1547).
4420
4421 2004-04-28  Martin Baulig  <martin@ximian.com>
4422
4423         * statement.cs (LocalInfo.Resolve): Check whether the type is not
4424         void (CS1547).
4425
4426         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
4427         whether the type is not void (CS1547).
4428
4429 2004-04-28  Martin Baulig  <martin@ximian.com>
4430
4431         * expression.cs (Unary.DoResolveLValue): Override this and report
4432         CS0131 for anything but Operator.Indirection.
4433
4434 2004-04-28  Martin Baulig  <martin@ximian.com>
4435
4436         Committing a patch from Ben Maurer; see bug #50820.
4437
4438         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4439         check for classes.
4440
4441         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4442         classes.        
4443
4444 2004-04-28  Martin Baulig  <martin@ximian.com>
4445
4446         Committing a patch from Ben Maurer; see bug #50820.
4447
4448         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4449         check for classes.
4450
4451         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4452         classes.        
4453
4454 2004-04-28  Martin Baulig  <martin@ximian.com>
4455
4456         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
4457         (Block.AddLabel): Call DoLookupLabel() to only search in the
4458         current block.
4459
4460 2004-04-28  Martin Baulig  <martin@ximian.com>
4461
4462         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4463         comparing StringConstants and NullLiterals in Equality and Inequality.
4464
4465 2004-04-28  Jackson Harper  <jackson@ximian.com>
4466
4467         * driver.cs: Attempt to load referenced assemblies from the
4468         GAC. This is the quick and dirty version of this method that
4469         doesnt take into account versions and just takes the first
4470         canidate found. Will be good enough for now as we will not have more
4471         then one version installed into the GAC until I update this method.
4472
4473 2004-04-28  Martin Baulig  <martin@ximian.com>
4474
4475         * typemanager.cs (TypeManager.CheckStructCycles): New public
4476         static method to check for cycles in the struct layout.
4477
4478         * rootcontext.cs (RootContext.PopulateTypes): Call
4479         TypeManager.CheckStructCycles() for each TypeContainer.
4480         [Note: We only need to visit each type once.]
4481
4482 2004-04-28  Martin Baulig  <martin@ximian.com>
4483
4484         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4485
4486         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4487         success and added `out object value'.  Use a `bool resolved' field
4488         to check whether we've already been called rather than
4489         `ConstantValue != null' since this breaks for NullLiterals.
4490
4491 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4492
4493         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4494         setting of this flag, since the 'set' method may be non-public.
4495
4496 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4497
4498         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4499         check on current_vector.Block.
4500
4501 2004-04-27  Martin Baulig  <martin@ximian.com>
4502
4503         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4504         a field initializer.  Fixes #56459.
4505
4506 2004-04-27  Martin Baulig  <martin@ximian.com>
4507
4508         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4509         we're not attempting to use an indexer.  Fixes #52154.
4510
4511 2004-04-27  Martin Baulig  <martin@ximian.com>
4512
4513         * statement.cs (Return): Don't create a return label if we don't
4514         need it; reverts my change from January 20th.  Thanks to Ben
4515         Maurer for this.
4516
4517 2004-04-27  Martin Baulig  <martin@ximian.com>
4518
4519         According to the spec, `goto' can only leave a nested scope, but
4520         never enter it.
4521
4522         * statement.cs (Block.LookupLabel): Only lookup in the current
4523         block, don't recurse into parent or child blocks.
4524         (Block.AddLabel): Check in parent and child blocks, report
4525         CS0140/CS0158 if we find a duplicate.
4526         (Block): Removed this indexer for label lookups.
4527         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4528         this already does the error reporting for us.
4529
4530         * flowanalysis.cs
4531         (FlowBranching.UsageVector.Block): New public variable; may be null.
4532         (FlowBranching.CreateSibling): Added `Block' argument.
4533         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4534         label for the target of a `goto' and check whether we're not
4535         leaving a `finally'.
4536
4537 2004-04-27  Martin Baulig  <martin@ximian.com>
4538
4539         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4540         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4541         just for returns).
4542
4543 2004-04-27  Martin Baulig  <martin@ximian.com>
4544
4545         * statement.cs (Block.AddLabel): Also check for implicit blocks
4546         and added a CS0158 check.
4547
4548 2004-04-27  Martin Baulig  <martin@ximian.com>
4549
4550         * flowanalysis.cs (FlowBranchingLoop): New class.
4551         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4552         UsageVector's instead of an ArrayList.
4553         (FlowBranching.Label): Likewise.
4554         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4555         (FlowBranching.AddBreakVector): New method.
4556
4557 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4558
4559         * attribute.cs: Small regression fix: only convert the type if we
4560         the type is different, fixes System.Drawing build.
4561
4562 2004-04-27  Martin Baulig  <martin@ximian.com>
4563
4564         * attribute.cs (Attribute.Resolve): If we have a constant value
4565         for a named field or property, implicity convert it to the correct
4566         type.
4567
4568 2004-04-27  Raja R Harinath  <rharinath@novell.com>
4569
4570         * statement.cs (Block.Block): Implicit blocks share
4571         'child_variable_names' fields with parent blocks.
4572         (Block.AddChildVariableNames): Remove.
4573         (Block.AddVariable): Mark variable as "used by a child block" in
4574         every surrounding block.
4575         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
4576         been used in a child block, complain about violation of "Invariant
4577         meaning in blocks" rule.
4578         * cs-parser.jay (declare_local_variables): Don't use
4579         AddChildVariableNames.
4580         (foreach_statement): Don't create an implicit block: 'foreach'
4581         introduces a scope.
4582
4583 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
4584
4585         * convert.cs (ImplicitNumericConversion): 0 is also positive when
4586         converting from 0L to ulong.  Fixes 57522.
4587
4588 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4589
4590         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
4591         derived class hides via 'new' keyword field from base class (test-242.cs).
4592         TODO: Handle this in the more general way.
4593         
4594         * class.cs (CheckBase): Ditto.
4595
4596 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4597
4598         * decl.cs (caching_flags): New member for storing cached values
4599         as bit flags.
4600         (MemberCore.Flags): New enum where bit flags for caching_flags
4601         are defined.
4602         (MemberCore.cls_compliance): Moved to caching_flags.
4603         (DeclSpace.Created): Moved to caching_flags.
4604
4605         * class.cs: Use caching_flags instead of DeclSpace.Created
4606         
4607 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
4608
4609         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
4610         if we are only a derived class, not a nested class.
4611
4612         * typemanager.cs: Same as above, but do this at the MemberLookup
4613         level (used by field and methods, properties are handled in
4614         PropertyExpr).   Allow for the qualified access if we are a nested
4615         method. 
4616
4617 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
4618
4619         * class.cs: Refactoring.
4620         (IMethodData): New inteface; Holds links to parent members
4621         to avoid member duplication (reduced memory allocation).
4622         (Method): Implemented IMethodData interface.
4623         (PropertyBase): New inner classes for get/set methods.
4624         (PropertyBase.PropertyMethod): Implemented IMethodData interface
4625         (Event): New inner classes for add/remove methods.
4626         (Event.DelegateMethod): Implemented IMethodData interface.
4627
4628         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
4629         EmitContext (related to class.cs refactoring).
4630
4631 2004-04-21  Raja R Harinath  <rharinath@novell.com>
4632
4633         * delegate.cs (Delegate.VerifyApplicability): If the number of
4634         arguments are the same as the number of parameters, first try to
4635         verify applicability ignoring  any 'params' modifier on the last
4636         parameter.
4637         Fixes #56442.
4638
4639 2004-04-08  Martin Baulig  <martin@ximian.com>
4640
4641         Merged latest changes into gmcs.  Please keep this comment in
4642         here, it makes it easier for me to see what changed in MCS since
4643         the last time I merged.
4644
4645 2004-04-16  Raja R Harinath  <rharinath@novell.com>
4646
4647         * class.cs (TypeContainer.AddIndexer): Use
4648         'ExplicitInterfaceName' to determine if interface name was
4649         explicitly specified.  'InterfaceType' is not initialized at this time.
4650         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
4651         Indexers array is already in the required order.  Initialize
4652         'IndexerName' only if there are normal indexers.
4653         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
4654         (TypeContainer.Emit): Emit DefaultMember attribute only if
4655         IndexerName is initialized.
4656         Fixes #56300.
4657
4658 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
4659
4660         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
4661         Fixes #57007
4662
4663 2004-04-15  Raja R Harinath  <rharinath@novell.com>
4664
4665         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
4666         attributes.
4667         Fix for #56456.
4668
4669         * attribute.cs (Attribute.Resolve): Check for duplicate named
4670         attributes.
4671         Fix for #56463.
4672
4673 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
4674
4675         * iterators.cs (MarkYield): track whether we are in an exception,
4676         and generate code accordingly.  Use a temporary value to store the
4677         result for our state.
4678
4679         I had ignored a bit the interaction of try/catch with iterators
4680         since their behavior was not entirely obvious, but now it is
4681         possible to verify that our behavior is the same as MS .NET 2.0
4682
4683         Fixes 54814
4684
4685 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4686
4687         * iterators.cs: Avoid creating temporaries if there is no work to
4688         do. 
4689
4690         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4691         Enumerations, use TypeManager.EnumToUnderlying and call
4692         recursively. 
4693
4694         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4695         bug #57013
4696
4697         (This.Emit): Use EmitContext.EmitThis to emit our
4698         instance variable.
4699
4700         (This.EmitAssign): Ditto.
4701
4702         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4703         codepaths, we will move all the functionality into
4704         Mono.CSharp.This 
4705
4706         (FieldExpr.EmitAssign): Ditto.
4707
4708         This fixes several hidden bugs that I uncovered while doing a code
4709         review of this today.
4710
4711         * codegen.cs (EmitThis): reworked so the semantics are more clear
4712         and also support value types "this" instances.
4713
4714         * iterators.cs: Changed so that for iterators in value types, we
4715         do not pass the value type as a parameter.  
4716
4717         Initialization of the enumerator helpers is now done in the caller
4718         instead of passing the parameters to the constructors and having
4719         the constructor set the fields.
4720
4721         The fields have now `assembly' visibility instead of private.
4722
4723 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4724
4725         * expression.cs (Argument.Resolve): Check if fields passed as ref
4726         or out are contained in a MarshalByRefObject.
4727
4728         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4729         another compiler type.
4730
4731 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4732
4733         * class.cs (Indexer.Define): use the new name checking method.
4734         Also, return false on an error.
4735         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4736         (is_identifier_[start/part]_character): make static.
4737
4738 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4739
4740         * expression.cs (Binary.ResolveOperator): Do no append strings
4741         twice: since we can be invoked more than once (array evaluation)
4742         on the same concatenation, take care of this here.  Based on a fix
4743         from Ben (bug #56454)
4744
4745 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4746
4747         * codegen.cs: Fix another case where CS1548 must be reported (when 
4748         delay-sign isn't specified and no private is available #56564). Fix
4749         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4750         error when MCS is used on the MS runtime and we need to delay-sign 
4751         (which seems unsupported by AssemblyBuilder - see #56621).
4752
4753 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4754
4755         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4756         (TypeManager.ComputeNamespaces): Faster implementation for
4757         Microsoft runtime.
4758
4759         * compiler.csproj: Updated AssemblyName to mcs.
4760
4761 2004-05-11  Jackson Harper  <jackson@ximian.com>
4762
4763         * Makefile: Preserve MONO_PATH
4764         
4765 2004-05-11  Jackson Harper  <jackson@ximian.com>
4766
4767         * Makefile: Use mono and mcs to build gmcs
4768         
4769 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
4770
4771         * codegen.cs: Add patch from Robert Shade
4772         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
4773         sync with mcs.
4774
4775 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
4776
4777         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4778         incomplete key pairs (#57941).
4779
4780 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4781
4782         * codegen.cs: Fix another case where CS1548 must be reported (when 
4783         delay-sign isn't specified and no private is available #56564). Fix
4784         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4785         error when MCS is used on the MS runtime and we need to delay-sign 
4786         (which seems unsupported by AssemblyBuilder - see #56621).
4787
4788 2004-04-29  Jackson Harper  <jackson@ximian.com>
4789
4790         * Makefile: Set MONO_PATH to use the bootstrap corlib
4791         * driver.cs: Check the GAC for referenced assemblies.
4792                 
4793 2004-04-29  Martin Baulig  <martin@ximian.com>
4794
4795         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
4796
4797 2004-04-07  Martin Baulig  <martin@ximian.com>
4798
4799         * expression.cs (Binary.ResolveOperator): Added special case for
4800         Equality/Inequality between a type parameter and a null literal.
4801
4802 2004-04-07  Martin Baulig  <martin@ximian.com>
4803
4804         * convert.cs: Check null literal -> type parameter conversions.
4805
4806 2004-04-07  Martin Baulig  <martin@ximian.com>
4807
4808         * generic.cs (ConstructedType.CheckConstraints): Enforce the
4809         `class' and `struct' constraints.
4810
4811 2004-04-07  Martin Baulig  <martin@ximian.com>
4812
4813         * generic.cs (SpecialConstraint): New public enum.
4814         (Constraints.Resolve): Added support for the `class' and `struct'
4815         constraints.
4816
4817         * cs-parser.jay (type_parameter_constraint): Added support for the
4818         `class' and `struct' constraints.
4819
4820 2004-04-07  Martin Baulig  <martin@ximian.com>
4821
4822         * support.cs (GenericConstraints): Replaced `Types' by
4823         `ClassConstraint' and `InterfaceConstraints'; added
4824         `HasClassConstraint'.   
4825
4826 2004-04-07  Martin Baulig  <martin@ximian.com>
4827
4828         * generic.cs
4829         (Constraints.InterfaceConstraints): New public property.
4830         (Constraints.Types): Make this property public
4831         (TypeParameter): Implement IMemberContainer.
4832         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
4833         instead of a TypeBuilder/MethodBuilder; pass the interface
4834         constraints to TypeManager.AddTypeParameter().
4835         (TypeParameter.DefineType): Just take an EmitContext and no
4836         TypeBuilder/MethodBuilder.  Use the new public API.
4837
4838         * typemanager.cs (TypeManager.AddTypeParameter): Added
4839         `TypeExpr[]' argument; add the interfaces to the
4840         `builder_to_ifaces' hash.
4841         (TypeManager.LookupMemberContainer): For
4842         GenericTypeParameterBuilders, get the TypeParameter from the
4843         `builder_to_type_param'.
4844         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
4845         the TypeParameter and call FindMembers on it.
4846
4847 2004-04-07  Martin Baulig  <martin@ximian.com>
4848
4849         * class.cs
4850         (MethodCore.GenericMethod): Moved this field here from Method.
4851         (MethodCore.IsDuplicateImplementation): Take the number of type
4852         parameters into account if we're a generic method.
4853
4854         * expression.cs (Invocation.InferTypeArguments): Don't return true
4855         if `arguments' is null; we still need to check whether we actually
4856         don't need to infer anything in this case.
4857         (MemberAccess): Merged the functionality from GenericMemberAccess
4858         into this class.
4859
4860         * generic.cs (GenericMemberAccess): Removed.
4861
4862 2004-04-05  Martin Baulig  <martin@ximian.com>
4863
4864         * decl.cs (MemberCore): For generic classes, interfaces and
4865         structs, `Name' now includes the number of type parameters
4866         ("Stack!1.Node!1").
4867         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
4868         encode the number of type arguments in the type name.
4869
4870         * expression.cs (Expression.MemberLookup): Removed the
4871         `num_type_args' argument; we now encode the number of type
4872         arguments in the type name.
4873
4874         * ecore.cs (SimpleName): Encode the number of type arguments in
4875         the type name itself.
4876
4877         * generic.cs (ConstructedType): Likewise.
4878
4879         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
4880         `MemberName'; we now include the number of type parameters in the
4881         type name.
4882
4883         * typemanager.cs (TypeManager.CheckGeneric): Removed.
4884         (TypeManager.MemberLookup): Removed the
4885         `num_type_args' argument; we now encode the number of type
4886         arguments in the type name.     
4887
4888 2004-04-03  Martin Baulig  <martin@ximian.com>
4889
4890         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
4891         (MemberCore.MemberName): Moved here from MemberBase.
4892         (DeclSpace.SetParameterInfo): Just take the constraints as an
4893         ArrayList; we already have the type parameters in our
4894         `MemberName'; also do the CS0080 reporting here.
4895
4896         * cs-parser.jay (struct_declaration): Use `member_name' instead of
4897         `IDENTIFIER opt_type_parameter_list'; when constructing our
4898         `MemberName', it'll already include our type parameters.
4899         (class_declaration, interface_declaration): Likewise.
4900         (delegate_declaration): Likewise.
4901         (MakeName): Take a MemberName and return a MemberName.
4902         The following two changes are required to avoid shift/reduce conflicts:
4903         (member_name): Don't include a TypeName anymore; ie. this is now
4904         just 'IDENTIFIER opt_type_parameter_list'.
4905         (property_declaration, event_declaration): Use a
4906         `namespace_or_type_name' instead of a `member_name'.            
4907
4908 2004-04-03  Martin Baulig  <martin@ximian.com>
4909
4910         * decl.cs (MemberName): Renamed to `TypeName' and created a new
4911         `MemberName' class.
4912         (TypeName): Formerly known as MemberName.
4913
4914         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
4915         instead of a `MemberName'.
4916
4917         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
4918         (member_name): New rule; create a MemberName.
4919
4920 2004-04-02  Martin Baulig  <martin@ximian.com>
4921
4922         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
4923         (CS0305 and CS0308).
4924
4925 2004-04-02  Martin Baulig  <martin@ximian.com>
4926
4927         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
4928         support for nested types.
4929
4930 2004-04-02  Martin Baulig  <martin@ximian.com>
4931
4932         * ecore.cs (IAlias): New public interface.
4933         (TypeExpr, TypeExpression): Implement IAlias.
4934         (TypeAliasExpression): New public class.
4935
4936         * namespace.cs (Namespace): Implement IAlias.
4937         (Namespace.Lookup): Return an IAlias instead on an object.
4938         (Namespace.DefineName): Take an IAlias instead of an object.
4939         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
4940         an object.
4941         (NamespaceEntry.UsingAlias): Take a Membername instead of an
4942         Expression.
4943         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
4944         object.
4945         (NamespaceEntry.Lookup): Likewise.
4946
4947         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
4948         instead of a Type.      
4949
4950         * decl.cs (DeclSpace): Implement IAlias.
4951         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
4952
4953         * generic.cs (ConstructedType): Improved error checking.
4954
4955 2004-04-02  Martin Baulig  <martin@ximian.com>
4956
4957         * convert.cs: Added type parameter conversions.
4958
4959         * ecore.cs
4960         (UnboxCast.Emit): Emit an `unbox.any' for type params.
4961         (ClassCast.Emit): If the source type is a type parameter, box it.
4962         If the target type is a type parameter, emit an `unbox.any'
4963         instead of a `classcast'.1      
4964
4965 2004-04-01  Martin Baulig  <martin@ximian.com>
4966
4967         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
4968
4969 2004-04-01  Martin Baulig  <martin@ximian.com>
4970
4971         * generic.cs (ConstructedType.CheckConstraints): Use
4972         Convert.ImplicitStandardConversionExists(); user-defined implicit
4973         conversions are not allowed according to the spec.
4974
4975 2004-03-30  Martin Baulig  <martin@ximian.com>
4976
4977         * expression.cs (New): Added support for type parameters.
4978
4979         * typemanager.cs
4980         (TypeManager.activator_type): New public static field.
4981         (TypeManager.activator_create_instance): Likewise.
4982
4983 2004-03-30  Martin Baulig  <martin@ximian.com>
4984
4985         * typemanager.cs (TypeManager.HasConstructorConstraint): New
4986         public method.
4987
4988 2004-03-30  Martin Baulig  <martin@ximian.com>
4989
4990         * generic.cs (ConstructedType.CheckConstraints): Actually follow
4991         the spec here: the argument type must be convertible to the
4992         constraints.
4993
4994 2004-03-30  Martin Baulig  <martin@ximian.com>
4995
4996         * generic.cs
4997         (TypeParameter.Define, TypeParameter.DefineMethod): Call
4998         TypeManager.AddTypeParameter().
4999         (ConstructedType.CheckConstraints): Re-enable this and actually
5000         check whether we have a constructor constraint.
5001
5002         * typemanager.cs
5003         (TypeManager.builder_to_type_param): New static field.
5004         (TypeManager.AddTypeParameter): New static method.
5005         (TypeManager.LookupTypeParameter): New public method.
5006
5007 2004-03-30  Martin Baulig  <martin@ximian.com>
5008
5009         * generic.cs (TypeParameter.DefineType): Return a boolean and use
5010         the new API to actually define the constructor constraint.
5011
5012         * typemanager.cs
5013         (TypeManager.new_constraint_attr_type): New static field.
5014         (TypeManager.InitCoreTypes): Initialize it.
5015
5016 2004-03-30  Martin Baulig  <martin@ximian.com>
5017
5018         * generic.cs (Constraints): Completed error checking, use correct
5019         error numbers.
5020
5021 2004-03-29  Martin Baulig  <martin@ximian.com>
5022
5023         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
5024
5025         * expression.cs (Invocation.InferTypeArguments): Added overloaded
5026         public version which takes a `ParameterData pd' instead of an
5027         `ArrayList args'.
5028
5029 2004-03-29  Martin Baulig  <martin@ximian.com>
5030
5031         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
5032         not a MethodInfo.       
5033
5034 2004-03-29  Martin Baulig  <martin@ximian.com>
5035
5036         * expression.cs (Argument.ResolveMethodGroup): If we're a
5037         ConstructedType, call GetMemberAccess() on it.  
5038
5039 2004-03-29  Martin Baulig  <martin@ximian.com>
5040
5041         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
5042         (MethodCore.CheckGenericOverride): When overriding a generic
5043         method, check whether the constraints match.
5044
5045         * support.cs (GenericConstraints): New public interface.
5046         (ParameterData.GenericConstraints): New public method.
5047
5048         * parameter.cs (Parameter.Resolve): Check whether we're a generic
5049         method parameter and compute our constraints if appropriate.
5050         (Parameter.GenericConstraints): New public property.
5051
5052         * generic.cs (Constraints): Implement GenericConstraints.
5053
5054 2004-03-29  Martin Baulig  <martin@ximian.com>
5055
5056         * decl.cs (MemberCache.FindMemberToOverride): Use
5057         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
5058
5059 2004-03-29  Martin Baulig  <martin@ximian.com>
5060
5061         * generic.cs (GenericMethod.Define): Resolve our type parameters.
5062
5063 2004-03-29  Martin Baulig  <martin@ximian.com>
5064
5065         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
5066         not allowed on non-generic declarations").
5067
5068 2004-03-29  Martin Baulig  <martin@ximian.com>
5069
5070         * expression.cs (Invocation.InferTypeArguments): Added overloaded
5071         public version of this method.
5072
5073         * class.cs (MethodCore.IsDuplicateImplementation): Use
5074         Invocation.InferTypeArguments() to check this.
5075
5076 2004-03-29  Martin Baulig  <martin@ximian.com>
5077
5078         * convert.cs: Use TypeManager.IsDelegateType() instead of
5079         comparing types correctly.
5080
5081 2004-03-29  Martin Baulig  <martin@ximian.com>
5082
5083         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
5084         types directly to make it work for generic instances.
5085
5086         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
5087
5088 2004-03-29  Martin Baulig  <martin@ximian.com>
5089
5090         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
5091         support for arrays.     
5092
5093 2004-03-24  Martin Baulig  <martin@ximian.com>
5094
5095         * decl.cs (DeclSpace.FindType): Also use
5096         TypeManager.CheckGeneric() for types from the using clauses.
5097
5098 2004-03-23  Martin Baulig  <martin@ximian.com>
5099
5100         * expression.cs (Invocation.OverloadResolve): Added `bool
5101         may_fail' argument and use it instead of the Location.IsNull() hack.
5102
5103 2004-03-23  Martin Baulig  <martin@ximian.com>
5104
5105         * expression.cs (Invocation.InferType): Use correct type inference
5106         rules here.     
5107
5108 2004-03-23  Martin Baulig  <martin@ximian.com>
5109
5110         * ecore.cs (MethodGroupExpr.Name): Use
5111         TypeManager.CSharpSignature() instead of just the name.
5112
5113         * expression.cs (Invocation.OverloadResolve): Provide better error
5114         reporting.
5115         (Invocation.DoResolve): OverloadResolve() never returns null
5116         without reporting an error, so removed the error -6 reporting here.
5117
5118 2004-03-23  Martin Baulig  <martin@ximian.com>
5119
5120         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
5121         generic methods.
5122
5123         * cs-parser.jay (delegate_declaration): Support generic delegates.
5124
5125         * delegate.cs: Support generic delegates.
5126
5127 2004-03-22  Martin Baulig  <martin@ximian.com>
5128
5129         * expression.cs (Invocation.InferParamsTypeArguments): New static
5130         method; does type inference for params arguments.
5131
5132 2004-03-21  Martin Baulig  <martin@ximian.com>
5133
5134         * typemanager.cs (TypeManager.IsGenericMethod): New public static
5135         method; checks whether a method is a generic method.    
5136
5137         * expression.cs (Invocation.InferTypeArguments): New static method;
5138         infer type arguments for generic method invocation.
5139
5140         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
5141         property; we set this to true if we're resolving a generic method
5142         invocation and the user specified type arguments, ie. we're not
5143         doing type inference.
5144
5145 2004-03-20  Martin Baulig  <martin@ximian.com>
5146
5147         * class.cs (MethodData.DeclaringType): New public property.
5148         (MethodData.Define): Set DeclaringType here.
5149         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
5150         instead of OperatorMethodBuilder.DeclaringType.
5151
5152 2004-03-20  Martin Baulig  <martin@ximian.com>
5153
5154         * cs-tokenizer.cs (xtoken): Return a special
5155         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
5156
5157         * cs-parser.jay (default_value_expression): Switch to the new
5158         syntax (14.5.13).
5159
5160 2004-03-19  Martin Baulig  <martin@ximian.com>
5161
5162         * decl.cs (MemberName): New class.  We use this to "construct"
5163         namespace_or_type_name's.
5164
5165         * generics.cs (TypeArguments.GetDeclarations): New public method;
5166         returns the type arguments as a string[] and reports a CS0081 if
5167         one of them is not an identifier.
5168
5169         * class.cs (MemberBase): The .ctor now takes the name as a
5170         MemberName instead of a string.
5171         (MemberBase.ExplicitInterfaceName): Changed type from string to
5172         Expression.
5173         (MemberBase.DoDefine): If we're an explicit implementation, the
5174         InterfaceType may be a generic instance.
5175
5176         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
5177         (namespace_name): Call MemberName.GetName () to transform the
5178         MemberName into a string and ensure we don't have any type
5179         arguments.
5180         (type_name): Call MemberName.GetTypeExpression() to transfrom the
5181         MemberName into an expression.
5182         (method_header): Use namespace_or_type_name instead of member_name.     
5183
5184 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
5185
5186         * rootcontext.cs: Add new types to the boot resolution.
5187
5188         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
5189         MulticastDelegate is not allowed.
5190
5191         * typemanager.cs: Add new types to lookup: System.TypedReference
5192         and ArgIterator.
5193
5194         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
5195         check for TypedReference or ArgIterator, they are not allowed. 
5196
5197         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
5198         makes us properly catch 1510 in some conditions (see bug 56016 for
5199         details). 
5200
5201 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
5202
5203         * CryptoConvert.cs: update from corlib version
5204         with endian fixes.
5205
5206 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
5207
5208         * class.cs (Indexer.Define): Check indexername declaration
5209
5210 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
5211
5212         * attribute.cs (IsClsCompliant): Fixed problem with handling
5213         all three states (compliant, not-compliant, undetected).
5214
5215 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
5216
5217         * attribute.cs (Attribute): Location is now public.
5218         (Resolve): Store resolved arguments (pos_values) in attribute class.
5219         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
5220         (GetClsCompliantAttributeValue): New method that gets
5221         CLSCompliantAttribute value.
5222         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
5223         if exists else null.
5224         (AttributeTester): New class for CLS-Compliant verification routines.
5225
5226         * class.cs (Emit): Add CLS-Compliant verification.
5227         (Method.GetSignatureForError): Implemented.
5228         (Constructor.GetSignatureForError): Implemented
5229         (Constructor.HasCompliantArgs): Returns if constructor has
5230         CLS-Compliant arguments.
5231         (Constructor.Emit): Override.
5232         (Construcor.IsIdentifierClsCompliant): New method; For constructors
5233         is needed to test only parameters.
5234         (FieldBase.GetSignatureForError): Implemented.
5235         (TypeContainer): New member for storing base interfaces.
5236         (TypeContainer.FindMembers): Search in base interfaces too.
5237
5238         * codegen.cs (GetClsComplianceAttribute): New method that gets
5239         assembly or module CLSCompliantAttribute value.
5240         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
5241         for assembly.
5242         (ModuleClass.Emit): Add error 3012 test.
5243
5244         * const.cs (Emit): Override and call base for CLS-Compliant tests.
5245
5246         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
5247         state for all decl types.
5248         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
5249         if CLS-Compliant tests are required.
5250         (IsClsCompliaceRequired): New method. Analyze whether code
5251         must be CLS-Compliant.
5252         (IsExposedFromAssembly): New method. Returns true when MemberCore
5253         is exposed from assembly.
5254         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
5255         value or gets cached value.
5256         (HasClsCompliantAttribute): New method. Returns true if MemberCore
5257         is explicitly marked with CLSCompliantAttribute.
5258         (IsIdentifierClsCompliant): New abstract method. This method is
5259         used to testing error 3005.
5260         (IsIdentifierAndParamClsCompliant): New method. Common helper method
5261         for identifier and parameters CLS-Compliant testing.
5262         (VerifyClsCompliance): New method. The main virtual method for
5263         CLS-Compliant verifications.
5264         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
5265         null. I don't know why is null (too many public members !).
5266         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
5267         and get value of first CLSCompliantAttribute that found.
5268
5269         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
5270         (VerifyClsCompliance): Override and add extra tests.
5271
5272         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
5273         clscheck- disable CLS-Compliant verification event if assembly is has
5274         CLSCompliantAttribute(true).
5275
5276         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
5277         ApllyAttribute is now called in emit section as in the other cases.
5278         Possible future Emit integration.
5279         (IsIdentifierClsCompliant): New override.
5280         (VerifyClsCompliance): New override.
5281         (GetEnumeratorName): Returns full enum name.
5282
5283         * parameter.cs (GetSignatureForError): Implemented.
5284
5285         * report.cs (WarningData): New struct for Warning message information.
5286         (LocationOfPreviousError): New method.
5287         (Warning): New method. Reports warning based on the warning table.
5288         (Error_T): New method. Reports error based on the error table.
5289
5290         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
5291         verifications are done here.
5292
5293         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
5294
5295         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
5296         CLSCompliantAttribute.
5297         (all_imported_types): New member holds all imported types from other
5298         assemblies.
5299         (LoadAllImportedTypes): New method fills static table with exported types
5300         from all referenced assemblies.
5301         (Modules): New property returns all assembly modules.
5302
5303 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
5304
5305         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
5306         throwing a parser error.
5307
5308         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
5309         which removes the hardcoded get_/set_ prefixes for properties, as
5310         IL allows for the properties to be named something else.  
5311
5312         Bug #56013
5313
5314         * expression.cs: Do not override operand before we know if it is
5315         non-null.  Fix 56207
5316
5317 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5318
5319         * typemanager.cs: support for pinned variables.
5320
5321 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5322
5323         * decl.cs, typemanager.cs: Avoid using an arraylist
5324         as a buffer if there is only one result set.
5325
5326 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5327
5328         * expression.cs: Make sure you cant call a static method
5329         with an instance expression, bug #56174.
5330
5331 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
5332
5333         * class.cs (IsDuplicateImplementation): Improve error reporting to
5334         flag 663 (method only differs in parameter modifier).
5335
5336         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
5337         in preprocessor directives.
5338
5339         * location.cs (LookupFile): Allow for the empty path.
5340
5341         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
5342         better approach for some of that patch, but its failing with the
5343         CharSet enumeration.  For now try/catch will do.
5344
5345         * typemanager.cs: Do not crash if a struct does not have fields.
5346         Fixes 56150.
5347
5348 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5349
5350         * expression.cs: cs0213, cant fix a fixed expression.
5351         fixes 50231.
5352
5353 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5354
5355         * cs-parser.jay: detect invalid embeded statements gracefully.
5356         bug #51113.
5357
5358 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5359
5360         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
5361         As a regex:
5362         s/
5363         the invocation type may not be a subclass of the tye of the item/
5364         The type of the item must be a subclass of the invocation item.
5365         /g
5366
5367         Fixes bug #50820.
5368
5369 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
5370
5371         * attribute.cs: Added methods to get a string and a bool from an
5372         attribute. Required to information from AssemblyKeyFileAttribute,
5373         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
5374         * codegen.cs: Modified AssemblyName creation to include support for
5375         strongnames. Catch additional exceptions to report them as CS1548.
5376         * compiler.csproj: Updated include CryptoConvert.cs.
5377         * compiler.csproj.user: Removed file - user specific configuration.
5378         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
5379         Mono.Security assembly. The original class is maintained and tested in
5380         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
5381         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
5382         like CSC 8.0 (C# v2) supports.
5383         * Makefile: Added CryptoConvert.cs to mcs sources.
5384         * rootcontext.cs: Added new options for strongnames.
5385
5386 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
5387
5388         * driver.cs: For --expect-error, report error code `2'
5389         if the program compiled with no errors, error code `1' if
5390         it compiled with an error other than the one expected.
5391
5392 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
5393
5394         * compiler.csproj: Updated for Visual Studio .NET 2003.
5395         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
5396         * compiler.sln: Updated for Visual Studio .NET 2003.
5397
5398 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
5399
5400         * expression.cs: Fix bug #47234. We basically need to apply the
5401         rule that we prefer the conversion of null to a reference type
5402         when faced with a conversion to 'object' (csc behaviour).
5403
5404 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5405
5406         * statement.cs: Shorter form for foreach, eliminates
5407         a local variable. r=Martin.
5408
5409 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5410
5411         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
5412         checks if we can use brtrue/brfalse to test for 0.
5413         * expression.cs: use the above in the test for using brtrue/brfalse.
5414         cleanup code a bit.
5415
5416 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5417
5418         * expression.cs: Rewrite string concat stuff. Benefits:
5419
5420         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
5421         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
5422         rather than a concat chain.
5423
5424         * typemanager.cs: Add lookups for more concat overloads.
5425
5426 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5427
5428         * expression.cs: Emit shorter il code for array init.
5429
5430         newarr
5431         dup
5432         // set 1
5433
5434         // set 2
5435
5436         newarr
5437         stloc.x
5438
5439         ldloc.x
5440         // set 1
5441
5442         ldloc.x
5443         // set 2
5444
5445 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
5446
5447         * statement.cs: Before, two switch blocks would be merged if the
5448         total size of the blocks (end_item - begin_item + 1) was less than
5449         two times the combined sizes of the blocks.
5450
5451         Now, it will only merge if after the merge at least half of the
5452         slots are filled.
5453
5454         fixes 55885.
5455
5456 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
5457
5458         * class.cs : csc build fix for GetMethods(). See bug #52503.
5459
5460 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
5461
5462         * expression.cs: Make sure fp comparisons work with NaN.
5463         This fixes bug #54303. Mig approved this patch a long
5464         time ago, but we were not able to test b/c the runtime
5465         had a related bug.
5466
5467 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
5468
5469         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
5470
5471 2004-03-19  Martin Baulig  <martin@ximian.com>
5472
5473         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
5474         two overloads may unify for some type parameter substitutions and
5475         report a CS0408 if appropriate.
5476
5477 2004-03-19  Martin Baulig  <martin@ximian.com>
5478
5479         * class.cs (MemberCore.IsDuplicateImplementation): Report the
5480         error here and not in our caller.
5481
5482 2004-03-19  Martin Baulig  <martin@ximian.com>
5483
5484         * interface.cs: Completely killed this file.
5485         (Interface): We're now a TypeContainer and live in class.cs.
5486
5487         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
5488         argument; we're now also called for interfaces.
5489         (TypeContainer.DefineMembers): Allow this method being called
5490         multiple times.
5491         (TypeContainer.GetMethods): New public method; formerly known as
5492         Interface.GetMethod().  This is used by PendingImplementation.
5493         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
5494         it's now private and non-static.
5495         (Interface): Moved this here; it's now implemented similar to
5496         Class and Struct.
5497         (Method, Property, Event, Indexer): Added `bool is_interface'
5498         argument to their .ctor's.
5499         (MemberBase.IsInterface): New public field.
5500
5501         * cs-parser.jay: Create normal Method, Property, Event, Indexer
5502         instances instead of InterfaceMethod, InterfaceProperty, etc.
5503         (opt_interface_base): Removed; we now use `opt_class_base' instead.
5504         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
5505
5506 2004-03-19  Martin Baulig  <martin@ximian.com>
5507
5508         * class.cs (MethodCore.IsDuplicateImplementation): New private
5509         method which does the CS0111 checking.
5510         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
5511         Use IsDuplicateImplementation().
5512
5513 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
5514
5515         * decl.cs (FindMemberToOverride): New method to find the correct
5516         method or property to override in the base class.
5517         * class.cs
5518             - Make Method/Property use the above method to find the
5519               version in the base class.
5520             - Remove the InheritableMemberSignatureCompare as it is now
5521               dead code.
5522
5523         This patch makes large code bases much faster to compile, as it is
5524         O(n) rather than O(n^2) to do this validation.
5525
5526         Also, it fixes bug 52458 which is that nested classes are not
5527         taken into account when finding the base class member.
5528
5529         Reviewed/Approved by Martin.
5530
5531 2004-03-17  Martin Baulig  <martin@ximian.com>
5532
5533         * expression.cs (MemberAccess.DoResolve): Take the parent's number
5534         of type arguments into account; use the `real_num_type_args'
5535         approach like in DoResolveAsTypeStep().
5536
5537         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
5538         nested types.
5539
5540 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
5541
5542         * interface.cs: In all interface classes removed redundant
5543         member initialization.
5544
5545 2004-03-16  Martin Baulig  <martin@ximian.com>
5546
5547         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5548
5549 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5550
5551         * decl.cs (DefineTypeAndParents): New helper method to define a
5552         type's containers before the type itself is defined;  This is a
5553         bug exposed by the recent changes to Windows.Forms when an
5554         implemented interface was defined inside a class that had not been
5555         built yet.   
5556
5557         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
5558
5559         (Check): Loop correctly to report errors modifiers
5560         (UNSAFE was not in the loop, since it was the same as TOP).
5561
5562         * interface.cs: Every interface member now takes a ModFlags,
5563         instead of a "is_new" bool, which we set on the base MemberCore. 
5564
5565         Every place where we called "UnsafeOk" in the interface, now we
5566         call the proper member (InterfaceMethod.UnsafeOK) instead to get
5567         the unsafe settings from the member declaration instead of the
5568         container interface. 
5569
5570         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
5571
5572         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5573         `set_indexer_name' to the pending bits (one per type).
5574
5575         We fixed a bug today that was picking the wrong method to
5576         override, since for properties the existing InterfaceMethod code
5577         basically ignored the method name.  Now we make sure that the
5578         method name is one of the valid indexer names.
5579
5580 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
5581  
5582         * support.cs (SeekableStreamReader): Keep track of stream byte
5583         positions and don't mix them with character offsets to the buffer.
5584
5585         Patch from Gustavo Giráldez
5586
5587 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
5588
5589         * interface.cs (InterfaceSetGetBase): Removed double member
5590         initialization, base class does it as well.
5591
5592 2004-03-13  Martin Baulig  <martin@ximian.com>
5593
5594         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
5595         when compiling corlib.
5596
5597 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
5598
5599         * convert.cs (ExplicitConversion): We were reporting an error on
5600         certain conversions (object_type source to a value type, when the
5601         expression was `null') before we had a chance to pass it through
5602         the user defined conversions.
5603
5604         * driver.cs: Replace / and \ in resource specifications to dots.
5605         Fixes 50752
5606
5607         * class.cs: Add check for duplicate operators.  Fixes 52477
5608
5609 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
5610
5611         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
5612         that are in the middle of the statements, not only at the end.
5613         Fixes #54987
5614
5615         * class.cs (TypeContainer.AddField): No longer set the
5616         `HaveStaticConstructor' flag, now we call it
5617         `UserDefineStaticConstructor' to diferentiate the slightly
5618         semantic difference.
5619
5620         The situation is that we were not adding BeforeFieldInit (from
5621         Modifiers.TypeAttr) to classes that could have it.
5622         BeforeFieldInit should be set to classes that have no static
5623         constructor. 
5624
5625         See:
5626
5627         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
5628
5629         And most importantly Zoltan's comment:
5630
5631         http://bugzilla.ximian.com/show_bug.cgi?id=44229
5632
5633         "I think beforefieldinit means 'it's ok to initialize the type sometime 
5634          before its static fields are used', i.e. initialization does not need
5635          to be triggered by the first access to the type. Setting this flag
5636          helps the JIT to compile better code, since it can run the static
5637          constructor at JIT time, and does not need to generate code to call it
5638          (possibly lots of times) at runtime. Unfortunately, mcs does not set
5639          this flag for lots of classes like String. 
5640          
5641          csc sets this flag if the type does not have an explicit static 
5642          constructor. The reasoning seems to be that if there are only static
5643          initalizers for a type, and no static constructor, then the programmer
5644          does not care when this initialization happens, so beforefieldinit
5645          can be used.
5646          
5647          This bug prevents the AOT compiler from being usable, since it 
5648          generates so many calls to mono_runtime_class_init that the AOT code
5649          is much slower than the JITted code. The JITted code is faster, 
5650          because it does not generate these calls if the vtable is type is
5651          already initialized, which is true in the majority of cases. But the
5652          AOT compiler can't do this."
5653
5654 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
5655
5656         * class.cs (MethodData.Emit): Refactor the code so symbolic
5657         information is generated for destructors;  For some reasons we
5658         were taking a code path that did not generate symbolic information
5659         before. 
5660
5661 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5662
5663         * class.cs: Create a Constructor.CheckBase method that
5664         takes care of all validation type code. The method
5665         contains some code that was moved from Define.
5666
5667         It also includes new code that checks for duplicate ctors.
5668         This fixes bug #55148.
5669
5670 2004-03-09  Joshua Tauberer <tauberer@for.net>
5671
5672         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
5673         a { ... }-style array creation invokes EmitStaticInitializers
5674         which is not good for reference-type arrays.  String, decimal
5675         and now null constants (NullCast) are not counted toward
5676         static initializers.
5677
5678 2004-03-05  Martin Baulig  <martin@ximian.com>
5679
5680         * location.cs (SourceFile.HasLineDirective): New public field;
5681         specifies whether the file contains or is referenced by a "#line"
5682         directive.
5683         (Location.DefineSymbolDocuments): Ignore source files which
5684         either contain or are referenced by a "#line" directive.        
5685
5686 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
5687
5688         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
5689         direct access to our parent, so check the method inline there.
5690
5691 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5692
5693         * expression.cs (Invocation.EmitCall): Miguel's last commit
5694         caused a regression. If you had:
5695
5696             T t = null;
5697             t.Foo ();
5698
5699         In Foo the implict this would be null.
5700
5701 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
5702
5703         * expression.cs (Invocation.EmitCall): If the method is not
5704         virtual, do not emit a CallVirt to it, use Call.
5705
5706         * typemanager.cs (GetFullNameSignature): Improve the method to
5707         cope with ".ctor" and replace it with the type name.
5708
5709         * class.cs (ConstructorInitializer.Resolve): Now the method takes
5710         as an argument the ConstructorBuilder where it is being defined,
5711         to catch the recursive constructor invocations.
5712
5713 2004-03-16  Martin Baulig  <martin@ximian.com>
5714
5715         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
5716         ConstructedType, call ResolveType() on it to get the type rather
5717         than just using `expr.Type'.
5718
5719 2004-03-16  Martin Baulig  <martin@ximian.com>
5720
5721         * generics.cs (ConstructedType.GetMemberAccess): Take the
5722         EmitContext instead on the TypeExpr and use
5723         ec.TypeContainer.CurrentType/ec.ContainerType.
5724
5725 2004-03-16  Martin Baulig  <martin@ximian.com>
5726
5727         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
5728         parameters before aliases.
5729
5730 2004-03-16  Martin Baulig  <martin@ximian.com>
5731
5732         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
5733         New oublic function; checks whether two generic instances may become
5734         equal under some instantiations (26.3.1).
5735
5736         * class.cs (TypeContainer.Define): Call
5737         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
5738         error.
5739
5740 2004-03-16  Martin Baulig  <martin@ximian.com>
5741
5742         * class.cs (TypeContainer.GetClassBases): Moved
5743         Error_TypeParameterAsBase() here and also check whether the base
5744         class is not an attribute.
5745
5746 2004-03-16  Martin Baulig  <martin@ximian.com>
5747
5748         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5749
5750 2004-03-16  Martin Baulig  <martin@ximian.com>
5751
5752         * class.cs (Error_TypeParameterAsBase): Use correct error number
5753         here (CS0689).  
5754
5755 2004-03-16  Martin Baulig  <martin@ximian.com>
5756
5757         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
5758         for generics.
5759
5760         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
5761         error reporting.
5762
5763 2004-03-15  Martin Baulig  <martin@ximian.com>
5764
5765         * typemanager.cs (TypeManager.GetFullName): New public method.
5766         (TypeManager.MemberLookup): Added `int_num_type_arguments'
5767         argument; only return members with the correct number of type
5768         arguments.
5769         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
5770         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
5771         whether the number of type arguments matches.
5772
5773         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
5774         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
5775
5776         * expression.cs (MemberAccess): Added public `NumTypeArguments'
5777         field; it's set by the protected .ctor when we're actually a
5778         GenericMemberAccess.
5779         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
5780         arguments and pass it to MemberLookupFinal ().
5781
5782         * ecore.cs (Expression.MemberLookup): Added `int
5783         num_type_arguments' argument; only return members with the correct
5784         number of type arguments.
5785         (Expression.MemberLookupFailed): Check whether the MemberLookup
5786         failed because we did not have the correct number of type
5787         arguments; report CS0305 in this case.
5788
5789         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
5790         `e.ResolveAsTypeTerminal()' already did so.
5791
5792 2004-03-15  Martin Baulig  <martin@ximian.com>
5793
5794         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
5795         we're a ConstructedType; in this case, the caller must report an
5796         error (for instance CS0131).
5797
5798         * generic.cs (TypeArguments): Added Location argument to the .ctor.
5799         (TypeArguments.Resolve): Actually report errors here.
5800
5801 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5802
5803         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5804         `set_indexer_name' to the pending bits (one per type).
5805
5806         We fixed a bug today that was picking the wrong method to
5807         override, since for properties the existing InterfaceMethod code
5808         basically ignored the method name.  Now we make sure that the
5809         method name is one of the valid indexer names.
5810
5811 2004-03-15  Martin Baulig  <martin@ximian.com>
5812
5813         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
5814         for generic instances.
5815
5816 2004-03-13  Martin Baulig  <martin@ximian.com>
5817
5818         * class.cs (TypeContainer.DefineType): Call
5819         TypeManager.AddUserType() immediately after creating the
5820         TypeBuilder; pass all type parameters when creating the
5821         CurrentType.
5822
5823         * decl.cs (DeclSpace.FindNestedType): New public method.
5824         (DeclSpace.FindType): Added `int num_type_args' argument; only
5825         return types with the correct number of type parameters.
5826         (DeclSpace.CountTypeParams): New public property.
5827
5828         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
5829         the number of type parameters; defaults to zero.
5830
5831         * generic.cs (TypeArguments.Count): New public property.
5832         (ConstructedType.DoResolveAsTypeStep): First call
5833         ds.FindNestedType() to find out whether we're nested in the
5834         current generic type; in this case, we inherit all type parameters
5835         from the current class.
5836
5837         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
5838         num_type_args' argument.
5839         (RootContext.LookupType): Added overloaded version which takes the
5840         number of type arguments; only return types with the correct
5841         number of type arguments.
5842
5843         * typemanager.cs (TypeManager.CheckGeneric): New public function;
5844         checks whether `Type t' has `int num_type_args'.
5845
5846 2004-03-13  Martin Baulig  <martin@ximian.com>
5847
5848         * generic.cs (GenericMethod.DefineType): New method; calls
5849         DefineType() on all the type parameters.
5850
5851         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
5852         (MethodData.Define): If we're a generic method, call
5853         GenericMethod.DefineType() to define the type parameters.       
5854
5855 2004-03-10  Martin Baulig  <martin@ximian.com>
5856
5857         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
5858         instead of IsAssignableFrom.    
5859
5860 2004-03-10  Martin Baulig  <martin@ximian.com>
5861
5862         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
5863
5864         * support.cs (ParameterData.HasArrayParameter): New property.
5865         (ReflectionParameters.ctor): Take a MethodBase instead of a
5866         ParameterInfo[].  If we have any type parameters, get the generic
5867         method definition and ask it whether we have variable arguments.
5868
5869 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
5870
5871         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
5872         routines to check if a type is an enumerable/enumerator allow
5873         classes that implement the IEnumerable or IEnumerator interfaces.
5874
5875         * class.cs (Property, Operator): Implement IIteratorContainer, and
5876         implement SetYields.
5877
5878         (Property.Define): Do the block swapping for get_methods in the
5879         context of iterators.   We need to check if Properties also
5880         include indexers or not.
5881
5882         (Operator): Assign the Block before invoking the
5883         OperatorMethod.Define, so we can trigger the Iterator code
5884         replacement. 
5885
5886         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
5887         Property and Operator classes are not created when we parse the
5888         declarator but until we have the block completed, so we use a
5889         singleton SimpleIteratorContainer.Simple to flag whether the
5890         SetYields has been invoked.
5891
5892         We propagate this setting then to the Property or the Operator to
5893         allow the `yield' to function.
5894
5895 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
5896
5897         * codegen.cs: Implemented attribute support for modules.
5898         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
5899         Assembly/Module functionality.
5900
5901         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
5902         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
5903         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
5904
5905 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
5906
5907         * interface.cs (FindMembers): The operation is performed on all base
5908         interfaces and not only on the first. It is required for future CLS Compliance patch.
5909
5910 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5911
5912         * statement.cs, codegen.cs:
5913         This patch deals with patterns such as:
5914
5915         public class List : IEnumerable {
5916
5917                 public MyEnumerator GetEnumerator () {
5918                         return new MyEnumerator(this);
5919                 }
5920
5921                 IEnumerator IEnumerable.GetEnumerator () {
5922                         ...
5923                 }
5924                 
5925                 public struct MyEnumerator : IEnumerator {
5926                         ...
5927                 }
5928         }
5929
5930         Before, there were a few things we did wrong:
5931         1) we would emit callvirt on a struct, which is illegal
5932         2) we emited ldarg when we needed to emit ldarga
5933         3) we would mistakenly call the interface methods on an enumerator
5934         type that derived from IEnumerator and was in another assembly. For example:
5935
5936         public class MyEnumerator : IEnumerator
5937
5938         Would have the interface methods called, even if there were public impls of the
5939         method. In a struct, this lead to invalid IL code.
5940
5941 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
5942
5943         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
5944           renamed to Emit.
5945
5946         * delegate.cs (Define): Fixed crash when delegate type is undefined.
5947
5948 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
5949
5950         * cs-parser.jay: Fix small regression: we were not testing V2
5951         compiler features correctly.
5952
5953         * interface.cs: If the emit context is null, then create one
5954
5955 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
5956
5957         * decl.cs (GetSignatureForError): New virtual method to get full name
5958           for error messages.
5959
5960         * attribute.cs (IAttributeSupport): New interface for attribute setting.
5961           Now it is possible to rewrite ApplyAttributes method to be less if/else.
5962
5963         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
5964           Duplicated members and code in these classes has been removed.
5965           Better encapsulation in these classes.
5966
5967 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
5968
5969         * assign.cs (Assign.DoResolve): When dealing with compound
5970         assignments, there is a new rule in ECMA C# 2.4 (might have been
5971         there before, but it is documented here) that states that in:
5972
5973         a op= b;
5974
5975         If b is of type int, and the `op' is a shift-operator, then the
5976         above is evaluated as:
5977
5978         a = (int) a op b 
5979
5980         * expression.cs (Binary.ResolveOperator): Instead of testing for
5981         int/uint/long/ulong, try to implicitly convert to any of those
5982         types and use that in pointer arithmetic.
5983
5984         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
5985         method to print information for from the type, not from the
5986         null-method we were given.
5987
5988 2004-02-01  Duncan Mak  <duncan@ximian.com>
5989
5990         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
5991         parsing for cmd, fixes bug #53694.
5992
5993 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
5994
5995         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
5996         in the member name duplication tests. Property and operator name duplication
5997         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
5998
5999 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
6000
6001         * interface.cs (PopulateMethod): Fixed crash when interface method
6002         returns not existing type (error test cs0246-3.cs).
6003
6004 2004-02-02  Ravi Pratap M <ravi@ximian.com>
6005
6006         * cs-parser.jay (interface_accessors): Re-write actions to also
6007         store attributes attached to get and set methods. Fix spelling
6008         while at it.
6009
6010         (inteface_property_declaration): Modify accordingly.
6011
6012         (InterfaceAccessorInfo): New helper class to store information to pass
6013         around between rules that use interface_accessors.
6014
6015         * interface.cs (Emit): Apply attributes on the get and set
6016         accessors of properties and indexers too.
6017
6018         * attribute.cs (ApplyAttributes): Modify accordingly to use the
6019         right MethodBuilder when applying attributes to the get and set accessors.
6020
6021 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
6022
6023         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
6024
6025 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
6026
6027         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
6028
6029 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
6030
6031         * cs-parser.jay: Remove YIELD token, instead use the new grammar
6032         changes that treat `yield' specially when present before `break'
6033         or `return' tokens.
6034
6035         * cs-tokenizer.cs: yield is no longer a keyword.
6036
6037 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
6038
6039         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
6040         setting for default constructors.
6041         For default constructors are almost every time set wrong Modifier. The
6042         generated IL code has been alright. But inside mcs this values was
6043         wrong and this was reason why several of my CLS Compliance tests
6044         failed.
6045
6046 2004-02-27  Martin Baulig  <martin@ximian.com>
6047
6048         * generics.cs (ConstructedType.ResolveType): Make the nested type
6049         stuff actually work.
6050
6051 2004-02-25  Martin Baulig  <martin@ximian.com>
6052
6053         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
6054         property; returns the type parameters just from the current type,
6055         ie. with the ones from outer classes.
6056         (DeclSpace.LookupGeneric): First search in the current class, then
6057         in outer classes.
6058         (DeclSpace.initialize_type_params): When hiding a type parameter
6059         from an outer class, put it into the `type_param_list' anyways.
6060
6061         * expression.cs (MemberAccess.expr): Made this field protected.
6062
6063         * class.cs (TypeContainer.Define): The `CurrentType' just contains
6064         the type parameters from the current class.
6065
6066         * generic.cs (ConstructedType.ResolveType): Support nested generic
6067         types by taking the type parameters which we inherit from outer
6068         classes into account.
6069         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
6070         support for nested generic types.
6071
6072 2004-02-23  Martin Baulig  <martin@ximian.com>
6073
6074         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
6075         field and check whether we're nested inside a generic type.
6076         (DeclSpace.ResolveType): If we're resolving to a generic type
6077         definition, create a ConstructedType and return its resolved type.
6078         (DeclSpace.initialize_type_params): New private method;
6079         initializes the `type_param_list' field from the type parameters
6080         from this and all enclosing classes.
6081         (DeclSpace.TypeParameters): Call initialize_type_params() unless
6082         we're already initialized.
6083
6084 2004-02-23  Martin Baulig  <martin@ximian.com>
6085
6086         * class.cs (Method.Define): Create the generic method before
6087         calling DoDefine().
6088         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
6089         the TypeContainer one); we use this for generic methods.
6090
6091         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
6092         parent's TypeBuilder.
6093
6094 2004-02-18  Martin Baulig  <martin@ximian.com>
6095
6096         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
6097         to check for equality.
6098
6099 2004-02-05  Martin Baulig  <martin@ximian.com>
6100
6101         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
6102         `ec.TypeContainer.CurrentType', use it instead of
6103         `ec.ContainerType' to check whether we're in the type's ctor.
6104
6105 2004-01-29  Martin Baulig  <martin@ximian.com>
6106
6107         * expression.cs (Invocation.DoResolve): If we're a
6108         `ConstructedType', then we're actually a generic method, so
6109         rewrite the expr as a GenericMemberAccess.
6110
6111         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
6112         here; manually parse it into a string.
6113
6114 2004-01-28  Martin Baulig  <martin@ximian.com>
6115
6116         * typemanager.cs (TypeManager.IsEqual): New static method.
6117         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
6118         check for equality instead of using `=='.
6119
6120 2004-01-26  Martin Baulig  <martin@ximian.com>
6121
6122         * decl.cs (DeclSpace.CurrentType): New public field.
6123
6124         * expression.cs (This.ResolveBase): If we have an
6125         `ec.TypeContainer.CurrentType', use it instead of
6126         `ec.ContainerType'.
6127
6128         * class.cs (TypeContainer.DefineType): If we're a generic type,
6129         create the `CurrentType' (unresolved).
6130         (TypeContainer.GenericType): New private field.
6131         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
6132         it and store it in `GenericType' before creating the MemberCache.
6133         (TypeContainer.GetMembers): If we have a `GenericType', call
6134         TypeManager.FindMembers() on it.
6135
6136         * interface.cs (Interface.GenericType): New private field.
6137         (Interface.DefineType): If we're a generic type, create the
6138         `CurrentType' (unresolved).
6139         (Interface.DefineMembers): If we have a `CurrentType', resolve it
6140         and store it in `GenericType' before creating the MemberCache.
6141         (Interface.GetMembers): If we have a `GenericType', call
6142         TypeManager.FindMembers() on it.
6143
6144 2004-01-22  Martin Baulig  <martin@ximian.com>
6145
6146         * cs-parser.jay (namespace_or_type_name): Return an Expression,
6147         not a QualifiedIdentifier.  This is what `type_name_expression'
6148         was previously doing.
6149         (type_name_expression): Removed; the code is now in
6150         `namespace_or_type_name'.
6151         (qualified_identifier): Removed, use `namespace_or_type_name'
6152         instead.
6153         (QualifiedIdentifier): Removed this class.      
6154
6155 2004-01-22  Martin Baulig  <martin@ximian.com>
6156
6157         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
6158         not a string as alias name.
6159
6160 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
6161
6162         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
6163         #52730 bug, and instead compute correctly the need to use a
6164         temporary variable when requesting an address based on the
6165         static/instace modified of the field and the constructor.
6166  
6167 2004-01-21  Martin Baulig  <martin@ximian.com>
6168
6169         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
6170         class and namespace before looking up aliases.  Fixes #52517.
6171
6172 2004-01-21  Martin Baulig  <martin@ximian.com>
6173
6174         * flowanalysis.cs (UsageVector.Merge): Allow variables being
6175         assinged in a 'try'; fixes exception4.cs.
6176
6177 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6178         * class.cs : Implemented parameter-less constructor for TypeContainer
6179
6180         * decl.cs: Attributes are now stored here. New property OptAttributes
6181
6182         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
6183
6184         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
6185
6186 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6187
6188         * typemanager.cs (CSharpSignature): Now reports also inner class name.
6189           (CSharpSignature): New method for indexer and property signature.
6190
6191 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6192
6193         * pending.cs (IsVirtualFilter): Faster implementation.
6194
6195 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6196
6197         * typemanager.cs: Avoid inclusion of same assembly more than once.
6198
6199 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6200
6201         * cs-parser.jay: Fixed problem where the last assembly attribute
6202           has been applied also to following declaration (class, struct, etc.)
6203           
6204 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6205
6206         * class.cs: Added error CS0538, CS0539 reporting.
6207         Fixed crash on Microsoft runtime when field type is void.
6208
6209         * cs-parser.jay: Added error CS0537 reporting.
6210
6211         * pending.cs: Added error CS0535 reporting.
6212         Improved error report for errors CS0536, CS0534.
6213
6214 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
6215
6216         Merge a few bits from the Anonymous Method MCS tree.
6217
6218         * statement.cs (ToplevelBlock): New class for toplevel methods,
6219         will hold anonymous methods, lifted variables.
6220
6221         * cs-parser.jay: Create toplevel blocks for delegates and for
6222         regular blocks of code. 
6223
6224 2004-01-20  Martin Baulig  <martin@ximian.com>
6225
6226         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
6227         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
6228         and `NeedExplicitReturn'; added `IsLastStatement'.
6229         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
6230         have a `ReturnLabel' or we're not unreachable.
6231
6232         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
6233         child's reachability; don't just override ours with it.  Fixes
6234         #58058 (lluis's example).
6235         (FlowBranching): Added public InTryOrCatch(), InCatch(),
6236         InFinally(), InLoop(), InSwitch() and
6237         BreakCrossesTryCatchBoundary() methods.
6238
6239         * statement.cs (Return): Do all error checking in Resolve().
6240         Unless we are the last statement in a top-level block, always
6241         create a return label and jump to it.
6242         (Break, Continue): Do all error checking in Resolve(); also make
6243         sure we aren't leaving a `finally'.
6244         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
6245         statement in a top-level block.
6246         (Block.Flags): Added `IsDestructor'.
6247         (Block.IsDestructor): New public property.
6248
6249 2004-01-20  Martin Baulig  <martin@ximian.com>
6250
6251         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
6252
6253 2004-01-20  Martin Baulig  <martin@ximian.com>
6254
6255         * statement.cs (Statement.ResolveUnreachable): New public method.
6256         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
6257         (Block.Resolve): Resolve unreachable statements.
6258
6259 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6260
6261         * expression.cs: We need to fix the case where we do
6262         not have a temp variable here.
6263
6264         * assign.cs: Only expression compound assignments need
6265         temporary variables.
6266
6267 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6268
6269         * flowanalysis.cs: Reduce memory allocation in a few ways:
6270           - A block with no variables should not allocate a bit
6271             vector for itself.
6272           - A method with no out parameters does not need any tracking
6273             for assignment of the parameters, so we need not allocate
6274             any data for it.
6275           - The arrays:
6276                 public readonly Type[] VariableTypes;
6277                 public readonly string[] VariableNames;
6278             Are redundant. The data is already stored in the variable
6279             map, so we need not allocate another array for it.
6280           - We need to add alot of checks for if (params | locals) == null
6281             due to the first two changes.
6282
6283 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
6284
6285         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
6286         implement IMemoryLocation, we store a copy on a local variable and
6287         take the address of it.  Patch from Benjamin Jemlich
6288
6289         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
6290         to use a special "type_name_expression" rule which reduces the
6291         number of "QualifiedIdentifier" classes created, and instead
6292         directly creates MemberAccess expressions.
6293
6294 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
6295
6296         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
6297         that fixes #52853.  Null literal assignment to ValueType
6298
6299         * class.cs (MethodData.Emit): Instead of checking the name of the
6300         method to determine if its a destructor, create a new derived
6301         class from Method called Destructor, and test for that.  
6302
6303         * cs-parser.jay: Create a Destructor object instead of a Method.  
6304
6305         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
6306
6307         Fixes: 52933
6308
6309 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
6310
6311         * expression.cs (Binary.ResolveOperator): Perform an implicit
6312         conversion from MethodGroups to their delegate types on the
6313         Addition operation.
6314
6315         * delegate.cs: Introduce a new class DelegateCreation that is the
6316         base class for `NewDelegate' and `ImplicitDelegateCreation',
6317         factor some code in here.
6318
6319         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
6320         conversion from MethodGroups to compatible delegate types. 
6321
6322         * ecore.cs (Expression.Resolve): Do not flag error 654
6323         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
6324         we allow conversions from MethodGroups to delegate types now.
6325
6326         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
6327         assignments in v2 either.
6328
6329 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
6330
6331         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
6332         static read-only fields in ctors.
6333
6334         Applied patch from Benjamin Jemlich 
6335
6336         * expression.cs (UnaryMutator): Avoid leaking local variables. 
6337
6338 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
6339
6340         * cs-tokenizer.cs (IsCastToken): Allow the various native types
6341         here to return true, as they can be used like this:
6342
6343                 (XXX) int.MEMBER ()
6344
6345         Fixed 49836 and all the other dups
6346
6347 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
6348
6349         * driver.cs: Implement /win32res and /win32icon.
6350
6351 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
6352
6353         * cs-parser.jay: Add a rule to improve error handling for the
6354         common mistake of placing modifiers after the type.
6355
6356 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
6357
6358         * cs-parser.jay (interface_event_declaration): Catch
6359         initialization of events on interfaces, and report cs0068
6360
6361         * cs-parser.jay (interface_event_declaration): Catch
6362         initialization of events. 
6363
6364         * ecore.cs: Better report missing constructors.
6365
6366         * expression.cs (Binary.ResolveOperator): My previous bug fix had
6367         the error reporting done in the wrong place.  Fix.
6368
6369         * expression.cs (Binary.ResolveOperator): Catch the 
6370         operator + (E x, E y) error earlier, and later allow for implicit
6371         conversions in operator +/- (E e, U x) from U to the underlying
6372         type of E.
6373
6374         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
6375         52596, if the container class is abstract, the default constructor
6376         is protected otherwise its public (before, we were always public).
6377
6378         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
6379         fixed statement.
6380
6381         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
6382         Jemlich that fixes bug #52597, MCS was generating invalid code for
6383         idisposable structs.   Thanks to Ben for following up with this
6384         bug as well.
6385
6386 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
6387
6388         * driver.cs: Allow assemblies without code to be generated, fixes
6389         52230.
6390
6391 2004-01-07  Nick Drochak <ndrochak@gol.com>
6392
6393         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
6394
6395 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
6396
6397         * cs-parser.jay: Add rules to improve error reporting if fields or
6398         methods are declared at the namespace level (error 116)
6399
6400         * Add rules to catch event add/remove
6401
6402 2004-01-04  David Sheldon <dave-mono@earth.li>
6403
6404   * expression.cs: Added matching ")" to error message for 
6405   CS0077
6406
6407 2004-01-03 Todd Berman <tberman@gentoo.org>
6408
6409         * ecore.cs, attribute.cs:
6410         Applying fix from #52429.
6411
6412 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6413
6414         * ecore.cs, expression.cs, statement.cs:
6415         Total rewrite of how we handle branching. We
6416         now handle complex boolean expressions with fewer
6417         jumps. As well if (x == 0) no longer emits a ceq.
6418
6419         if (x is Foo) is much faster now, because we generate
6420         better code.
6421
6422         Overall, we get a pretty big improvement on our benchmark
6423         tests. The code we generate is smaller and more readable.
6424
6425         I did a full two-stage bootstrap. The patch was reviewed
6426         by Martin and Miguel.
6427
6428 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6429
6430         * cs-parser.jay: Make primary_expression not take a QI.
6431         we dont need this because the member_access rule covers
6432         us here. So we replace the rule with just IDENTIFIER.
6433
6434         This has two good effects. First, we remove a s/r conflict.
6435         Second, we allocate many fewer QualifiedIdentifier objects.
6436
6437 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6438
6439         * attribute.cs: Handle MarshalAs attributes as pseudo, and
6440         set the correct information via SRE. This prevents
6441         hanging on the MS runtime. Fixes #29374.
6442
6443 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6444
6445         * convert.cs: correctly handle conversions to value types
6446         from Enum and ValueType as unboxing conversions.
6447
6448         Fixes bug #52569. Patch by Benjamin Jemlich.
6449
6450 2004-01-02  Ravi Pratap  <ravi@ximian.com>
6451
6452         * expression.cs (BetterConversion): Prefer int -> uint
6453         over int -> ulong (csc's behaviour). This fixed bug #52046.
6454
6455 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6456
6457         * decl.cs (MemberCache.FindMembers): now returns a
6458         MemberInfo [].
6459
6460         * typemanager.cs: In general, go with with ^^.
6461         (CopyNewMethods): take an IList.
6462         (RealMemberLookup): Only allocate an arraylist
6463         if we copy from two sets of methods.
6464
6465         This change basically does two things:
6466         1) Fewer array lists allocated due to CopyNewMethods.
6467         2) the explicit cast in MemberList costed ALOT.
6468
6469 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
6470
6471         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
6472         a hashtable to avoid needless string allocations when an identifier is
6473         used more than once (the common case).
6474
6475 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6476
6477         * pending.cs: MS's TypeBuilder.GetInterfaces ()
6478         is broken, it will not return anything. So, we
6479         have to use the information we have in mcs to
6480         do the task.
6481
6482         * typemanager.cs: Add a cache for GetInterfaces,
6483         since this will now be used more often (due to ^^)
6484
6485         (GetExplicitInterfaces) New method that gets the
6486         declared, not effective, interfaces on a type
6487         builder (eg, if you have interface IFoo, interface
6488         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
6489         { IBar }.
6490
6491         This patch makes MCS able to bootstrap itself on
6492         Windows again.
6493
6494 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6495
6496         * expression.cs: Remove the Nop's that Miguel put
6497         in by mistake.
6498
6499 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6500
6501         * report.cs, codegen.cs: Give the real stack trace to
6502         the error when an exception is thrown.
6503
6504 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6505
6506         * decl.cs: only allocate hashtables for ifaces if 
6507         it is an iface!
6508
6509 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6510
6511         * expression.cs: fix the error from cs0121-2.cs
6512         (a parent interface has two child interfaces that
6513         have a function with the same name and 0 params
6514         and the function is called through the parent).
6515
6516 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
6517
6518         * class.cs, rootcontext.cs, typmanager.cs: do not
6519         leak pointers.
6520
6521 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
6522
6523         * codegen.cs: remove stack for the ec flow branching.
6524         It is already a linked list, so no need.
6525
6526 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6527
6528         * Makefile: Allow custom profiler here.
6529
6530 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6531
6532         * typemanager.cs (LookupType):
6533           - Use a static char [], because split takes
6534             a param array for args, so it was allocating
6535             every time.
6536           - Do not store true in a hashtable, it boxes.
6537
6538 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6539
6540         * flowanalysis.cs: bytify common enums.
6541
6542 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6543
6544         * modifiers.cs: Add a new set of flags for the
6545         flags allowed on explicit interface impls.
6546         * cs-parser.jay: catch the use of modifiers in
6547         interfaces correctly.
6548         * class.cs: catch private void IFoo.Blah ().
6549
6550         All related to bug #50572.
6551
6552 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6553
6554         * decl.cs: Rewrite the consistant accessability checking.
6555         Accessability is not linear, it must be implemented in
6556         a tableish way. Fixes #49704.
6557
6558 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6559
6560         * expression.cs: Handle negation in a checked context.
6561         We must use subtraction from zero. Fixes #38674.
6562
6563 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6564
6565         * class.cs: Ignore static void main in DLLs.
6566         * rootcontext.cs: Handle the target type here,
6567         since we are have to access it from class.cs
6568         * driver.cs: account for the above.
6569
6570 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6571
6572         * report.cs: Give line numbers and files if available.
6573
6574 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
6575
6576         * driver.cs: Implement /addmodule.
6577
6578         * typemanager.cs:  Change 'modules' field so it now contains Modules not
6579         ModuleBuilders.
6580
6581 2003-12-20  Martin Baulig  <martin@ximian.com>
6582
6583         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
6584         (FieldBase.IsAssigned): Removed this field.
6585         (FieldBase.SetAssigned): New public method.
6586         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
6587
6588 2003-12-20  Martin Baulig  <martin@ximian.com>
6589
6590         * expression.cs (LocalVariableReference.DoResolve): Don't set
6591         `vi.Used' if we're called from DoResolveLValue().
6592
6593         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
6594         returns the usage vector it just merged into the current one -
6595         pass this one to UsageWarning().
6596         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
6597         of the `EmitContext', don't call this recursively on our children.
6598
6599 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
6600
6601         * driver.cs: Implement /target:module.
6602
6603 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
6604
6605         * support.cs (CharArrayHashtable): New helper class.
6606
6607         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
6608         char arrays, not strings, so we can avoid creating a string in
6609         consume_identifier if the identifier is a keyword.
6610
6611 2003-12-16  Martin Baulig  <martin@ximian.com>
6612
6613         * statement.cs (LocalInfo.Assigned): Removed this property.
6614         (LocalInfo.Flags): Removed `Assigned'.
6615         (LocalInfo.IsAssigned): New public method; takes the EmitContext
6616         and uses flow analysis.
6617         (Block.UsageWarning): Made this method private.
6618         (Block.Resolve): Call UsageWarning() if appropriate.
6619
6620         * expression.cs (LocalVariableReference.DoResolve): Always set
6621         LocalInfo.Used here.
6622
6623 2003-12-13  Martin Baulig  <martin@ximian.com>
6624
6625         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
6626         any value here; we're now using flow analysis to figure out
6627         whether a statement/block returns a value.
6628
6629 2003-12-13  Martin Baulig  <martin@ximian.com>
6630
6631         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
6632         working again.
6633         (FlowBranching.MergeFinally): Don't call
6634         `branching.CheckOutParameters()' here, this is called in
6635         MergeTopBlock().
6636         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
6637         when adding the `finally' vector.       
6638
6639 2003-12-13  Martin Baulig  <martin@ximian.com>
6640
6641         * flowanalysis.cs
6642         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
6643         actually work and also fix #48962.
6644
6645 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
6646
6647         * decl.cs: Do not check System.Object for nested types,
6648         since we know it does not have any. Big bang for buck:
6649
6650         BEFORE:
6651            Run 1:   8.35 seconds
6652            Run 2:   8.32 seconds
6653            corlib:  17.99 seconds
6654         AFTER:
6655            Run 1:   8.17 seconds
6656            Run 2:   8.17 seconds
6657            corlib:  17.39 seconds
6658
6659 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
6660
6661         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
6662         time we are returning 0 members, so we save alot here.
6663
6664 2003-12-11  Martin Baulig  <martin@ximian.com>
6665
6666         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
6667         `MergeChild()', also just take the `FlowBranching' as argument;
6668         call Merge() on it and return the result.
6669         (FlowBranching.Merge): We don't need to do anything if we just
6670         have one sibling.
6671
6672 2003-12-11  Martin Baulig  <martin@ximian.com>
6673
6674         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
6675         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
6676         Maurer for this idea.
6677
6678 2003-12-11  Martin Baulig  <martin@ximian.com>
6679
6680         * flowanalysis.cs (MergeResult): This class is now gone; we now
6681         use the `UsageVector' for this.  The reason for this is that if a
6682         branching just has one sibling, we don't need to "merge" them at
6683         all - that's the next step to do.
6684         (FlowBranching.Merge): We now return a `UsageVector' instead of a
6685         `MergeResult'.
6686
6687 2003-12-11  Martin Baulig  <martin@ximian.com>
6688
6689         Reworked flow analyis and made it more precise and bug-free.  The
6690         most important change is that we're now using a special `Reachability'
6691         class instead of having "magic" meanings of `FlowReturns'.  I'll
6692         do some more cleanups and optimizations and also add some more
6693         documentation this week.
6694
6695         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
6696         largely reworked this class.
6697         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
6698         the new `Reachability' class instead of having "magic" values here.
6699         (FlowBranching): We're now using an instance of `Reachability'
6700         instead of having separate `Returns', `Breaks' etc. fields.
6701
6702         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
6703         based on flow analysis; ignore the return value of block.Emit ().
6704
6705 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
6706
6707         * driver.cs typemanager.cs: Find the mono extensions to corlib even
6708         if they are private.
6709
6710 2003-12-09  Martin Baulig  <martin@ximian.com>
6711
6712         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
6713         call them directly on the UsageVector.
6714
6715 2003-12-09  Martin Baulig  <martin@ximian.com>
6716
6717         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
6718         Changed return type from `FlowReturns' to `Reachability'.
6719
6720 2003-12-09  Martin Baulig  <martin@ximian.com>
6721
6722         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
6723         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
6724         `Reachable' fields with a single `Reachability' one.
6725
6726 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6727
6728         * class.cs (FindMembers): Remove foreach's.
6729
6730         Bootstrap times:
6731
6732         BEFORE
6733                 Run 1:   8.74 seconds
6734                 Run 2:   8.71 seconds
6735
6736         AFTER
6737                 Run 1:   8.64 seconds
6738                 Run 2:   8.58 seconds
6739
6740
6741 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6742
6743         * cs-parser.jay:
6744         * gen-treedump.cs:
6745         * statement.cs:
6746         This patch does a few things:
6747                 1. EmptyStatement is now a singleton, so it is never reallocated.
6748                 2. All blah is EmptyStatement constructs have been changed to
6749                    blah == EmptyStatement.Value, which is much faster and valid
6750                    now that EmptyStatement is a singleton.
6751                 3. When resolving a block, rather than allocating a new array for
6752                    the non-empty statements, empty statements are replaced with
6753                    EmptyStatement.Value
6754                 4. Some recursive functions have been made non-recursive.
6755         Mainly the performance impact is from (3), however (1) and (2) are needed for
6756         this to work. (4) does not make a big difference in normal situations, however
6757         it makes the profile look saner.
6758
6759         Bootstrap times:
6760
6761         BEFORE
6762         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6763         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6764         Total memory allocated: 56397 KB
6765
6766         AFTER
6767         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
6768         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
6769         Total memory allocated: 55666 KB
6770
6771 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6772
6773         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
6774         than the hashtable in a hashtable version
6775
6776         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
6777         we always end up concating a string. This results in a huge perf
6778         loss, because many strings have to be tracked by the GC. In this
6779         patch, we first use a hashtable that works with two keys, so that
6780         the strings do not need to be concat'ed.
6781
6782         Bootstrap times:
6783         BEFORE
6784                 Run 1:   8.74 seconds
6785                 Run 2:   8.71 seconds
6786
6787         AFTER
6788                 Run 1:   8.65 seconds
6789                 Run 2:   8.56 seconds
6790
6791 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6792
6793         * Makefile: Add a new target `do-time' that does a quick and simple
6794         profile, leaving easy to parse output.
6795
6796 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
6797
6798         * codegen.cs (Init): Create the dynamic assembly with 
6799         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
6800
6801 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6802
6803         * support.cs: Make the PtrHashtable use only one
6804         instance of its comparer.
6805
6806 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
6807
6808         * typemanager.cs: Fix lookup of GetNamespaces.
6809
6810 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
6811
6812         * expression.cs: Removed redundant line.
6813
6814         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
6815         ArrayLists, use for loops with bounds.  
6816
6817         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
6818         arraylist.
6819
6820         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
6821         arraylists, use for loop with bounds.
6822
6823         The above three changes give us a 0.071 second performance
6824         improvement out of 3.294 seconds down to 3.223.  On my machine
6825         the above changes reduced the memory usage by 1,387 KB during
6826         compiler bootstrap.
6827
6828         * cs-parser.jay (QualifiedIdentifier): New class used to represent
6829         QualifiedIdentifiers.  Before we created a new string through
6830         concatenation, and mostly later on, the result would be
6831         manipulated by DecomposeQI through string manipulation.
6832
6833         This reduced the compiler memory usage for bootstrapping from
6834         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
6835         compile times in 0.05 seconds.
6836
6837 2003-11-28  Dick Porter  <dick@ximian.com>
6838
6839         * support.cs: Do string compares with the Invariant culture.
6840
6841         * rootcontext.cs: 
6842         * gen-treedump.cs: 
6843         * expression.cs: 
6844         * driver.cs: 
6845         * decl.cs: 
6846         * codegen.cs: 
6847         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
6848         the comparison is done with the Invariant culture.
6849
6850 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
6851
6852         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
6853         GetEnumerator method.
6854
6855         (ProbeCollectionType): Iterate starting at the most specific type
6856         upwards looking for a GetEnumerator
6857
6858         * expression.cs: Shift count can be up to 31 for int/uint and 63
6859         for long/ulong.
6860
6861 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * statement.cs (Block.LookupLabel): Also look for the label on the
6864         children blocks.  Use a hash table to keep track of visited
6865         nodes. 
6866
6867         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
6868         we actually did transform the other operand, otherwise fall back
6869         to the common codepath that casts to long.
6870
6871         * cs-tokenizer.cs: Use the same code pattern as the int case.
6872         Maybe I should do the parsing myself, and avoid depending on the
6873         Parse routines to get this done.
6874
6875 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
6876
6877         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6878         which fixes bug 51347.  This time test it.
6879
6880         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
6881         attributes for example can not tell the difference between these.
6882         The difference was only a syntax feature of the language. 
6883
6884         * attribute.cs: Apply attributes to delegates.
6885
6886         * delegate.cs: Call the apply attributes method.
6887
6888 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
6889
6890         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
6891         comparing 0 vs Byte.MinValue, not the value
6892
6893         (ImplicitConversionRequired): When reporting a conversion error,
6894         use error 31 to print out the constant error instead of the
6895         simpler 29.
6896
6897         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6898         which fixes bug 51347.
6899
6900 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
6901
6902         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
6903         which fixes the -warnaserror command line option.
6904
6905 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
6906
6907         * cfold.cs (DoNumericPromotions): During constant folding of
6908         additions on UIntConstant, special case intconstants with
6909         IntConstants like we do on the expression binary operator. 
6910
6911 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
6912
6913         * convert.cs (ImplicitReferenceConversion): We were missing a case
6914         (System.Enum are not value types or class types, so we need to
6915         classify them separatedly).
6916
6917         * driver.cs: We do not support error 2007.
6918
6919 2003-11-12 Jackson Harper <jackson@ximian.com>
6920
6921         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
6922         system directory. Also use the full file name so users can
6923         libraries names mscorlib-o-tron.dll in a non system dir.
6924         
6925 2004-01-04  David Sheldon <dave-mono@earth.li>
6926
6927         * expression.cs: Added matching ")" to error message for CS0077.
6928
6929 2003-12-19  Martin Baulig  <martin@ximian.com>
6930
6931         * typemanager.cs (TypeManager.IsEqualGenericType): New public
6932         static method; see documentation in the method.
6933         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
6934
6935         * convert.cs (Convert.ImplicitReferenceConversion,
6936         Convert.ImplicitReferenceConversionExists): Add support for
6937         generic type declarations; see gen-36.cs.
6938
6939 2003-12-19  Martin Baulig  <martin@ximian.com>
6940
6941         * pending.cs (Pending.InterfaceMethod): Use
6942         `Type.IsAssignableFrom()' instead of `=='.
6943
6944 2003-12-18  Martin Baulig  <martin@ximian.com>
6945
6946         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
6947         byref types first.
6948
6949         * convert.cs (Convert.ImplicitStandardConversionExists): Use
6950         `expr_type.Equals (target_type)' instead of `=='.
6951
6952 2003-12-08  Martin Baulig  <martin@ximian.com>
6953
6954         * generics.cs (Constraints.Types): Removed.
6955         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
6956         to Type's.
6957         (Constraints.ResolveTypes): New public method; resolves the
6958         TypeExpr's to Type's.
6959         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
6960         longer takes the constraints.
6961         (TypeParameter.DefineMethod): Likewise.
6962         (TypeParameter.DefineType): New public method.  Calls
6963         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
6964         the constraints.
6965
6966 2003-12-08  Martin Baulig  <martin@ximian.com>
6967
6968         * convert.cs (Convert.ImplicitConversionStandard): Use
6969         `expr_type.Equals (target_type)' instead of `=='.
6970
6971 2003-12-08  Martin Baulig  <martin@ximian.com>
6972
6973         * typemanager.cs (TypeManager.GetReferenceType): Call
6974         `Type.MakeByRefType ()'.
6975
6976 2003-12-08  Martin Baulig  <martin@ximian.com>
6977
6978         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
6979         just has some special meaning in some situations.  For instance,
6980         it is allowed to use `where' as the name of a variable etc.
6981
6982 2003-12-04  Martin Baulig  <martin@ximian.com>
6983
6984         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
6985         `Type.MakeArrayType()' for array types.
6986
6987 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
6988
6989         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
6990         debugging message.
6991
6992         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
6993         corlib to compile.
6994
6995 2003-11-16  Martin Baulig  <martin@ximian.com>
6996
6997         * codegen.cs (EmitContext.IsGeneric): Removed.
6998
6999         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
7000         ResolveGeneric() on the DeclSpace.
7001
7002 2003-11-16  Martin Baulig  <martin@ximian.com>
7003
7004         * generic.cs (TypeArguments.Resolve):
7005         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
7006         `ResolveType()' on it to get the Type.
7007
7008 2003-11-15  Martin Baulig  <martin@ximian.com>
7009
7010         * generic.cs (ConstructedType.GetInterfaces): Override this.
7011
7012 2003-11-14  Martin Baulig  <martin@ximian.com>
7013
7014         * interface.cs (Interface.DefineType): Define all type parameters
7015         before adding the interfaces we inherit.
7016
7017 2003-11-11  Martin Baulig  <martin@ximian.com>
7018
7019         * generic.cs (ConstructedType.ResolveType): Always call
7020         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
7021
7022 2003-11-10  Martin Baulig  <martin@ximian.com>
7023
7024         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
7025         (TypeManager.InitCoreTypes): Initialize them here, but instead of
7026         calling `ResolveType()' on them, directly assign their `Type'.
7027
7028 2003-11-08  Martin Baulig  <martin@ximian.com>
7029
7030         * generic.cs (ConstructedType): Override `IsClass' etc.
7031
7032 2003-11-08  Martin Baulig  <martin@ximian.com>
7033
7034         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
7035         return value and the `out parent' parameter.
7036         (TypeContainer.DefineType): Moved the CS0644 check into
7037         GetClassBases().  Don't pass the interface types to the
7038         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
7039         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
7040
7041         * ecore.cs (TypeExpr.IsAttribute): New property.
7042         (TypeExpr.GetInterfaces): New method.
7043
7044         * interface.cs (Interface.GetInterfaceTypeByName): Return a
7045         TypeExpr instead of a Type.
7046         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
7047         (Interface.DefineType): Don't pass the interface types to the
7048         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
7049         them later and then call `TypeBulider.AddInterfaceImplementation()'.
7050
7051         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
7052         instead of a `Type[]'.
7053         (TypeManager.RegisterBuilder): Likewise.
7054         (TypeManager.AddUserInterface): Likewise.
7055         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
7056         `Type[]' and also return a `TypeExpr[]'.
7057         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
7058
7059 2003-11-08  Martin Baulig  <martin@ximian.com>
7060
7061         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
7062         Expression.     
7063
7064 2003-11-08  Martin Baulig  <martin@ximian.com>
7065
7066         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
7067         TypeManager.ResolveExpressionTypes().
7068
7069         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
7070         instead of an Expression.
7071         (TypeExpr): This is now an abstract base class for `TypeExpression'.
7072         (TypeExpression): New public class; formerly known as `TypeExpr'.
7073
7074         * expression.cs (ComposedCast): Derive from TypeExpr.
7075
7076         * typemanager.cs (TypeManager.system_*_expr): These are now
7077         TypExpr's instead of Expression's.
7078         (TypeManager.ResolveExpressionTypes): New public static function;
7079         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
7080         of them.        
7081
7082 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
7083
7084         * expression.cs (New.DoResolve): Do not dereference value that
7085         might be a null return.
7086
7087         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
7088         sure that the constant value has the right type.  Fixes an
7089         unreported bug, similar to 50425.
7090
7091         * const.cs (Const.LookupConstantValue): Call
7092         ImplicitStandardConversionExists before doing a conversion to
7093         avoid havng the TypeManager.ChangeType do conversions.
7094
7095         Reduced the number of casts used
7096
7097         (Const.ChangeType): New routine to enable reuse of the constant
7098         type changing code from statement.
7099
7100         * typemanager.cs (ChangeType): Move common initialization to
7101         static global variables.
7102
7103         Fixes #50425.
7104
7105         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
7106         every value type to go through, even if it was void.  Fix that. 
7107
7108         * cs-tokenizer.cs: Use is_identifier_start_character on the start
7109         character of the define, and the is_identifier_part_character for
7110         the rest of the string.
7111
7112 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
7113
7114         * expression.cs (UnaryMutator.EmitCode): When I updated
7115         LocalVariableReference.DoResolve, I overdid it, and dropped an
7116         optimization done on local variable references.
7117
7118 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
7119
7120         * ecore.cs: Convert the return from Ldlen into an int.
7121
7122 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
7123
7124         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
7125         the accessibility, this is a special case for toplevel non-public
7126         classes (internal for instance).
7127
7128 2003-10-20  Nick Drochak <ndrochak@gol.com>
7129
7130         * ecore.cs: Fix typo and build.  Needed another right paren.
7131
7132 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
7133
7134         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
7135         `internal' case regular and protected, but not allowing protected
7136         to be evaluated later.  Bug 49840
7137
7138 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
7139
7140         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
7141         to kb.Nlast, and not the kb.nFirst to isolate the switch
7142         statement.
7143
7144         Extract the underlying type, so enumerations of long/ulong are
7145         treated like long/ulong.
7146
7147 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
7148
7149         * expression.cs (New): Overload the meaning of RequestedType to
7150         track the possible creation of the NewDelegate type, since
7151         DoResolve is invoked more than once for new constructors on field
7152         initialization.
7153
7154         See bugs: #48800 and #37014
7155
7156         * cs-parser.jay (declare_local_constants): Take an arraylist
7157         instead of a single constant.
7158
7159         (local_constant_declaration): It should take a
7160         constant_declarators, not a constant_declarator.  Fixes 49487
7161
7162         * convert.cs: Fix error report.
7163
7164 2003-10-13 Jackson Harper <jackson@ximian.com>
7165
7166         * typemanager.cs (TypeToCoreType): Add float and double this fixes
7167         bug #49611
7168         
7169 2003-11-03  Martin Baulig  <martin@ximian.com>
7170
7171         * expression.cs (ArrayAccess.GetStoreOpcode): Added
7172         `out bool has_type_arg'; if set, we need to pass the type to
7173         ig.Emit().
7174         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
7175         Stelem_Any/Ldelem_Any for generic parameters.   
7176
7177 2003-11-02  Martin Baulig  <martin@ximian.com>
7178
7179         * expression.cs (Invocation.EmitCall): Use
7180         `TypeManager.IsValueType()' to check whether it's a value type.
7181         Don't set `struct_call' when calling a method on a type parameter.
7182
7183 2003-11-02  Martin Baulig  <martin@ximian.com>
7184
7185         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
7186         and removed the TypeBuilder argument.
7187
7188         * typemanager.cs (TypeManager.IsValueType): Return
7189         `t.IsGenericParameter || t.IsValueType'.
7190
7191 2003-10-25  Martin Baulig  <martin@ximian.com>
7192
7193         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
7194         call ConstructedType.Resolve() on it.
7195
7196         * generic.cs (ConstructedType.Resolve): Set `type' on success.
7197
7198 2003-10-25  Martin Baulig  <martin@ximian.com>
7199
7200         * class.cs (TypeContainer.GetClassBases): Changed
7201         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
7202         CS8214 reporting here.
7203         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
7204         instead of a `Type' for our parent.  In case of a recursive
7205         declaration (see tests/gen-23.cs for an example), our parent is a
7206         ConstructedType and it doesn't have its type set.  So, first
7207         create our own TypeBuilder, then call constructed.Resolve() to get
7208         the parent's type and finally TypeBuilder.SetParent() it.
7209
7210         * ecore.cs (TypeExpr.Name): New public virtual property.
7211
7212         * generic.cs
7213         (ConstructedType): We're now a TypeExpr and not just an Expression.
7214         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
7215         arguments here; this is done later.
7216         (ConstructedType.Resolve): New public method to resolve the type
7217         arguments and bind them.
7218
7219 2003-10-21  Martin Baulig  <martin@ximian.com>
7220
7221         * convert.cs: Use `TypeManager.IsValueType' instead of
7222         'type.IsValueType' everywhere.
7223
7224         * typemanager.cs (TypeManager.IsValueType): Return true for type
7225         parameters.  The reason for this is that we need to box a type
7226         parameter when converting it to a reference type.
7227
7228         * cs-parser.jay: Added support for default value expressions.
7229
7230         * generics.cs (DefaultValueExpression): New public class.       
7231
7232 2003-10-17  Martin Baulig  <martin@ximian.com>
7233
7234         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
7235         TypeContainer so we can also use this for Interfaces.
7236         (TypeParameter.Resolve): Likewise.
7237
7238         * interface.cs (Interface.DefineType): Added support for generic
7239         interfaces.
7240
7241         * cs-parser.jay: Added support for generic structs and interfaces.
7242
7243 2003-10-17  Martin Baulig  <martin@ximian.com>
7244
7245         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
7246         call generic methods :-)
7247
7248 2003-10-16  Martin Baulig  <martin@ximian.com>
7249
7250         * cs-parser.jay (namespace_or_type_name): Only create a
7251         GenericMemberAccess if we actually have type arguments.
7252
7253 2003-10-13  Martin Baulig  <martin@ximian.com>
7254
7255         * class.cs (Method.Define): If we're a generic method, call
7256         TypeBuilder.DefineGenericMethod () before resolving
7257         the parameters.
7258         (MethodData): Added .ctor which takes an additional MethodBuilder
7259         argument; this is used for generic methods.
7260         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
7261         we already have a MethodBuilder.
7262
7263 2003-10-10  Martin Baulig  <martin@ximian.com>
7264
7265         * class.cs (Method): Added .ctor which takes a `GenericMethod'
7266         instead of a `DeclSpace'.  This is used for generic methods.
7267
7268         * cs-parser.jay (method_header): Added support for generic
7269         methods; create a `GenericMethod' instance and pass it to the
7270         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
7271         parameters and locals.
7272
7273         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
7274         since we already have the location.  Check whether we're a generic
7275         type declaration or a generic method and create the correct type
7276         parameter.
7277
7278         * generic.cs (TypeParameter.DefineMethod): New public method.
7279         (GenericMethod): New public class; derives from DeclSpace and is
7280         used for generic methods.       
7281
7282 2003-10-09  Martin Baulig  <martin@ximian.com>
7283
7284         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
7285         to the .ctor.
7286         (MethodCore.DoDefineParameters): Removed the TypeContainer
7287         argument; use the DeclSpace which was passed to the .ctor instead.
7288         (MethodCore.CheckParameter): Take a DeclSpace instead of a
7289         TypeContainer; we only need a DeclSpace here.
7290
7291 2003-10-09  Martin Baulig  <martin@ximian.com>
7292
7293         * class.cs (MethodData): Added additional `DeclSpace ds' argument
7294         to the .ctor.
7295         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
7296         EmitContext's .ctor.    
7297
7298 2003-10-09  Martin Baulig  <martin@ximian.com>
7299
7300         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
7301         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
7302         AsAccessible(), moved them as well.
7303
7304         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
7305
7306 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
7307
7308         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
7309         generation for >=, as spotted by Paolo, bug 48679.  
7310         Patch from David Waite.
7311
7312         * cs-tokenizer.cs: Add handling for #pragma.
7313
7314         * cs-parser.jay: Allow for both yield and yield return in the
7315         syntax.  The anti-cobolization of C# fight will go on!
7316
7317         * class.cs (TypeBuilder.DefineType): Catch error condition here
7318         (Parent.DefineType erroring out and returning null).
7319
7320         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7321         coping with enumerations variables, we were mistakenly processing
7322         them as a regular value type instead of built-in types.  Fixes the
7323         bug #48063
7324
7325         * typemanager.cs (IsBuiltinOrEnum): New method.
7326
7327 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
7328
7329         * cs-parser.jay: Upgrade: yield now needs the return clause.
7330
7331 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
7332
7333         * cs-parser.jay : Renamed yyName to yyNames related to jay.
7334
7335 2003-09-29  Martin Baulig  <martin@ximian.com>
7336
7337         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
7338         inflated generic methods.
7339
7340         * generics.cs (ConstructedType): Distinguish between open and
7341         closed constructed types; correctly resolve the arguments.
7342
7343 2003-09-22  Martin Baulig  <martin@ximian.com>
7344
7345         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
7346         all type arguments meet their constraints.
7347
7348 2003-09-19  Martin Baulig  <martin@ximian.com>
7349
7350         * decl.cs (MemberCache.SetupCacheForInterface): Take a
7351         `MemberCache parent' argument.  Normally, an interface doesn't
7352         have a parent type except System.Object, but we use this in gmcs
7353         for generic type parameters.
7354
7355 2003-09-18  Martin Baulig  <martin@ximian.com>
7356
7357         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
7358         on `type.IsInterface'; don't check whether the type has a parent
7359         to determine whether it's an interface.
7360
7361 2003-09-17  Martin Baulig  <martin@ximian.com>
7362
7363         * generic.cs (ConstructedType.ToString): Always use `name' as the
7364         type name.
7365
7366 2003-09-15  Martin Baulig  <martin@ximian.com>
7367
7368         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
7369
7370         * generic.cs (Constraints.Resolve): New public method; this is
7371         called to resolve the constraint types and to check whether all
7372         the constraints are correct.
7373         (Constraints.Types): New public property.
7374         (TypeParameter.Resolve): New public method; resolves all the
7375         type's constraints.
7376
7377         * class.cs (TypeContainer.DefineType): Call
7378         TypeParameter.Resolve() before actually defining the type.
7379
7380 2003-09-15  Martin Baulig  <martin@ximian.com>
7381
7382         * class.cs (TypeContainer.DefineType): Added an error flag to
7383         avoid reporting duplicate CS0146's ("class definition is
7384         circular.").
7385
7386         * driver.cs (Driver.MainDriver): Abort if
7387         RootContext.ResolveTree() reported any errors.
7388
7389 2003-09-07  Martin Baulig  <martin@ximian.com>
7390
7391         * report.cs (Error, Warning): Added overloaded versions which take
7392         a `params object[] args' and call String.Format().
7393
7394 2003-09-07  Martin Baulig  <martin@ximian.com>
7395
7396         * decl.cs (DeclSpace..ctor): Don't call
7397         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
7398         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
7399         (DeclSpace.RecordDecl): New method.
7400
7401         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
7402
7403 2003-09-02  Ravi Pratap  <ravi@ximian.com>
7404
7405         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
7406         value attributes to be applied to ParameterBuilders.
7407
7408         * class.cs (MethodCore.LabelParameters): Make static and more
7409         generic so that it can be used from other places - like interface
7410         methods, for instance.
7411
7412         * interface.cs (Interface.Emit): Call LabelParameters before
7413         emitting attributes on the InterfaceMethod.
7414
7415 2003-09-07  Martin Baulig  <martin@ximian.com>
7416
7417         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
7418         if the number of type parameters doesn't match.
7419
7420 2003-09-04  Martin Baulig  <martin@ximian.com>
7421
7422         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
7423         for arrays of generic type params (ie. `!0[]').
7424
7425 2003-09-04  Martin Baulig  <martin@ximian.com>
7426
7427         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
7428         for the moment.
7429
7430 2003-09-04  Martin Baulig  <martin@ximian.com>
7431
7432         * decl.cs (DeclSpace.LookupGeneric): New method.
7433         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
7434         moment.
7435
7436         * generic.cs (TypeParameterExpr): Take a TypeParameter as
7437         argument, not just a string.
7438         (TypeParameter.Define): New public method; this is called to
7439         actually define the generic parameter; after this, you can use the
7440         new `Type' property to get the type.
7441
7442 2003-09-04  Martin Baulig  <martin@ximian.com>
7443
7444         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
7445         is now an ArrayList; initialize the result of the `TypeParameters'
7446         property here.
7447         (DeclSpace.GetGenericData): Removed.
7448         (DeclSpace.LookupGeneric): Temporarily removed; we need to
7449         implement this in a different way.
7450         (DeclSpace.GetTypeParameters): Removed; there's now a
7451         `TypeParameters' property.
7452         (DeclSpace.TypeParameters): New public property.
7453
7454         * generic.cs (Constraints): Make this class public.
7455         (TypeParameter): New public class.
7456
7457 2003-09-04  Martin Baulig  <martin@ximian.com>
7458
7459         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
7460         generic parameters.
7461
7462         * class.cs (TypeContainer.DefineType): Call
7463         TypeBuilder.DefineGenericParameter () on all generic parameters if
7464         this is a generic type.
7465
7466 2003-08-28  Martin Baulig  <martin@ximian.com>
7467
7468         * sample-stack.il: Compile this with ilasm: "ilasm /dll
7469         sample-stack.il".
7470
7471         * sample-hello.cs: Compile this with gmcs: "gmcs
7472         /r:sample-stack.dll sample-hello.cs".
7473
7474 2003-08-28  Martin Baulig  <martin@ximian.com>
7475
7476         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
7477         the parameters to the generic type.
7478
7479 2003-08-28  Martin Baulig  <martin@ximian.com>
7480
7481         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
7482
7483 2003-08-28  Martin Baulig  <martin@ximian.com>
7484
7485         * cs-parser.jay (opt_type_argument_list): Use
7486         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
7487         (primary_expression): Replace `qualified_identifier' with `type_name'.
7488         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
7489
7490         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
7491         parser to check whether it is syntactically a type parameter list;
7492         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
7493         this case.
7494
7495 2003-08-26  Martin Baulig  <martin@ximian.com>
7496
7497         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
7498         resolving aliases; fixes #47927.
7499
7500 2003-08-26  Martin Baulig  <martin@ximian.com>
7501
7502         * statement.cs (Using.DoResolve): This is internally emitting a
7503         try/finally clause, so we need to set ec.NeedExplicitReturn if we
7504         do not always return.  Fixes #47681.
7505
7506 2003-08-26  Martin Baulig  <martin@ximian.com>
7507
7508         * decl.cs (MemberCore): Moved WarningNotHiding(),
7509         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
7510         into MemberBase.
7511         (AdditionResult): Make this nested in DeclSpace.
7512         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
7513         argument; call NamespaceEntry.Define() unless we're nested in a
7514         class or struct.
7515
7516         * namespace.cs (Namespace.DefineName): New public function.  This
7517         is called from DeclSpace's .ctor to add 
7518         (Namespace.Lookup): Include DeclSpaces in the lookup.
7519
7520         * class.cs (Operator): Derive from MemberBase, not MemberCore.
7521
7522         * const.cs (Const): Derive from MemberBase, not MemberCore.     
7523
7524 2003-08-25  Martin Baulig  <martin@ximian.com>
7525
7526         * convert.cs (Convert.ExplicitReferenceConversion): When
7527         converting from an interface type to a class, unbox if the target
7528         type is a struct type.  Fixes #47822.
7529
7530 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7531
7532         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
7533         #47854.
7534
7535 2003-08-22  Martin Baulig  <martin@ximian.com>
7536
7537         * class.cs (TypeManager.DefineType): When defining a nested type,
7538         call DefineType() on our parent; fixes #47801.
7539
7540 2003-08-22  Martin Baulig  <martin@ximian.com>
7541
7542         * class.cs (MethodData.Define): While checking if a method is an
7543         interface implementation, improve the test a bit more to fix #47654.
7544
7545 2003-08-22  Martin Baulig  <martin@ximian.com>
7546
7547         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
7548         correctly; fixes #47722.
7549
7550 2003-08-22  Martin Baulig  <martin@ximian.com>
7551
7552         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
7553         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
7554
7555         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
7556
7557 2003-08-22  Martin Baulig  <martin@ximian.com>
7558
7559         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
7560         can only be assigned in static constructors.  Fixes #47161.
7561
7562 2003-08-22  Martin Baulig  <martin@ximian.com>
7563
7564         Rewrote and improved the flow analysis code.
7565
7566         * flowbranching.cs (FlowBranching): Make this class abstract.
7567         (FlowBranching.CreateBranching): New static function to create a
7568         new flow branching.
7569         (FlowBranchingBlock, FlowBranchingException): New classes.
7570         (FlowBranching.UsageVector.Type): New public readonly field.
7571         (FlowBranching.UsageVector.Breaks): Removed the setter.
7572         (FlowBranching.UsageVector.Returns): Removed the setter.
7573         (FlowBranching.UsageVector): Added Break(), Return(),
7574         NeverReachable() and Throw() methods to modify the reachability.
7575         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
7576         done by FlowBranching.Merge().
7577         (FlowBranching.UsageVector.MergeChild): New method; merges the
7578         merge result into the current vector.
7579         (FlowBranching.Merge): New abstract method to merge a branching.
7580
7581 2003-08-12  Martin Baulig  <martin@ximian.com>
7582
7583         * expression.cs (Indirection.CacheTemporaries): Create the
7584         LocalTemporary with the pointer type, not its element type.
7585
7586 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
7587
7588         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
7589         token was a keyword or not.
7590
7591         Add `error' options where an IDENTIFIER was expected;  Provide
7592         CheckToken and CheckIdentifierToken convenience error reporting
7593         functions. 
7594
7595         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
7596
7597         * decl.cs: Rename `NamespaceEntry Namespace' public field into
7598         NameSpaceEntry NameSpaceEntry.
7599
7600         (LookupInterfaceOrClass): Avoid creating a full qualified name
7601         from namespace and name: avoid doing lookups when we know the
7602         namespace is non-existant.   Use new Tree.LookupByNamespace which
7603         looks up DeclSpaces based on their namespace, name pair.
7604
7605         * driver.cs: Provide a new `parser verbose' to display the
7606         exception thrown during parsing.  This is turned off by default
7607         now, so the output of a failure from mcs is more graceful.
7608
7609         * namespace.cs: Track all the namespaces defined in a hashtable
7610         for quick lookup.
7611
7612         (IsNamespace): New method
7613
7614 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
7615
7616         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
7617         we know that we need to concatenate (full typename can never be
7618         null). 
7619
7620         * class.cs: ditto.
7621
7622         * statement.cs: Use a bitfield;  Do not initialize to null things
7623         which are done by the constructor by default.
7624
7625         * cs-parser.jay: bug fix, parameter was 4, not 3.
7626
7627         * expression.cs: Just use the property;
7628
7629         * statement.cs: No need for GetVariableInfo method.
7630
7631 2003-08-08  Martin Baulig  <martin@ximian.com>
7632
7633         * flowanalysis.cs (FlowReturns): This is now nested in the
7634         `FlowBranching' class.
7635         (MyBitVector): Moved this here from statement.cs.
7636         (FlowBranching.SiblingType): New enum type.
7637         (FlowBranching.CreateSibling): Added `SiblingType' argument.
7638
7639 2003-08-07  Martin Baulig  <martin@ximian.com>
7640
7641         * flowanalysis.cs (FlowBranchingType): This is now nested in the
7642         `FlowBranching' class and called `BranchingType'.
7643
7644 2003-08-07  Martin Baulig  <martin@ximian.com>
7645
7646         * flowanalysis.cs: Moved all the control flow analysis code into
7647         its own file.
7648
7649 2003-08-07  Martin Baulig  <martin@ximian.com>
7650
7651         * assign.cs (Assign.DoResolve): `target' must either be an
7652         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
7653         #37319.
7654
7655 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
7656
7657         * expression.cs (BinaryMethod): This kind of expression is created by the
7658         Binary class if it determines that the operator has to be handled
7659         by a method.
7660
7661         (BinaryDelegate): This kind of expression is created if we are
7662         dealing with a + or - operator on delegates.
7663
7664         (Binary): remove method, argumetns, and DelegateOperator: when
7665         dealing with methods, 
7666
7667         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
7668
7669         * statement.cs (Block): use bitfields for the three extra booleans
7670         we had in use.   Remove unused topblock parameter.
7671
7672         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
7673
7674         * assign.cs: Drop extra unneeded tests.
7675
7676 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
7677
7678         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
7679
7680         * statement.cs (Foreach): Use VariableStorage instead of
7681         LocalBuilders.   
7682
7683         * codegen.cs (VariableStorage): New class used by clients that
7684         require a variable stored: locals or fields for variables that
7685         need to live across yield.
7686
7687         Maybe provide a convenience api for EmitThis+EmitLoad?
7688
7689         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
7690         these bad boys.
7691
7692 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
7693
7694         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
7695         RemapParameterLValue): New methods that are used to turn a
7696         precomputed FieldInfo into an expression like this:
7697
7698                 instance.FieldInfo
7699
7700         The idea is to use this instead of making LocalVariableReference
7701         have more than one meaning.
7702
7703         * cs-parser.jay: Add error production to BASE.
7704
7705         * ecore.cs: Deal with TypeManager.GetField returning null, which
7706         is now a valid return value.
7707
7708         (FieldExprNoAddress): New expression for Fields whose address can
7709         not be taken.
7710
7711         * expression.cs (LocalVariableReference): During the resolve
7712         phases, create new expressions if we are in a remapping context.
7713         Remove code that dealt with remapping here.
7714
7715         (ParameterReference): same.
7716
7717         (ProxyInstance): New expression, like the `This' expression, but
7718         it is born fully resolved.  We know what we are doing, so remove
7719         the errors that are targeted to user-provided uses of `this'.
7720
7721         * statement.cs (Foreach): our variable is now stored as an
7722         Expression;  During resolution, follow the protocol, dont just
7723         assume it will return this.
7724
7725 2003-08-06  Martin Baulig  <martin@ximian.com>
7726
7727         * support.cs (SeekableStreamReader.cs): New public class.
7728
7729         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
7730         SeekableStreamReader instead of the normal StreamReader.
7731
7732 2003-08-04  Martin Baulig  <martin@ximian.com>
7733
7734         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
7735         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
7736         deambiguate casts and delegate invocations.
7737         (parenthesized_expression): Use the new tokens to ensure this is
7738         not a cast of method invocation.
7739
7740         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
7741         when reading a `)' and Deambiguate_CloseParens () was previously
7742         called.
7743
7744         * expression.cs (ParenthesizedExpression): New class.  This is
7745         just used for the CS0075 test.
7746         (Binary.DoResolve): Check for CS0075.   
7747
7748 2003-07-29  Ravi Pratap  <ravi@ximian.com>
7749
7750         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
7751         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
7752         reference comparison.
7753
7754         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
7755         examine the ReturnType for equality - this is necessary in the
7756         cases of implicit and explicit operators whose signature also
7757         includes the return type.
7758
7759 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
7760
7761         * namespace.cs: Cache the result of the namespace computation,
7762         instead of computing it every time.
7763
7764 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7765
7766         * decl.cs: Use a global arraylist that we reuse over invocations
7767         to avoid excesive memory consumption.  Reduces memory usage on an
7768         mcs compile by one meg (45 average).
7769
7770         * typemanager.cs (LookupTypeReflection): In .NET pointers are
7771         private, work around that.
7772
7773 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
7774
7775         * literal.cs (IntLiteral): Define Zero and One static literals. 
7776
7777         * cs-parser.jay (integer_literal): use static literals to reduce
7778         memory usage for the most used literals (0, 1 and -1).  211kb
7779         reduced in memory usage.
7780
7781         Replace all calls to `new ArrayList' with `new
7782         ArrayList(4)' which is a good average number for most allocations,
7783         and also requires only 16 bytes of memory for its buffer by
7784         default. 
7785
7786         This reduced MCS memory usage in seven megabytes for the RSS after
7787         bootstrapping.
7788
7789 2003-07-28  Ravi Pratap  <ravi@ximian.com>
7790
7791         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
7792         handle params methods the correct way by forming only one
7793         applicable set with params and normal methods in them. Earlier we
7794         were looking at params methods only if we found no normal methods
7795         which was not the correct thing to do.
7796
7797         (Invocation.BetterFunction): Take separate arguments indicating
7798         when candidate and the best method are params methods in their
7799         expanded form.
7800
7801         This fixes bugs #43367 and #46199.
7802
7803         * attribute.cs: Documentation updates.
7804
7805         (CheckAttribute): Rename to CheckAttributeTarget.
7806         (GetValidPlaces): Rename to GetValidTargets.
7807
7808         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
7809         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
7810
7811         Fixes bug #44468.
7812
7813 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
7814
7815         * codegen.cs: Compute IsGeneric correctly.
7816
7817         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
7818         resolution. 
7819
7820         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
7821         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
7822         regressions, and I was chasing more bugs than I required.
7823
7824         * interface.cs: Use expressions for base type names (like classes
7825         and structs have been doing for a while now), and resolve that.
7826         This patch should probably go into head as well.
7827
7828         This makes it one less user of FindType.
7829
7830 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7831
7832         This compiler can not self host currently.  Need to fix that.
7833         
7834         * Makefile: compile to `gmcs.exe'
7835
7836         * driver.cs: Turn on v2 by default on gmcs.
7837
7838         * generic.cs (ConstructedType): Does no longer take a container
7839         type argument;  That will be taken care of later.
7840
7841         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
7842         Use SimpleName to resolve for now, so we can continue the work on
7843         the parser, until we get Type.GetType that understands generics.
7844
7845         (ConstructedType.ToString): Implement
7846
7847         (TypeArguments.Resolve): Resolve the child expressions as types. 
7848         
7849         * cs-parser.jay: Rename interface_constraints to
7850         type_parameter_constraints
7851
7852         (namespace_or_type_name): Only use constructed types for the basic
7853         construction, we will deal with identifier<...> later.
7854
7855         (type/type_name): No longer call DecomposeQI, as
7856         namespace_or_type_name is always decoded now.
7857         
7858 2003-07-22  Ravi Pratap  <ravi@ximian.com>
7859
7860         * expression.cs (Invocation.OverloadResolve): Follow the spec more
7861         closely: we eliminate methods in base types when we have an
7862         applicable method in a top-level type.
7863
7864         Please see section 14.5.5.1 for an exact description of what goes
7865         on. 
7866
7867         This fixes bug #45127 and a host of other related to corlib compilation.
7868
7869         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
7870         array is the method corresponding to the top-level type (this is
7871         because of the changes made to icall.c) so we change this
7872         accordingly.
7873
7874         (MethodGroupExpr.Name): This too.
7875
7876         * typemanager.cs (GetElementType): New method which does the right
7877         thing when compiling corlib. 
7878
7879         * everywhere: Make use of the above in the relevant places.
7880
7881 2003-07-22  Martin Baulig  <martin@ximian.com>
7882
7883         * cs-parser.jay (invocation_expression): Moved
7884         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
7885         `cast_expression', but create a InvocationOrCast which later
7886         resolves to either an Invocation or a Cast.
7887
7888         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
7889         method; call this before EmitStatement() to make sure that this
7890         expression can be used as a statement.
7891
7892         * expression.cs (InvocationOrCast): New class; resolves to either
7893         an Invocation or a Cast.
7894
7895         * statement.cs (StatementExpression): Call ResolveStatement() on
7896         the ExpressionStatement before emitting it.
7897
7898 2003-07-21  Martin Baulig  <martin@ximian.com>
7899
7900         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
7901         `ref' and `out' attributes match; fixes #46220.
7902         (MemberAccess.ResolveMemberAccess): You can't reference a type
7903         through an expression; fixes #33180.
7904         (Indexers.GetIndexersForType): Don't return the indexers from
7905         interfaces the class implements; fixes #46502.
7906
7907 2003-07-21  Martin Baulig  <martin@ximian.com>
7908
7909         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
7910         CS0661 checks; fixes bug #30442.
7911
7912 2003-07-21  Martin Baulig  <martin@ximian.com>
7913
7914         * decl.cs (AdditionResult): Added `Error'.
7915
7916         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
7917
7918         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
7919         cs0031.cs actually work.
7920
7921  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7922  
7923         * cs-parser.jay (namespace_name): do not use
7924         namespace_or_type_name, use qualified_identifier, because
7925         namespace_or_type_name will soon return a composed expression
7926         instead of a string.
7927  
7928         (namespace_or_type_name): Instead of returning a string, now this
7929         production returns an expression.
7930  
7931         * codegen.cs (EmitContext): Setup IsGeneric property based on
7932         whether our DeclSpace is generic, our the method is generic.
7933  
7934         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
7935         the method is generic.
7936  
7937         * cs-parser.jay (type_arguments, opt_type_argument_list,
7938         type_parameters, type_parameter_list, opt_type_parameter_list,
7939         type_parameter,, opt_type_parameter_constraints_clauses,
7940         type_parameter_constraints_clauses,
7941         type_parameter_constraint_clause, type_parameter_constraint,
7942         interface_constraints): Add new production
7943  
7944         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
7945         DeclSpace is generic or not.
7946  
7947         (DeclSpace.SetParameterInfo): New routine, used to set the
7948         parameter info for a type.
7949  
7950         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
7951         returns a GenericTypeExpr
7952  
7953         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
7954         generic, lookup the generic argument.
7955  
7956         * attribute.cs: Do not allow TypeParameterExpressions in
7957         Attributes.
7958  
7959         * class.cs: Do not allow the Main method to be defined in a
7960         Generic container.
7961  
7962         * expression.cs (SizeOf): Do not allow generic types to be used as
7963         arguments to sizeof.
7964  
7965         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
7966         it: whether a type is generic or not.  Only works for types we are
7967         currently building for now.
7968         
7969 2003-07-20  Martin Baulig  <martin@ximian.com>
7970
7971         * namespace.cs: Fixed that bug which caused a crash when compiling
7972         the debugger's GUI.
7973
7974 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7975
7976         * typemanager.cs (LookupTypeReflection): Never expose types which
7977         are NotPublic, NestedPrivate, NestedAssembly, or
7978         NestedFamANDAssem.  We used to return these, and later do a check
7979         that would report a meaningful error, but the problem is that we
7980         would not get the real match, if there was a name override.
7981
7982 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
7983
7984         * namespace.cs (Namespace, Name): Do not compute the namespace
7985         name dynamically, compute it in the constructor.  This reduced
7986         memory usage by 1697 KB.
7987
7988         * driver.cs: Use --pause to pause at the end.
7989
7990 2003-07-17  Peter Williams  <peter@newton.cx>
7991
7992         * Makefile: Change the name of the test target so that it doesn't
7993         conflict with the recursive test target.
7994
7995 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
7996
7997         * expression.cs (LocalVariableReference.Emit, EmitAssign,
7998         AddressOf): Do not use EmitThis, that was wrong, use the actual
7999         this pointer.
8000
8001 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
8002
8003         * class.cs (MethodData.Define): While checking if a method is an
8004         interface implementation, improve the test: If we are not public
8005         (use new test here: use the computed MethodAttributes directly,
8006         instead of the parsed modifier flags) check if the `implementing'
8007         method comes from an interface or not.
8008
8009         * pending.cs (VerifyPendingMethods): Slightly better error
8010         message.
8011
8012         * makefile: add test target that does the mcs bootstrap.
8013
8014 2003-07-16  Ravi Pratap  <ravi@ximian.com>
8015
8016         * interface.cs (Define): Do nothing here since there are no
8017         members to populate etc. Move the attribute emission out of here
8018         since this was just totally the wrong place to put it. Attribute
8019         application happens during the 'Emit' phase, not in the 'Define'
8020         phase.
8021
8022         (Emit): Add this method and move the attribute emission here
8023
8024         * rootcontext.cs (EmitCode): Call the Emit method on interface
8025         types too.
8026
8027 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
8028
8029         * expression.cs (OverloadResolve): Report error only if Location
8030         is not 'Null' which means that there was a probe going on.
8031
8032 2003-07-14  Martin Baulig  <martin@ximian.com>
8033
8034         * expression.cs (ConditionalLogicalOperator): New public class to
8035         implement user defined conditional logical operators.
8036         This is section 14.11.2 in the spec and bug #40505.
8037
8038 2003-07-14  Martin Baulig  <martin@ximian.com>
8039
8040         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
8041
8042 2003-07-14  Martin Baulig  <martin@ximian.com>
8043
8044         * codegen.cs (EmitContext.InFixedInitializer): New public field.
8045
8046         * ecore.cs (IVariable.VerifyFixed): New interface method.
8047
8048         * expression.cs (Unary.ResolveOperator): When resolving the `&'
8049         operator, check whether the variable is actually fixed.  Fixes bug
8050         #36055.  Set a variable definitely assigned when taking its
8051         address as required by the spec.
8052
8053         * statement.cs (LocalInfo.IsFixed): New field.
8054         (LocalInfo.MakePinned): Set `IsFixed' to true.
8055
8056 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
8057
8058         * attribute.cs (Attribute.Resolve): While doing a Member lookup
8059         for .ctors, ensure that we only ask for members declared in the
8060         attribute type (BindingFlags.DeclaredOnly).
8061
8062         Fixes bug #43632.
8063
8064         * expression.cs (Error_WrongNumArguments): Report error 1501
8065         correctly the way CSC does.
8066
8067 2003-07-13  Martin Baulig  <martin@ximian.com>
8068
8069         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
8070         lookup on the fully qualified name, to make things like "X.X" work
8071         where "X.X" is a fully qualified type name, but we also have a
8072         namespace "X" in the using list.  Fixes #41975.
8073
8074 2003-07-13  Martin Baulig  <martin@ximian.com>
8075
8076         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
8077         function. If we're a CompoundAssign, we need to create an embedded
8078         CompoundAssign, not an embedded Assign.
8079         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
8080         Fixes #45854.
8081
8082 2003-07-13  Martin Baulig  <martin@ximian.com>
8083
8084         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
8085         work to fix bug #46088.
8086
8087 2003-07-13  Ravi Pratap <ravi@ximian.com>
8088
8089         * class.cs (Operator.Emit): Do not emit attributes here - it is
8090         taken care of by the Method class that we delegate too. This takes
8091         care of bug #45876.
8092
8093 2003-07-10  Martin Baulig  <martin@ximian.com>
8094
8095         * expression.cs (TypeOfVoid): New class.
8096         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
8097
8098 2003-07-10  Martin Baulig  <martin@ximian.com>
8099
8100         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
8101         bug #35957.
8102
8103 2003-07-10  Martin Baulig  <martin@ximian.com>
8104
8105         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
8106         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
8107
8108         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
8109
8110         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
8111
8112 2003-07-10  Martin Baulig  <martin@ximian.com>
8113
8114         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
8115         of decimal.  Fixes #42850.
8116
8117         NOTE: I also fixed the created byte blob, but this doesn't work on
8118         the MS runtime and csc never produces any byte blobs for decimal
8119         arrays.
8120
8121 2003-07-10  Martin Baulig  <martin@ximian.com>
8122
8123         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
8124         structs; fixes #32068.
8125         (Block.AddChildVariableNames): Fixed #44302.
8126
8127 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8128
8129         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
8130
8131 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8132
8133         * attribute.cs: And this test is onger needed.
8134
8135 2003-07-08  Martin Baulig  <martin@ximian.com>
8136
8137         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
8138         inaccessible types.  Fixes #36313.
8139
8140         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
8141
8142         * namespace.cs (NamespaceEntry): Create implicit entries for all
8143         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
8144         implicit entries for N1.N2 and N1.
8145
8146 2003-07-08  Martin Baulig  <martin@ximian.com>
8147
8148         Rewrote the handling of namespaces to fix a lot of the issues
8149         wrt. `using' aliases etc.
8150
8151         * namespace.cs (Namespace): Splitted this class into a
8152         per-assembly `Namespace' and a per-file `NamespaceEntry'.
8153
8154         * typemanager.cs (TypeManager.IsNamespace): Removed.
8155         (TypeManager.ComputeNamespaces): Only compute namespaces from
8156         loaded assemblies here, not the namespaces from the assembly we're
8157         currently compiling.
8158
8159 2003-07-08  Martin Baulig  <martin@ximian.com>
8160
8161         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
8162
8163 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8164
8165         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
8166         already fixed it.  
8167
8168         I thought about the memory savings here, but LookupTypeReflection
8169         is used under already very constrained scenarios.  Compiling
8170         corlib or mcs only exposes one hit, so it would not really reduce
8171         any memory consumption.
8172
8173 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8174
8175         * typemanager.cs: fixes bug #45889 by only adding public types from
8176         other assemblies to the list of known types.
8177
8178 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8179
8180         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
8181         on the type we resolved.
8182
8183 2003-07-05  Martin Baulig  <martin@ximian.com>
8184
8185         * pending.cs (PendingImplementation.ParentImplements): Don't
8186         create the proxy if the parent is abstract.
8187
8188         * class.cs (TypeContainer.DefineIndexers): Process explicit
8189         interface implementations first.  Fixes #37714.
8190
8191 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
8192
8193         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
8194         defined recursively;  but since we modify the input parameters
8195         (left is set to `this' temporarily), we reset this value if the
8196         left_is_explicit is false, which gives the original semantics to
8197         the code.  
8198
8199         * literal.cs (NullPointer): new class used to represent a null
8200         literal in a pointer context.
8201
8202         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
8203         type is a pointer, use a NullPointer object instead of a
8204         NullLiteral.   Closes 43687
8205
8206         (ExplicitConversion): Convert pointer values using
8207         the conv opcode to the proper type.
8208
8209         * ecore.cs (New): change ValueTypeVariable property into a method,
8210         that returns whether the valuetype is suitable for being used.
8211
8212         * expression.cs (Binary.DoNumericPromotions): Only return if we
8213         the int constant was a valid uint, and we can return both left and
8214         right as uints.  If not, we continue processing, to trigger the
8215         type conversion.  This fixes 39018.
8216
8217         * statement.cs (Block.EmitMeta): During constant resolution, set
8218         the CurrentBlock property on the emitcontext, so that we resolve
8219         constants propertly.
8220
8221 2003-07-02  Martin Baulig  <martin@ximian.com>
8222
8223         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
8224         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
8225
8226         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
8227         than emitting it here.
8228
8229         * statement.cs: Fixed some more flow analysis bugs.
8230
8231 2003-07-02  Martin Baulig  <martin@ximian.com>
8232
8233         * class.cs (MethodData.Define): When implementing interface
8234         methods, set Final unless we're Virtual.
8235
8236         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
8237         check work for interface methods.
8238
8239 2003-07-01  Martin Baulig  <martin@ximian.com>
8240
8241         * ecore.cs (EmitContext.This): Replaced this property with a
8242         GetThis() method which takes a Location argument.  This ensures
8243         that we get the correct error location for a CS0188.
8244
8245 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
8246
8247         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
8248         ImplicitStandardConversion.
8249
8250         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
8251
8252 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
8253
8254         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
8255         optimization.
8256
8257 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
8258
8259         * class.cs (Constructor.Define): Turn off initlocals for unsafe
8260         constructors.
8261
8262         (MethodData.Define): Turn off initlocals for unsafe methods.
8263
8264 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
8265
8266         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
8267         complete;  Fixes #37521.
8268
8269         * delegate.cs: Use Modifiers.TypeAttr to compute the
8270         TypeAttributes, instead of rolling our own.  This makes the flags
8271         correct for the delegates.
8272
8273 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
8274
8275         * class.cs (Constructor.Define): Set the private flag for static
8276         constructors as well.
8277
8278         * cs-parser.jay (statement_expression): Set the return value to
8279         null, to avoid a crash when we catch an error.
8280
8281 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
8282
8283         * cs-parser.jay: Applied patch from Jackson that adds support for
8284         extern and unsafe modifiers to destructor declarations.
8285
8286         * expression.cs: Report error 21 if the user is trying to index a
8287         System.Array.
8288
8289         * driver.cs: Add an error message, suggested by the bug report.
8290
8291         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
8292         if we do not have a ": this ()" constructor initializer.  Fixes 45149
8293
8294 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
8295
8296         * namespace.cs: Add some information to reduce FAQs.
8297
8298 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
8299
8300         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
8301         underlying enumeration types.  Fixes #43915.
8302
8303         * expression.cs: Treat ushort/short as legal values to be used in
8304         bitwise operations.
8305
8306 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
8307
8308         * delegate.cs: transfer custom attributes for paramenters from
8309         the delegate declaration to Invoke and BeginInvoke.
8310
8311 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
8312
8313         * attribute.cs: handle custom marshalers and emit marshal info
8314         for fields, too.
8315
8316 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
8317
8318         * makefile.gnu: Added anonymous.cs to the compiler sources.
8319
8320 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
8321
8322         * iterators.cs: Change the name of the proxy class to include two
8323         underscores.
8324
8325         * cs-parser.jay: Update grammar to include anonymous methods.
8326
8327         * anonymous.cs: new file.
8328
8329 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
8330
8331         * class.cs (Field.Define): Add missing test for pointers and
8332         safety. 
8333
8334 2003-05-27  Ravi Pratap  <ravi@ximian.com>
8335
8336         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
8337         we use the stobj opcode.
8338
8339         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
8340         since it wasn't the correct fix. 
8341
8342         It still is puzzling that we are required to use stobj for IntPtr
8343         which seems to be a ValueType.
8344
8345 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
8346
8347         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
8348         during regular simple name resolution.   Now, the trick is that
8349         instead of returning for processing the simplename, we do a
8350         TypeManager.LookupType (ie, a rooted lookup as opposed to a
8351         contextual lookup type).   If a match is found, return that, if
8352         not, return for further composition.
8353
8354         This fixes long-standing 30485.
8355
8356         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
8357         using the address to initialize an object, do an Stobj instead of
8358         using the regular Stelem.
8359
8360         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
8361         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
8362         Because if we are a BaseIndexerAccess that value will be true.
8363         Fixes 43643.
8364
8365         * statement.cs (GotoCase.Resolve): Return after reporting an
8366         error, do not attempt to continue. 
8367
8368         * expression.cs (PointerArithmetic.Emit): If our operand is a
8369         long, convert our constants to match the operand before
8370         multiplying.  Convert to I type before adding.   Fixes 43670.
8371
8372 2003-05-14  Ravi Pratap  <ravi@ximian.com>
8373
8374         * enum.cs (ImplicitConversionExists) : Rename to
8375         ImplicitEnumConversionExists to remove ambiguity. 
8376
8377         * ecore.cs (NullCast): New type of cast expression class which
8378         basically is very similar to EmptyCast with the difference being
8379         it still is a constant since it is used only to cast a null to
8380         something else
8381         (eg. (string) null)
8382
8383         * convert.cs (ImplicitReferenceConversion): When casting a null
8384         literal, we return a NullCast.
8385
8386         * literal.cs (NullLiteralTyped): Remove - I don't see why this
8387         should be around anymore.
8388
8389         The renaming (reported was slightly wrong). Corrections:
8390
8391         ConvertImplicitStandard -> ImplicitConversionStandard
8392         ConvertExplicitStandard -> ExplicitConversionStandard
8393
8394         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
8395         before passing them in !
8396
8397         * convert.cs (ImplicitConversionStandard): When comparing for
8398         equal expr and target types, ensure that expr is not a
8399         NullLiteral.
8400
8401         In general, we must not be checking (expr_type ==
8402         target_type) in the top level conversion methods
8403         (ImplicitConversion, ExplicitConversion etc). This checking is
8404         done in the methods that they delegate to.
8405
8406 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
8407
8408         * convert.cs: Move Error_CannotConvertType,
8409         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
8410         ImplicitNumericConversion, ImplicitConversionExists,
8411         ImplicitUserConversionExists, StandardConversionExists,
8412         FindMostEncompassedType, FindMostSpecificSource,
8413         FindMostSpecificTarget, ImplicitUserConversion,
8414         ExplicitUserConversion, GetConversionOperators,
8415         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
8416         TryImplicitIntConversion, Error_CannotConvertImplicit,
8417         ConvertImplicitRequired, ConvertNumericExplicit,
8418         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
8419         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
8420         its own file.
8421
8422         Perform the following renames:
8423
8424         StandardConversionExists -> ImplicitStandardConversionExists
8425         ConvertImplicit -> ImplicitConversion
8426         ConvertImplicitStandard -> ImplicitStandardConversion
8427         TryImplicitIntConversion -> ImplicitIntConversion
8428         ConvertImplicitRequired -> ImplicitConversionRequired
8429         ConvertNumericExplicit -> ExplicitNumericConversion
8430         ConvertReferenceExplicit -> ExplicitReferenceConversion
8431         ConvertExplicit -> ExplicitConversion
8432         ConvertExplicitStandard -> ExplicitStandardConversion
8433
8434 2003-05-19  Martin Baulig  <martin@ximian.com>
8435
8436         * statement.cs (TypeInfo.StructInfo): Made this type protected.
8437         (TypeInfo): Added support for structs having structs as fields.
8438
8439         * ecore.cs (FieldExpr): Implement IVariable.
8440         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
8441         VariableInfo for the field.
8442
8443 2003-05-18  Martin Baulig  <martin@ximian.com>
8444
8445         * expression.cs (This.DoResolve): Report a CS0027 if we're
8446         emitting a field initializer.
8447
8448 2003-05-18  Martin Baulig  <martin@ximian.com>
8449
8450         * expression.cs (This.ResolveBase): New public function.
8451         (This.DoResolve): Check for CS0188.
8452
8453         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
8454         This.Resolve().
8455
8456         * ecore.cs (MethodGroupExpr.DoResolve): Set the
8457         `instance_expression' to null if we don't have any non-static
8458         methods.
8459
8460 2003-05-18  Martin Baulig  <martin@ximian.com>
8461
8462         Reworked the way how local variables and parameters are handled by
8463         the flow analysis code.
8464
8465         * statement.cs (TypeInfo, VariableMap): New public classes.
8466         (VariableInfo): New public class.  This is now responsible for
8467         checking whether a variable has been assigned.  It is used for
8468         parameters and local variables.
8469         (Block.EmitMeta): Take the InternalParameters as argument; compute
8470         the layout of the flow vectors here.
8471         (Block.LocalMap, Block.ParameterMap): New public properties.
8472         (FlowBranching): The .ctor doesn't get the InternalParameters
8473         anymore since Block.EmitMeta() now computes the layout of the flow
8474         vector.
8475         (MyStructInfo): This class is now known as `StructInfo' and nested
8476         in `TypeInfo'; we don't access this directly anymore.
8477
8478         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
8479         property and removed IsAssigned(), IsFieldAssigned(),
8480         SetAssigned() and SetFieldAssigned(); we now call them on the
8481         VariableInfo so we don't need to duplicate this code everywhere.
8482
8483         * expression.cs (ParameterReference): Added `Block block' argument
8484         to the .ctor.
8485         (LocalVariableReference, ParameterReference, This): The new
8486         VariableInfo class is now responsible for all the definite
8487         assignment stuff.
8488
8489         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
8490         IsParameterAssigned, SetParameterAssigned): Removed.
8491
8492 2003-05-18  Martin Baulig  <martin@ximian.com>
8493
8494         * typemanager.cs (InitCoreTypes): Try calling
8495         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
8496         the 3-args-version.  Corlib now also needs our `void_type'.
8497         (GetMethod): Added overloaded version which takes an optional
8498         `bool report_errors' to allow lookups of optional methods.
8499
8500 2003-05-12  Martin Baulig  <martin@ximian.com>
8501
8502         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
8503         only used for locals and not for parameters.
8504
8505 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
8506
8507         * support.cs (InternalParameters.ParameterType): Return the
8508         ExternalType of the parameter.
8509
8510         * parameter.cs (Parameter.ExternalType): drop the two arguments,
8511         they were unused.
8512
8513 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
8514
8515         * class.cs (MethodData.Define): Do not set the `newslot' on
8516         interface members, if they are also flagged as "override".
8517
8518         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
8519         better code for ++i and i++.  This only works for static fields
8520         and local variables.
8521
8522         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
8523         want to pull the DeclSpace out of the builder_to_declspace instead
8524         of the TypeBuilder (like in TypeContainer.FindMembers).
8525
8526         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
8527         instead of LookupTypeContainer.  Fixes the crash on .NET for
8528         looking up interface members.
8529
8530         * const.cs: Create our own emit context during the Definition
8531         stage, so that constants are evaluated in the proper context, when
8532         a recursive definition happens.
8533
8534 2003-05-11  Martin Baulig  <martin@ximian.com>
8535
8536         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
8537         new block for a switch section.
8538         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
8539         the adding/lookup in the switch block.  Fixes #39828.
8540
8541 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
8542
8543         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
8544         functionality: I needed to convert the data after I had performed
8545         the add/sub operation into the operands type size.
8546
8547         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
8548         pass the type for the box operation, otherwise the resulting
8549         object would have been of type object.
8550
8551         (BoxedCast): Add constructor to specify the type to box as.
8552
8553 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
8554
8555         * iterators.cs: I was reusing the `count' variable inadvertently,
8556         take steps to not allow this to happen.
8557
8558 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
8559
8560         * attribute.cs (Attribute.Resolve): Params attributes are encoded
8561         by creating an array at the point where the params starts and
8562         putting all those arguments there, then adjusting the size of the
8563         array.
8564
8565 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
8566
8567         * expression.cs (New.AddressOf): Implement interface
8568         IMemoryLocation.  This is used when the `new' operator is used in
8569         the context of an invocation to a method on a value type.
8570
8571         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
8572         example. 
8573
8574         * namespace.cs: Also check the using aliases here.
8575
8576         * driver.cs: Move the test for using validity after the types have
8577         been entered, so we do a single pass that also includes the using
8578         aliases. 
8579
8580         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
8581         in the regular case.   CreateSiblingForFinally is doing extra
8582         error checking.
8583
8584         * attribute.cs (GetAttributeArgumentExpression): Store the result
8585         on an out value, and use the return value to indicate failure
8586         instead of using null (which is a valid return for Constant.GetValue).
8587
8588         * statement.cs: Perform the analysis flow for the increment
8589         portion after the statement, because this will be the real flow of
8590         execution.  Fixes #42385
8591
8592         * codegen.cs (EmitContext.EmitArgument,
8593         EmitContext.EmitStoreArgument): New helper functions when the
8594         RemapToProxy flag is set.
8595
8596         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
8597         function.
8598
8599         Add support for remapping parameters. 
8600
8601         * iterators.cs: Propagate parameter values;  Store parameter
8602         values in the proxy classes.
8603
8604 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
8605
8606         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
8607         need a proxy reference;  I do not know what I was thinking
8608
8609         * cs-parser.jay (constructor_initializer): catch another error,
8610         and display nice message.
8611
8612         (field_declaration): catch void field declaration
8613         to flag a better error. 
8614
8615         * class.cs (MemberBase.CheckBase): Report an error instead of a
8616         warning if a new protected member is declared in a struct. 
8617         (Field.Define): catch the error of readonly/volatile.
8618
8619         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
8620
8621         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
8622         volatile variable is taken
8623
8624 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
8625
8626         * statement.cs (Fixed.Resolve): Report an error if we are not in
8627         an unsafe context.
8628
8629 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
8630
8631         * typemanager.cs: reuse the code that handles type clashes for
8632         delegates and enumerations.
8633
8634         * class.cs (Report28): Always report.
8635
8636         * expression.cs (EncodeAsAttribute): Allow nulls here.
8637
8638 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
8639
8640         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
8641         the functionality for testing whether an expression is valid for
8642         an attribute here.  Also handle the case of arrays of elements
8643         being stored. 
8644
8645         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
8646         encoding a linear array into an array of objects that are suitable
8647         to be passed to an CustomAttributeBuilder.
8648
8649         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
8650
8651         * ecore.cs: (FieldExpr): Handle field remapping here.
8652
8653         * iteratators.cs: Pass the instance variable (if the method is an
8654         instance method) to the constructors, so we can access the field
8655         variables on the class.
8656
8657         TODO: Test this with structs.  I think the THIS variable on
8658         structs might have to be a pointer, and not a refenrece
8659
8660 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
8661
8662         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
8663         local variables to fields in a proxy class.
8664
8665         * iterators.cs (PopulateProxy): Rename our internal fields to
8666         <XXX>.  
8667         Create a <THIS> field if we are an instance method, so we can
8668         reference our parent container variables.
8669         (MapVariable): Called back from the EmitContext code to enter a
8670         new variable to field mapping into the proxy class (we just create
8671         a FieldBuilder).
8672
8673         * expression.cs
8674         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
8675         for using the remapped locals to fields.
8676
8677         I placed the code here, because that gives the same semantics to
8678         local variables, and only changes the Emit code.
8679
8680         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
8681         statements inside iterators.
8682         (VariableInfo): Add a FieldBuilder for the cases when we are
8683         remapping local variables to fields in a proxy class
8684
8685         * ecore.cs (SimpleNameResolve): Avoid testing two times for
8686         current_block != null.
8687
8688         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
8689         not cope with strings, as it has been moved to the
8690         TableSwitchEmit.  Fixed bug in switch generation.
8691
8692         * expression.cs (New.DoResolve): Provide more context for the user
8693         when reporting an error.
8694
8695         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
8696         pointers. 
8697
8698         * expression.cs (MemberAccess.DoResolve): When we get a type back,
8699         check the permissions for it.  Note than in a type-resolution
8700         context the check was already present in DeclSpace.ResolveType,
8701         but was missing from the MemberAccess.
8702
8703         (ArrayCreation.CheckIndices): warn if the user has
8704         more nested levels of expressions, but there are no more
8705         dimensions specified.  Avoids crash on bug 41906.
8706
8707 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
8708
8709         * statement.cs (Block): replace Implicit bool, for a generic
8710         flags.   
8711         New flag: `Unchecked'.  This is used during the EmitMeta phase
8712         (which is out-of-line with the regular Resolve/Emit process for a
8713         statement, as this is done ahead of time, but still gets a chance
8714         to call constant resolve).
8715
8716         (Block.Flags): new enum for adding a new flag.
8717
8718         (Block.EmitMeta): track the state of unchecked.
8719
8720         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
8721         to enable constant resolution to work there as well.
8722
8723 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
8724
8725         * typemanager.cs (ienumerable_type): Also look up
8726         System.Collections.IEnumerable. 
8727
8728 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
8729
8730         TODO: Test more than one conditional per method.
8731
8732         * class.cs (Indexer.Define): Report the location where the user is
8733         referencing the unsupported feature.
8734
8735         (MethodData): Overload the use of `conditionals' to
8736         minimize the creation of needless ArrayLists.   This saves roughly
8737         212kb on my machine.
8738
8739         (Method): Implement the new IIteratorContainer interface.
8740         (Method.SetYields): Implement the method by setting the ModFlags
8741         to contain METHOD_YIELDS.
8742
8743         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
8744         which just got set to null.
8745
8746         * iterators.cs: New file.
8747
8748         (Yield, YieldBreak): New statements.
8749
8750         * statement.cs (Return.Resolve): Flag an error if we are used in
8751         an iterator method.
8752
8753         * codegen.cs (InIterator): New flag set if the code is being
8754         compiled in an iterator method.
8755
8756         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
8757         internal modifier, and we just use it to avoid adding extra
8758         fields, as this is seldom used.  
8759
8760         * cs-parser.jay: Add yield_statement (yield and yield break).
8761
8762         * driver.cs: New flag -v2 to turn on version 2 features. 
8763
8764         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
8765         hashtable when v2 is enabled.
8766
8767 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
8768
8769         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
8770         there is already a namespace defined with this name.
8771
8772         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
8773         people upgraded their corlibs.
8774
8775         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
8776         always use fully qualified types, no need to use the compiler
8777         front end.
8778
8779         (TypeManager.IsNamespace): Use binarysearch.
8780
8781         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
8782         AddDelegate): I did not quite use the new IsValid API properly: I
8783         have to pass the short-name and the fullname.  I was passing only
8784         the basename instead of the fullname sometimes. 
8785
8786         (TypeContainer.DefineType): call NamespaceClash.
8787
8788         * interface.cs (Interface.DefineType): use NamespaceClash before
8789         defining the type.
8790
8791         * delegate.cs (Delegate.DefineType): use NamespaceClash before
8792         defining the type.
8793
8794         * enum.cs: (Enum.DefineType): use NamespaceClash before
8795         defining the type.
8796
8797         * typemanager.cs (: 3-line patch that gives us some tasty 11%
8798         speed increase.  First, use the negative_hits cache when we get a
8799         negative.  Second, add the type with its full original name
8800         instead of the new . and + encoded name (reflection uses + to
8801         separate type from a nested type).  Use LookupTypeReflection
8802         directly which bypasses the type->name hashtable (that we already
8803         know does not contain the type.
8804
8805         * decl.cs (DeclSpace.ResolveTypeExpr): track the
8806         location/container type. 
8807
8808         * driver.cs: When passing utf8, use directly the UTF8Encoding.
8809
8810 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
8811
8812         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
8813
8814         * delegate.cs (NewDelegate.Resolve): Test whether an instance
8815         method is being referenced in the method group from a static
8816         context, and report error 120 if so.
8817
8818         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
8819         Error118. 
8820
8821         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
8822         is created, we create the A namespace).
8823
8824         * cs-parser.jay: A namespace also introduces a DeclarationFound.
8825         Fixes #41591
8826
8827 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
8828
8829         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
8830         invocation to ModuleBuilder.GetType with the same values will
8831         return a new type instance, so we need to cache its return
8832         values. 
8833
8834         * expression.cs (Binary.ResolveOperator): Only allow the compare
8835         operators on enums if they are of the same type.
8836
8837         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
8838         types of ValueType on their own case.  Before we were giving them
8839         the same treatment as objects.
8840
8841         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
8842         fullname.  Short name is used to compare against container name.
8843         Fullname is used to check against defined namespace names.
8844
8845         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
8846         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
8847
8848         (Method.CheckBase): Call parent.
8849         (MemberBase.CheckBase): Check for protected members on sealed
8850         classes.
8851         (PropertyBase.CheckBase): Call parent.
8852         (Field.Define): Call parent.
8853
8854         * report.cs: Negative error codes are now mapped to 8000 - code,
8855         so that the display is render more nicely.
8856
8857         * typemanager.cs: Do not use try/catch, instead report a regular
8858         error. 
8859
8860         (GetPointerType, GetReferenceType): These methods provide
8861         mechanisms to obtain the T* and T& from a T.  We had the code
8862         previously scattered around the code base, and it also used
8863         TypeManager.LookupType that would go through plenty of caches.
8864         This one goes directly to the type source.
8865
8866         In some places we did the Type.GetType followed by
8867         ModuleBuilder.GetType, but not in others, so this unifies the
8868         processing as well.
8869
8870         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
8871         statements now that we have namespace information.
8872
8873         * typemanager.cs (IsNamespace): New method, returns whether the
8874         string presented is a namespace or not.
8875
8876         (ComputeNamespaces): New public entry point, computes the list of
8877         available namespaces, using the GetNamespaces API call in Mono, or
8878         the slower version in MS.NET.   
8879
8880         Now before we start the semantic analysis phase, we have a
8881         complete list of namespaces including everything that the user has
8882         provided.
8883
8884         Deleted old code to cache namespaces in .nsc files.
8885
8886 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
8887
8888         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
8889         class/struct location definition Location for the implicit
8890         constructor location.
8891
8892         (Operator.Define): Use the location of the operator for the
8893         implicit Method definition.
8894
8895         (Constructor.Emit): use the constructor location for the implicit
8896         base initializer constructor.
8897
8898         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
8899         and the Expression class now contains two new methods:
8900
8901         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
8902         isolate type lookup from the rest of the resolution process.
8903
8904         Since we use Expressions to hold type definitions due to the way
8905         we parse the input we have historically overloaded Resolve to
8906         perform the Type lookups if a special flag is passed.  Now this is
8907         eliminated and two methods take their place. 
8908
8909         The differences in the two methods between xStep and xTerminal is
8910         that xStep is involved in our current lookup system that uses
8911         SimpleNames to compose a name, while xTerminal is used just to
8912         catch the case where the simplename lookup failed.
8913
8914 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
8915
8916         * expression.cs (ResolveMemberAccess): Remove redundant code.
8917         TypeExpr expressions are always born fully resolved.
8918
8919         * interface.cs (PopulateMethod): Do not lookup the types twice.
8920         We were doing it once during SemanticAnalysis and once during
8921         PopulateMethod.
8922
8923         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
8924         in local variable type definitions, were being returned as a
8925         SimpleName (we decomposed everything into a string), that is
8926         because primary_expression was being used instead of a type in the
8927         grammar (reduce/reduce conflicts).
8928
8929         The part that was wrong is that we converted the expression into a
8930         string (an oversimplification in one hand, compounded with primary
8931         expressions doing string concatenation).
8932
8933         So things like:
8934
8935         A.B.C [] x;
8936
8937         Would return "A.B.C[]" as a SimpleName.  This stopped things like
8938         using clauses from working on this particular context.  And a type
8939         was being matched directly against "A.B.C[]".
8940
8941         We now use the correct approach, and allow for ComposedCast to be
8942         part of the unary expression.  So the "A.B.C []" become a composed
8943         cast of "A.B.C" (as a nested group of MemberAccess with a
8944         SimpleName at the end) plus the rank composition "[]". 
8945
8946         Also fixes 35567
8947
8948 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
8949
8950         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
8951         for the access level checking.
8952
8953         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
8954         `TypeContainer container', because I kept getting confused when I
8955         was debugging this code.
8956
8957         * expression.cs (Indexers): Instead of tracking getters/setters,
8958         we now track them in parallel.  We create one arraylist less, but
8959         most importantly it is possible now for the LValue code to find a
8960         matching get for a set.
8961
8962         (IndexerAccess.DoResolveLValue): Update the code.
8963         GetIndexersForType has been modified already to extract all the
8964         indexers from a type.  The code assumed it did not.
8965
8966         Also make the code set the correct return type for the indexer.
8967         This was fixed a long time ago for properties, but was missing for
8968         indexers.  It used to be void_type.
8969
8970         (Binary.Emit): Test first for doubles instead of
8971         floats, as they are more common.
8972
8973         (Binary.EmitBranchable): Use the .un version of the branch opcodes
8974         when dealing with floats and the <=, >= operators.  This fixes bug
8975         #39314 
8976
8977         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
8978         to load the array value by emitting a load on the foreach variable
8979         type.  This was incorrect.  
8980
8981         We now emit the code to load an element using the the array
8982         variable type, and then we emit the conversion operator.
8983
8984         Fixed #40176
8985
8986 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
8987
8988         * attribute.cs: Avoid allocation of ArrayLists in the common case.
8989
8990 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
8991
8992         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
8993         test for protection before we test for signatures. 
8994
8995         (MethodSignature.ToString): implement.
8996
8997         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
8998         to the case where we reduced into a LongConstant.
8999
9000         * decl.cs (CheckAccessLevel): If the type is an array, we can not
9001         depend on whether the information is acurrate, because the
9002         Microsoft runtime will always claim that the array type is public,
9003         regardless of the real state.
9004
9005         If the type is a pointer, another problem happens: the type is
9006         reported as non-public in Microsoft.  
9007
9008         In both cases we have to call CheckAccessLevel recursively with
9009         the underlying type as the argument to be tested.
9010
9011 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
9012
9013         * assign.cs (Assign.Emit): If we are dealing with a compound
9014         assignment expression, we should use the code path that stores the
9015         intermediate result in a temporary value.  This fixes #40903.
9016
9017         *expression.cs (Indirection.ToString): Provide ToString method for
9018         debugging. 
9019
9020 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
9021
9022         * class.cs: Null out fields holding references to Block objects so
9023         they can be garbage collected.
9024
9025         * expression.cs (OverloadResolve): Remove unused local.
9026
9027 2003-04-07  Martin Baulig  <martin@ximian.com>
9028
9029         * codegen.cs (EmitContext.CurrentFile): New public field.
9030         (EmitContext.Mark): Use the CurrentFile to check whether the
9031         location is in the correct file.
9032         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
9033
9034 2003-04-07  Martin Baulig  <martin@ximian.com>
9035
9036         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
9037
9038         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
9039         location.  [FIXME: The location argument which gets passed to this
9040         method is sometimes wrong!]
9041
9042 2003-04-07  Nick Drochak <ndrochak@gol.com>
9043
9044         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
9045
9046 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
9047
9048         * expression.cs (Indirection.EmitAssign): We were using the
9049         temporary, but returning immediately instead of continuing the
9050         EmitAssing flow.
9051
9052 2003-04-06  Martin Baulig  <martin@ximian.com>
9053
9054         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
9055         if it's a nested child, but also deriving from the outer class.
9056         See test 190.cs.
9057
9058         * typemanager.cs (IsNestedChildOf): Make this work if it's a
9059         nested child, but also deriving from the outer class.  See
9060         test-190.cs.
9061         (FilterWithClosure): We may access private members of the outer
9062         class if we're a nested child and deriving from the outer class.
9063         (RealMemberLookup): Only set `closure_private_ok' if the
9064         `original_bf' contained BindingFlags.NonPublic.
9065
9066 2003-04-05  Martin Baulig  <martin@ximian.com>
9067
9068         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
9069         probe if its a type parameter, and if so, flag an error.
9070
9071         * decl.cs: Move here the SetParameterInfo code from class.cs.
9072         Handle IsGeneric here.
9073
9074         Handle a variety of errors in the parameter info definition.
9075
9076         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
9077         type parameters here.
9078
9079         * cs-parser.jay (class_declaration): report errors for parameters
9080         here as well.
9081
9082 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
9083
9084         * generic.cs: New file, contains support code for generics.
9085
9086         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
9087         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
9088
9089         Update parser for the above removals.
9090
9091         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
9092         now taken care of in the parser.
9093
9094 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
9095
9096         * class.cs (Event.Define): Do not allow abstract events to have
9097         initializers. 
9098
9099 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
9100
9101         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
9102         block in event declarations.
9103
9104         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
9105         value type, get its address.
9106
9107         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
9108         leaving a class on the stack instead of a boolean value (int
9109         0/1).  Change the code so we compare against null, and then the
9110         result against zero.
9111
9112         * class.cs (TypeContainer.GetClassBases): We were checking for the
9113         parent class being sealed too late.
9114
9115         * expression.cs (Binary.Emit): For <= and >= when dealing with
9116         floating point values, use cgt.un and clt.un instead of cgt and
9117         clt alone.
9118
9119 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
9120
9121         * statement.cs: Apply the same optimization as MS: skip the 
9122         GetEnumerator returning an IEnumerator, and use the one returning a 
9123         CharEnumerator instead. This allows us to avoid the try-finally block 
9124         and the boxing.
9125
9126 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
9127
9128         * cs-parser.jay: Attributes cannot be applied to
9129                          namespaces. Fixes #40473
9130
9131 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9132
9133         * class.cs:
9134         (Add*): check if the name is valid using the full name for constants,
9135         fields, properties and events.
9136
9137 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
9138
9139         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
9140         char constants to be part of the enumeration.
9141
9142         * expression.cs (Conditional.DoResolve): Add support for operator
9143         true. Implements the missing functionality from 14.12
9144
9145         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
9146         operator true/false as required by the spec.
9147
9148         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
9149         implicit conversion to boolean.
9150
9151         * statement.cs (Statement.ResolveBoolean): A boolean expression is
9152         also one where the type implements `operator true'. 
9153
9154         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
9155         get an expression that will invoke operator true based on an
9156         expression.  
9157
9158         (GetConversionOperators): Removed the hack that called op_True
9159         here.  
9160
9161         (Expression.ResolveBoolean): Move this from Statement.
9162
9163 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
9164
9165         * ecore.cs (FieldExpr): do not allow initialization of initonly
9166         fields on derived classes
9167
9168 2003-03-13  Martin Baulig  <martin@ximian.com>
9169
9170         * statement.cs (Block.Emit): Call ig.BeginScope() and
9171         ig.EndScope() when compiling with debugging info; call
9172         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
9173
9174 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
9175
9176         * expression.cs (Indexers): Do not construct immediately, allow
9177         for new members to be appended as we go.  Fixes 38143
9178
9179 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9180
9181         * expression.cs: save/restore context when resolving an unchecked
9182         expression.
9183
9184 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
9185
9186         * cfold.cs: Catch division by zero in modulus operator during
9187         constant folding.
9188
9189 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
9190
9191         * interface.cs (Interface.DefineMembers): Avoid defining members
9192         twice. 
9193
9194 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
9195
9196         * driver.cs: handle the +/- options for -noconfig
9197
9198         * statement.cs (Unckeched.Resolve): Also track the state of
9199         unchecked in the Resolve phase.
9200
9201 2003-02-27  Martin Baulig  <martin@ximian.com>
9202
9203         * ecore.cs (Expression.MemberLookup): Don't create a
9204         MethodGroupExpr for something which is not a method.  Fixes #38291.
9205
9206 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
9207
9208         * class.cs (MemberBase.CheckParameters): Also check that the type
9209         is unmanaged if it is a pointer.
9210
9211         * expression.cs (SizeOf.Resolve): Add location information.
9212
9213         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
9214         a managed type is declared.
9215
9216         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
9217         parameter modifiers as well.  Fixes bug 38606
9218
9219         * class.cs: Very sad.  Am backing out the speed up changes
9220         introduced by the ArrayList -> Array in the TypeContainer, as they
9221         were not actually that much faster, and introduced a bug (no error
9222         reports on duplicated methods).
9223
9224         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
9225         source first, this will guarantee that we have a valid expression
9226         before calling in lower levels functions that will require a
9227         resolved object.  Then use this original_source in the
9228         target.ResolveLValue instead of the original source that was
9229         passed to us.
9230
9231         Another change.  Use target.Resolve instead of LValueResolve.
9232         Although we are resolving for LValues, we will let the Assign code
9233         take care of that (it will be called again from Resolve).  This
9234         basically allows code like this:
9235
9236         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
9237         class Y { void A (X x) { x [0] += o; }
9238
9239         The problem was that the indexer was trying to resolve for
9240         set_Item (idx, object o) and never finding one.  The real set_Item
9241         was set_Item (idx, X).  By delaying the process we get the right
9242         semantics. 
9243
9244         Fixes bug 36505
9245
9246 2003-02-23  Martin Baulig  <martin@ximian.com>
9247
9248         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
9249         while calling DoEmit ().
9250
9251         * codegen.cs (EmitContext.Mark): Don't mark locations in other
9252         source files; if you use the #line directive inside a method, the
9253         compiler stops emitting line numbers for the debugger until it
9254         reaches the end of the method or another #line directive which
9255         restores the original file.
9256
9257 2003-02-23  Martin Baulig  <martin@ximian.com>
9258
9259         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
9260
9261 2003-02-23  Martin Baulig  <martin@ximian.com>
9262
9263         * statement.cs (Block.AddChildVariableNames): We need to call this
9264         recursively, not just for our immediate children.
9265
9266 2003-02-23  Martin Baulig  <martin@ximian.com>
9267
9268         * class.cs (Event.Define): Always make the field private, like csc does.
9269
9270         * typemanager.cs (TypeManager.RealMemberLookup): Make events
9271         actually work, fixes bug #37521.
9272
9273 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
9274
9275         * delegate.cs: When creating the various temporary "Parameters"
9276         classes, make sure that we call the ComputeAndDefineParameterTypes
9277         on those new parameters (just like we do with the formal ones), to
9278         allow them to be resolved in the context of the DeclSpace.
9279
9280         This fixes the bug that Dick observed in Bugzilla #38530.
9281
9282 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
9283
9284         * expression.cs (ResolveMemberAccess): When resolving a constant,
9285         do not attempt to pull a constant if the value was not able to
9286         generate a valid constant.
9287
9288         * const.cs (LookupConstantValue): Do not report more errors than required.
9289
9290 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9291
9292         * expression.cs: fixes bug #38328.
9293
9294 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9295
9296         * class.cs: Changed all the various members that can be part of a
9297         class from being an ArrayList to be an Array of the right type.
9298         During the DefineType type_list, interface_list, delegate_list and
9299         enum_list are turned into types, interfaces, delegates and enums
9300         arrays.  
9301
9302         And during the member population, indexer_list, event_list,
9303         constant_list, field_list, instance_constructor_list, method_list,
9304         operator_list and property_list are turned into their real arrays.
9305
9306         Although we could probably perform this operation earlier, for
9307         good error reporting we need to keep the lists and remove the
9308         lists for longer than required.
9309
9310         This optimization was triggered by Paolo profiling the compiler
9311         speed on the output of `gen-sample-program.pl' perl script. 
9312
9313         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
9314         not crash in methods like MemberLookupFailed that use this field.  
9315
9316         This problem arises when the compiler fails to resolve a type
9317         during interface type definition for example.
9318
9319 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9320
9321         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
9322         inherit from System.Object, so we have to stop at null, not only
9323         when reaching System.Object.
9324
9325 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
9326
9327         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
9328         DeclaredOnly because the parent indexer might have had a different
9329         name, but did not loop until the top of the hierarchy was reached.
9330
9331         The problem this one fixes is 35492: when a class implemented an
9332         indexer from an interface, we were getting the interface method
9333         (which was abstract) and we were flagging an error (can not invoke
9334         abstract method).
9335
9336         This also keeps bug 33089 functioning, and test-148 functioning.
9337
9338         * typemanager.cs (IsSpecialMethod): The correct way of figuring
9339         out if a method is special is to see if it is declared in a
9340         property or event, or whether it is one of the predefined operator
9341         names.   This should fix correctly #36804.
9342
9343 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
9344
9345         The goal here is to remove the dependency on EmptyCast.Peel ().
9346         Killing it completely.
9347
9348         The problem is that currently in a number of places where
9349         constants are expected, we have to "probe" for an EmptyCast, and
9350         Peel, which is not the correct thing to do, as this will be
9351         repetitive and will likely lead to errors. 
9352
9353         The idea is to remove any EmptyCasts that are used in casts that
9354         can be reduced to constants, so we only have to cope with
9355         constants. 
9356
9357         This bug hunt was triggered by Bug 37363 and the desire to remove
9358         the duplicate pattern where we were "peeling" emptycasts to check
9359         whether they were constants.  Now constants will always be
9360         constants.
9361
9362         * ecore.cs: Use an enumconstant here instead of wrapping with
9363         EmptyCast.  
9364
9365         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
9366         throwing me off.  By handling this we can get rid of a few hacks.
9367
9368         * statement.cs (Switch): Removed Peel() code.
9369
9370 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
9371
9372         * class.cs: Location information for error 508
9373
9374         * expression.cs (New.DoResolve): Add a guard against double
9375         resolution of an expression.  
9376
9377         The New DoResolve might be called twice when initializing field
9378         expressions (see EmitFieldInitializers, the call to
9379         GetInitializerExpression will perform a resolve on the expression,
9380         and later the assign will trigger another resolution
9381
9382         This leads to bugs (#37014)
9383
9384         * delegate.cs: The signature for EndInvoke should contain any ref
9385         or out parameters as well.  We were not doing this in the past. 
9386
9387         * class.cs (Field.Define): Do not overwrite the type definition
9388         inside the `volatile' group.  Turns out that volatile enumerations
9389         were changing the type here to perform a validity test, which
9390         broke conversions. 
9391
9392 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
9393
9394         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
9395         and structs, we do not want to load the instance variable
9396
9397         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
9398         enum_type has to be handled like an object reference (implicit
9399         conversions exists from this to object), but the regular IsClass
9400         and IsValueType tests will never return true for this one.
9401
9402         Also we use TypeManager.IsValueType instead of type.IsValueType,
9403         just for consistency with the rest of the code (this is only
9404         needed if we ever use the construct exposed by test-180.cs inside
9405         corlib, which we dont today).
9406
9407 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
9408
9409         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
9410         just InternalCall.
9411
9412 2003-02-09  Martin Baulig  <martin@ximian.com>
9413
9414         * namespace.cs (Namespace..ctor): Added SourceFile argument.
9415         (Namespace.DefineNamespaces): New static public method; this is
9416         called when we're compiling with debugging to add all namespaces
9417         to the symbol file.
9418
9419         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
9420         pass it to the Namespace's .ctor.
9421
9422         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
9423         and MethodBase arguments; pass the namespace ID to the symwriter;
9424         pass the MethodBase instead of the token to the symwriter.
9425         (SymbolWriter.DefineNamespace): New method to add a namespace to
9426         the symbol file.
9427
9428 2003-02-09  Martin Baulig  <martin@ximian.com>
9429
9430         * symbolwriter.cs: New file.  This is a wrapper around
9431         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
9432         methods here in near future.
9433
9434 2003-02-09  Martin Baulig  <martin@ximian.com>
9435
9436         * codegen.cs (EmitContext.Mark): Just pass the arguments to
9437         ILGenerator.MarkSequencePoint() which are actually used by the
9438         symbol writer.
9439
9440 2003-02-09  Martin Baulig  <martin@ximian.com>
9441
9442         * location.cs (SourceFile): New public sealed class.  This
9443         contains the name and an index which is used in the location's token.
9444         (Location): Reserve an appropriate number of bits in the token for
9445         the source file instead of walking over that list, this gives us a
9446         really huge performance improvement when compiling with debugging.
9447
9448         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
9449         `SourceFile' argument instead of a string.
9450         (Driver.ProcessFile): Add all the files via Location.AddFile(),
9451         but don't parse/tokenize here, we need to generate the list of all
9452         source files before we do that.
9453         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
9454         the files.
9455
9456         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
9457         instead of a string.
9458
9459         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
9460         of a string.
9461
9462 2003-02-09  Martin Baulig  <martin@ximian.com>
9463
9464         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
9465         filename on `#line default'.
9466
9467 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
9468
9469         * statement.cs: don't clear the pinned var when the fixed statement
9470         returns from the method (fixes bug#37752).
9471
9472 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
9473
9474         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
9475         to IsValueType.
9476
9477 2003-02-07  Martin Baulig  <martin@ximian.com>
9478
9479         * driver.cs: Removed the `--debug-args' command line argument.
9480
9481         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
9482         automatically by the AsssemblyBuilder.
9483         (CodeGen.InitializeSymbolWriter): We don't need to call any
9484         initialization function on the symbol writer anymore.  This method
9485         doesn't take any arguments.
9486
9487 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
9488
9489         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
9490         from referenced assemblies as well.
9491
9492 2003-02-02  Martin Baulig  <martin@ximian.com>
9493
9494         * class.cs (MethodData.Emit): Generate debugging info for external methods.
9495
9496 2003-02-02  Martin Baulig  <martin@ximian.com>
9497
9498         * class.cs (Constructor.Emit): Open the symbol writer before
9499         emitting the constructor initializer.
9500         (ConstructorInitializer.Emit): Call ec.Mark() to allow
9501         single-stepping through constructor initializers.
9502
9503 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
9504
9505         * class.cs: Handle error 549: do not allow virtual methods in
9506         sealed classes. 
9507
9508 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
9509
9510         * decl.cs: Check access levels when resolving types
9511
9512 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
9513
9514         * statement.cs: Add parameters and locals set in catch blocks that might 
9515         return to set vector
9516
9517 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
9518
9519         * class.cs (Operator): Set the SpecialName flags for operators.
9520
9521         * expression.cs (Invocation.DoResolve): Only block calls to
9522         accessors and operators on SpecialName methods.
9523
9524         (Cast.TryReduce): Handle conversions from char constants.
9525
9526
9527 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
9528
9529         * statement.cs: small memory and time optimization in FlowBranching.
9530
9531 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
9532
9533         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
9534         problem that the last fix but in the other sid (Set).
9535
9536         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
9537         access when there is no indexer in the hierarchy.
9538
9539 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
9540
9541         * class.cs: Combine some if statements.
9542
9543 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9544
9545         * driver.cs: fixed bug #37187.
9546
9547 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
9548
9549         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
9550         any indexer, it's needed to build a list with all the indexers in the
9551         hierarchy (AllGetters), else we have problems. Fixes #35653.
9552
9553 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
9554
9555         * class.cs (MethodData.Define): It is wrong for an interface
9556         implementation to be static in both cases: explicit and implicit.
9557         We were only handling this in one case.
9558
9559         Improve the if situation there to not have negations.
9560
9561         * class.cs (Field.Define): Turns out that we do not need to check
9562         the unsafe bit on field definition, only on usage.  Remove the test.
9563
9564 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9565
9566         * driver.cs: use assembly.Location instead of Codebase (the latest
9567         patch made mcs fail when using MS assemblies).
9568
9569 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
9570
9571         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
9572         get the path to *corlib.dll.
9573
9574 2003-01-21  Nick Drochak <ndrochak@gol.com>
9575
9576         * cs-tokenizer.cs:
9577         * pending.cs:
9578         * typemanager.cs: Remove compiler warnings
9579
9580 2003-01-20  Duncan Mak  <duncan@ximian.com>
9581
9582         * AssemblyInfo.cs: Bump the version number to 0.19.
9583
9584 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9585
9586         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
9587
9588 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
9589
9590         * class.cs (Constructor::Emit): Emit debugging info for constructors.
9591
9592 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
9593
9594         * cs-parser.jay: Small fix: we were not comparing the constructor
9595         name correctly.   Thanks to Zoltan for the initial pointer.
9596
9597 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
9598
9599         * cs-tokenizer.cs: Set file name when specified with #line
9600
9601 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
9602
9603         * cs-parser.jay: Only perform the constructor checks here if we
9604         are named like the class;  This will help provider a better
9605         error.  The constructor path is taken when a type definition is
9606         not found, but most likely the user forgot to add the type, so
9607         report that rather than the constructor error.
9608
9609 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
9610
9611         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
9612         allocations.
9613
9614 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9615
9616         * cs-parser.jay: Add cleanup call.
9617
9618 2003-01-13  Duncan Mak  <duncan@ximian.com>
9619
9620         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
9621         consistent with other methods.
9622
9623 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9624
9625         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
9626
9627 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
9628
9629         * attribute.cs: only set GuidAttr to true when we have a
9630         GuidAttribute.
9631
9632 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9633
9634         * ecore.cs:
9635         * expression.cs:
9636         * typemanager.cs: fixes to allow mcs compile corlib with the new
9637         Type.IsSubclassOf fix.
9638
9639 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
9640
9641         * expression.cs (LocalVariableReference.DoResolve): Classify a
9642         constant as a value, not as a variable.   Also, set the type for
9643         the variable.
9644
9645         * cs-parser.jay (fixed_statement): take a type instead of a
9646         pointer_type, so we can produce a better error message later.
9647
9648         * statement.cs (Fixed.Resolve): Flag types that are not pointers
9649         as an error.  
9650
9651         (For.DoEmit): Make inifinite loops have a
9652         non-conditional branch back.
9653
9654         (Fixed.DoEmit): First populate the pinned variables, then emit the
9655         statement, then clear the variables.  Before I was emitting the
9656         code once for each fixed piece.
9657
9658
9659 2003-01-08  Martin Baulig  <martin@ximian.com>
9660
9661         * statement.cs (FlowBranching.MergeChild): A break in a
9662         SWITCH_SECTION does not leave a loop.  Fixes #36155.
9663
9664 2003-01-08  Martin Baulig  <martin@ximian.com>
9665
9666         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
9667         lives in the same number space than `param_map'.  Fixes #36154.
9668
9669 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
9670
9671         * cs-parser.jay (constructor_declaration): Set the
9672         Constructor.ModFlags before probing for it.  This makes the
9673         compiler report 514, 515 and 132 (the code was there, but got
9674         broken). 
9675
9676         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
9677         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
9678         (GotoCase.Resolve): Set `Returns' to ALWAYS.
9679
9680 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
9681
9682         * enum.cs: create the enum static fields using the enum type.
9683
9684 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
9685
9686         * class.cs: don't try to create the ParamBuilder for the return
9687         type if it's not needed (and handle it breaking for the ms runtime
9688         anyway).
9689
9690 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
9691
9692         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
9693
9694 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
9695
9696         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
9697         the command.   This showed up while compiling the JANET source
9698         code, which used \r as its only newline separator.
9699
9700 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
9701
9702         * class.cs (Method.Define): If we are an operator (because it
9703         reuses our code), then set the SpecialName and HideBySig.  #36128
9704
9705 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
9706
9707         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
9708         exception, report error 120 `object reference required'.
9709
9710         * driver.cs: Add --pause option, used during to measure the size
9711         of the process as it goes with --timestamp.
9712
9713         * expression.cs (Invocation.DoResolve): Do not allow methods with
9714         SpecialName to be invoked.
9715
9716 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
9717
9718         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
9719         number before adding it.
9720
9721 2002-12-21  Ravi Pratap  <ravi@ximian.com>
9722
9723         * ecore.cs (StandardImplicitConversion): When in an unsafe
9724         context, we allow conversion between void * to any other pointer
9725         type. This fixes bug #35973.
9726
9727 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
9728
9729         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
9730         is not thrown when extensionless outputs are used 
9731
9732 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9733
9734         * rootcontext.cs: fixed compilation of corlib.
9735
9736 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
9737
9738         * attribute.cs (Attributes.Contains): Add new method.
9739
9740         * class.cs (MethodCore.LabelParameters): if the parameter is an
9741         `out' parameter, check that no attribute `[In]' has been passed.
9742
9743         * enum.cs: Handle the `value__' name in an enumeration.
9744
9745 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
9746
9747         * decl.cs: Added special case to allow overrides on "protected
9748         internal" methods
9749
9750 2002-12-18  Ravi Pratap  <ravi@ximian.com>
9751
9752         * attribute.cs (Attributes.AddAttributeSection): Rename to this
9753         since it makes much more sense.
9754
9755         (Attributes.ctor): Don't require a Location parameter.
9756
9757         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
9758
9759         * attribute.cs (ApplyAttributes): Remove extra Location parameters
9760         since we already have that information per attribute.
9761
9762         * everywhere : make appropriate changes.
9763
9764         * class.cs (LabelParameters): Write the code which actually
9765         applies attributes to the return type. We can't do this on the MS
9766         .NET runtime so we flag a warning in the case an exception is
9767         thrown.
9768
9769 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
9770
9771         * const.cs: Handle implicit null conversions here too.
9772
9773 2002-12-17  Ravi Pratap  <ravi@ximian.com>
9774
9775         * class.cs (MethodCore.LabelParameters): Remove the extra
9776         Type [] parameter since it is completely unnecessary. Instead
9777         pass in the method's attributes so that we can extract
9778         the "return" attribute.
9779
9780 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
9781
9782         * cs-parser.jay (parse): Use Report.Error to flag errors instead
9783         of ignoring it and letting the compile continue.
9784
9785         * typemanager.cs (ChangeType): use an extra argument to return an
9786         error condition instead of throwing an exception.
9787
9788 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
9789
9790         * expression.cs (Unary.TryReduce): mimic the code for the regular
9791         code path.  Perform an implicit cast in the cases where we can
9792         implicitly convert to one of the integral types, and then reduce
9793         based on that constant.   This fixes bug #35483.
9794
9795 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9796
9797         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
9798
9799 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9800
9801         * namespace.cs: fixed bug #35489.
9802
9803 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
9804
9805         * class.cs: Remove some dead code.
9806
9807         * cs-parser.jay: Estimate the number of methods needed
9808         (RootContext.MethodCount);
9809
9810         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
9811         numbers instead of StringBuilders.
9812
9813         * support.cs (PtrHashtable): Add constructor with initial size;
9814         We can now reduce reallocations of the method table.
9815
9816 2002-12-10  Ravi Pratap  <ravi@ximian.com>
9817
9818         * attribute.cs (ApplyAttributes): Keep track of the emitted
9819         attributes on a per-target basis. This fixes bug #35413.
9820
9821 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
9822
9823         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
9824         default to the Windows 1252 encoding.
9825
9826         (UnixParseOption): Support version, thanks to Alp for the missing
9827         pointer. 
9828
9829         * AssemblyInfo.cs: Add nice assembly information.
9830
9831         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
9832         (bug 35169).
9833
9834         * cs-parser.jay: Allow a trailing comma before the close bracked
9835         in the attribute_section production.
9836
9837         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
9838         address of the instance was being taken, I will take this out,
9839         because we take the address of the object immediately here.
9840
9841 2002-12-09  Ravi Pratap  <ravi@ximian.com>
9842
9843         * typemanager.cs (AreMultipleAllowed): Take care of the most
9844         obvious case where attribute type is not in the current assembly -
9845         stupid me ;-)
9846
9847 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
9848
9849         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
9850         definitions, instead of doing that afterwards.  
9851
9852         Also we use a nice little hack, depending on the constructor, we
9853         know if we are a "composed" name or a simple name.  Hence, we
9854         avoid the IndexOf test, and we avoid 
9855
9856         * codegen.cs: Add code to assist in a bug reporter to track down
9857         the source of a compiler crash. 
9858
9859 2002-12-07  Ravi Pratap  <ravi@ximian.com>
9860
9861         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
9862         types have been emitted for a given element and flag an error
9863         if something which does not have AllowMultiple set is used more
9864         than once.
9865
9866         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
9867         attribute types and their corresponding AllowMultiple properties
9868
9869         (AreMultipleAllowed): Check the property for a given type.
9870
9871         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
9872         property in the case we have a TypeContainer.
9873
9874         (Attributes.AddAttribute): Detect duplicates and just skip on
9875         adding them. This trivial fix catches a pretty gross error in our
9876         attribute emission - global attributes were being emitted twice!
9877
9878         Bugzilla bug #33187 is now fixed.
9879
9880 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
9881
9882         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
9883         instead of pp_and).
9884
9885         * expression.cs (Binary.ResolveOperator): I can only use the
9886         Concat (string, string, string) and Concat (string, string,
9887         string, string) if the child is actually a concatenation of
9888         strings. 
9889
9890 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
9891
9892         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
9893         context where we need a 2-character lookahead.
9894
9895         * pending.cs (PendingImplementation): Rework so we can keep track
9896         of interface types all the time, and flag those which were
9897         implemented by parents as optional.
9898
9899 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
9900
9901         * expression.cs (Binary.ResolveOperator): Use
9902         String.Concat(string,string,string) or
9903         String.Concat(string,string,string,string) when possible. 
9904
9905         * typemanager: More helper methods.
9906
9907
9908 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
9909
9910         * pending.cs: remove the bogus return from GetMissingInterfaces()
9911         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
9912
9913 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9914
9915         * namespace.cs: avoid duplicated 'using xxx' being added to
9916         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
9917         when we get more than one 'using' statement for the same namespace.
9918         Report a CS0105 warning for it.
9919
9920 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
9921
9922         * cs-tokenizer.cs (consume_identifier): use read directly, instead
9923         of calling getChar/putback, uses internal knowledge of it.    
9924
9925         (xtoken): Reorder tokenizer so most common patterns are checked
9926         first.  This reduces the compilation time in another 5% (from 8.11s
9927         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
9928
9929         The parsing time is 22% of the compilation in mcs, and from that
9930         64% is spent on the tokenization process.  
9931
9932         I tried using a binary search for keywords, but this is slower
9933         than the hashtable.  Another option would be to do a couple of
9934         things:
9935
9936                 * Not use a StringBuilder, instead use an array of chars,
9937                   with a set value.  Notice that this way we could catch
9938                   the 645 error without having to do it *afterwards*.
9939
9940                 * We could write a hand-parser to avoid the hashtable
9941                   compares altogether.
9942
9943         The identifier consumption process takes 37% of the tokenization
9944         time.  Another 15% is spent on is_number.  56% of the time spent
9945         on is_number is spent on Int64.Parse:
9946
9947                 * We could probably choose based on the string length to
9948                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
9949                   computations. 
9950
9951         Another 3% is spend on wrapping `xtoken' in the `token' function.
9952
9953         Handle 0xa0 as whitespace (#34752)
9954
9955 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
9956
9957         * typemanager.cs (IsCLRType): New routine to tell whether a type
9958         is one of the builtin types.  
9959
9960         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
9961         typecode in more places instead of doing pointer comparissions.
9962         We could leverage some knowledge about the way the typecodes are
9963         laid out.
9964
9965         New code to cache namespaces in assemblies, it is currently not
9966         invoked, to be used soon.
9967
9968         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
9969
9970         * expression.cs (Binary.ResolveOperator): specially handle
9971         strings, and do not perform user-defined operator overloading for
9972         built-in types.
9973
9974 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
9975
9976         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
9977         internalcall as it is a pretty simple operation;  Avoid whenever
9978         possible to call Char.IsLetter.
9979
9980         (consume_identifier): Cut by half the number of
9981         hashtable calls by merging the is_keyword and GetKeyword behavior.
9982
9983         Do not short-circuit, because if we do, we
9984         report errors (ie, #if false && true would produce an invalid
9985         directive error);
9986
9987
9988 2002-11-24  Martin Baulig  <martin@ximian.com>
9989
9990         * expression.cs (Cast.TryReduce): If we're in checked syntax,
9991         check constant ranges and report a CS0221.  Fixes #33186.
9992
9993 2002-11-24  Martin Baulig  <martin@ximian.com>
9994
9995         * cs-parser.jay: Make this work for uninitialized variable
9996         declarations in the `for' initializer.  Fixes #32416.
9997
9998 2002-11-24  Martin Baulig  <martin@ximian.com>
9999
10000         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
10001         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
10002
10003 2002-11-24  Martin Baulig  <martin@ximian.com>
10004
10005         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
10006         argument; if true, we also check for user-defined conversions.
10007         This is only needed if both arguments are of a user-defined type.
10008         Fixes #30443, added test-175.cs.
10009         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
10010
10011         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
10012
10013 2002-11-24  Martin Baulig  <martin@ximian.com>
10014
10015         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
10016         function to get the store opcode.
10017         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
10018         only emit the Ldelema if the store opcode is Stobj.  You must run
10019         both test-34 and test-167 to test this.  Fixes #34529.
10020
10021 2002-11-23  Martin Baulig  <martin@ximian.com>
10022
10023         * ecore.cs (Expression.MemberLookup): Added additional
10024         `qualifier_type' argument which is used when we're being called
10025         from MemberAccess.DoResolve() and null if we're called from a
10026         SimpleName lookup.
10027         (Expression.MemberLookupFailed): New method to report errors; this
10028         does the CS1540 check and reports the correct error message.
10029
10030         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
10031         argument for the CS1540 check and redone the way how we're dealing
10032         with private members.  See the comment in the source code for details.
10033         (FilterWithClosure): Reverted this back to revision 1.197; renamed
10034         `closure_start_type' to `closure_qualifier_type' and check whether
10035         it's not null.  It was not this filter being broken, it was just
10036         being called with the wrong arguments.
10037
10038         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
10039         and pass it the correct `qualifier_type'; this also does the error
10040         handling for us.
10041
10042 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
10043
10044         * expression.cs (Invocation.EmitParams): If the we are dealing
10045         with a non-built-in value type, load its address as well.
10046
10047         (ArrayCreation): Use a a pretty constant instead
10048         of the hardcoded value 2.   Use 6 instead of 2 for the number of
10049         static initializers.  
10050
10051         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
10052         because they are not really value types, just glorified integers. 
10053
10054         * driver.cs: Do not append .exe, the CSC compiler does not do it.
10055
10056         * ecore.cs: Remove redundant code for enumerations, make them use
10057         the same code path as everything else, fixes the casting issue
10058         with enumerations in Windows.Forms.
10059
10060         * attribute.cs: Do only cast to string if it is a string, the
10061         validation happens later.
10062
10063         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
10064         people upgrade their corlibs.
10065
10066         * ecore.cs: Oops, enumerations were not following the entire code path
10067
10068 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
10069
10070         * typemanager.cs (FilterWithClosure): Commented out the test for
10071         1540 in typemanager.cs, as it has problems when accessing
10072         protected methods from a parent class (see test-174.cs). 
10073
10074         * attribute.cs (Attribute.ValidateGuid): new method.
10075         (Attribute.Resolve): Use above.
10076
10077 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
10078
10079         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
10080
10081         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
10082         handling for enumerations, as we only needed the TypeContainer
10083         functionality to begin with (this is required for the fix below to
10084         work for enums that reference constants in a container class for
10085         example). 
10086
10087         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
10088
10089         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
10090         a valid TypeBuilder to perform lookups on.o
10091
10092         * class.cs (InheritableMemberSignatureCompare): Use true in the
10093         call to GetGetMethod and GetSetMethod, because we are comparing
10094         the signature, and we need to get the methods *even* if they are
10095         private. 
10096
10097         (PropertyBase.CheckBase): ditto.
10098
10099         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
10100         GotoCase.Resolve): Use Peel on EmpytCasts.
10101
10102         * ecore.cs (EmptyCast): drop child, add Peel method.
10103
10104 2002-11-17  Martin Baulig  <martin@ximian.com>
10105
10106         * ecore.cs (EmptyCast.Child): New public property.
10107
10108         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
10109         label resolved to an EmptyCast.  Fixes #34162.
10110         (GotoCase.Resolve): Likewise.
10111         (Block.EmitMeta): Likewise.
10112
10113 2002-11-17  Martin Baulig  <martin@ximian.com>
10114
10115         * expression.cs (Invocation.BetterConversion): Prefer int over
10116         uint; short over ushort; long over ulong for integer literals.
10117         Use ImplicitConversionExists instead of StandardConversionExists
10118         since we also need to check for user-defined implicit conversions.
10119         Fixes #34165.  Added test-173.cs.
10120
10121 2002-11-16  Martin Baulig  <martin@ximian.com>
10122
10123         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
10124         with the `true' and `false' literals.  Fixes #33151.
10125
10126 2002-11-16  Martin Baulig  <martin@ximian.com>
10127
10128         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
10129         October 22nd; don't do the cs1540 check for static members.
10130
10131         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
10132         now using our own filter here and doing the cs1540 check again.
10133
10134 2002-11-16  Martin Baulig  <martin@ximian.com>
10135
10136         * support.cs (InternalParameters): Don't crash if we don't have
10137         any fixed parameters.  Fixes #33532.
10138
10139 2002-11-16  Martin Baulig  <martin@ximian.com>
10140
10141         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
10142         when looking up static methods to make this work on Windows.
10143         Fixes #33773.
10144
10145 2002-11-16  Martin Baulig  <martin@ximian.com>
10146
10147         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
10148         a setter rather than using PropertyInfo.CanWrite.
10149
10150 2002-11-15  Nick Drochak  <ndrochak@gol.com>
10151
10152         * class.cs: Allow acces to block member by subclasses. Fixes build
10153         breaker.
10154
10155 2002-11-14  Martin Baulig  <martin@ximian.com>
10156
10157         * class.cs (Constructor.Emit): Added the extern/block check.
10158         Fixes bug #33678.
10159
10160 2002-11-14  Martin Baulig  <martin@ximian.com>
10161
10162         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
10163         iteration while looking for indexers, this is needed because the
10164         indexer may have a different name in our base classes.  Fixed the
10165         error reporting (no indexers at all, not get accessor, no
10166         overloaded match).  Fixes bug #33089.
10167         (IndexerAccess.DoResolveLValue): Likewise.
10168
10169 2002-11-14  Martin Baulig  <martin@ximian.com>
10170
10171         * class.cs (PropertyBase.CheckBase): Make this work for multiple
10172         indexers.  Fixes the first part of bug #33089.
10173         (MethodSignature.InheritableMemberSignatureCompare): Added support
10174         for properties.
10175
10176 2002-11-13  Ravi Pratap  <ravi@ximian.com>
10177
10178         * attribute.cs (Attribute.Resolve): Catch the
10179         NullReferenceException and report it since it isn't supposed to
10180         happen. 
10181
10182 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
10183
10184         * expression.cs (Binary.EmitBranchable): Also handle the cases for
10185         LogicalOr and LogicalAnd that can benefit from recursively
10186         handling EmitBranchable.  The code now should be nice for Paolo.
10187
10188 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
10189
10190         * typemanager.cs (LookupType): Added a negative-hit hashtable for
10191         the Type lookups, as we perform quite a number of lookups on
10192         non-Types.  This can be removed once we can deterministically tell
10193         whether we have a type or a namespace in advance.
10194
10195         But this might require special hacks from our corlib.
10196
10197         * TODO: updated.
10198
10199         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
10200         and double which avoids a conversion from an integer to a double.
10201
10202         * expression.cs: tiny optimization, avoid calling IsConstant,
10203         because it effectively performs the lookup twice.
10204
10205 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
10206
10207         But a bogus return here to keep the semantics of the old code
10208         until the Mono runtime is fixed.
10209
10210         * pending.cs (GetMissingInterfaces): New method used to remove all
10211         the interfaces that are already implemented by our parent
10212         classes from the list of pending methods. 
10213
10214         * interface.cs: Add checks for calls after ResolveTypeExpr.
10215
10216 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
10217
10218         * class.cs (Class.Emit): Report warning 67: event not used if the
10219         warning level is beyond 3.
10220
10221         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
10222         being a NullLiteral.
10223
10224         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
10225         specifiers. 
10226
10227         * class.cs (TypeContainer.GetClassBases): Cover a missing code
10228         path that might fail if a type can not be resolved.
10229
10230         * expression.cs (Binary.Emit): Emit unsigned versions of the
10231         operators. 
10232
10233         * driver.cs: use error 5.
10234
10235 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
10236
10237         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
10238
10239 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
10240
10241         * cs-parser.jay (switch_section): A beautiful patch from Martin
10242         Baulig that fixed 33094.
10243
10244 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
10245
10246         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
10247         Check whether the base is abstract and report an error if so.
10248
10249         * expression.cs (IndexerAccess.DoResolveLValue,
10250         IndexerAccess.DoResolve): ditto. 
10251
10252         (Invocation.DoResolve): ditto.
10253
10254         (Invocation.FullMethodDesc): Improve the report string.
10255
10256         * statement.cs (Block): Eliminate IsVariableDefined as it is
10257         basically just a wrapper for GetVariableInfo.
10258
10259         * ecore.cs (SimpleName): Use new 
10260
10261         * support.cs (ReflectionParamter.ParameterType): We unwrap the
10262         type, as we return the actual parameter ref/unref state on a
10263         different call.
10264
10265 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
10266
10267         * support.cs: Return proper flags REF/OUT fixing the previous
10268         commit.  
10269
10270         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
10271         not used to mean `ref' but `ref or out' in ParameterReference
10272
10273         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
10274         full type signature instead of calling TypeManger.CSharpName
10275         ourselves. 
10276
10277         * support.cs (InternalParameters.ParameterDesc): Do not compare
10278         directly to the modflags, because REF/OUT will actually be bitsets
10279         if set. 
10280
10281         * delegate.cs (VerifyMethod): Check also the modifiers.
10282
10283         * cs-tokenizer.cs: Fix bug where floating point values with an
10284         exponent where a sign was missing was ignored.
10285
10286         * driver.cs: Allow multiple assemblies to be specified in a single
10287         /r: argument
10288
10289 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
10290
10291         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
10292         because identifiers after a parenthesis would end up in this kind
10293         of production, and we needed to desamiguate it for having casts
10294         like:
10295
10296                 (UserDefinedType *) xxx
10297
10298 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
10299
10300         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
10301         we should set on the Bindingflags.NonPublic, but not turn on
10302         private_ok.  private_ok controls whether a Private member is
10303         returned (this is chekced on the filter routine), while the
10304         BindingFlags.NonPublic just controls whether private/protected
10305         will be allowed.   This fixes the problem part of the problem of
10306         private properties being allowed to be used in derived classes.
10307
10308         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
10309         so we can call the children DoResolveLValue method (this will
10310         properly signal errors on lvalue assignments to base properties)
10311
10312         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
10313         getter are null, and we have a property info, we know that this
10314         happened because the lookup failed, so we report an error 122 for
10315         protection level violation.
10316
10317         We also silently return if setter and getter are null in the
10318         resolve functions, this condition only happens if we have flagged
10319         the error before.  This is the other half of the problem. 
10320
10321         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
10322         not have accessibility information, that is why we were returning
10323         true in the filter function in typemanager.cs.
10324
10325         To properly report 122 (property is inaccessible because of its
10326         protection level) correctly, we report this error in ResolveAccess
10327         by failing if both the setter and the getter are lacking (ie, the
10328         lookup failed). 
10329
10330         DoResolve and DoLResolve have been modified to check for both
10331         setter/getter being null and returning silently, the reason being
10332         that I did not want to put the knowledge about this error in upper
10333         layers, like:
10334
10335         int old = Report.Errors;
10336         x = new PropertyExpr (...);
10337         if (old != Report.Errors)
10338                 return null;
10339         else
10340                 return x;
10341
10342         So the property expr is returned, but it is invalid, so the error
10343         will be flagged during the resolve process. 
10344
10345         * class.cs: Remove InheritablePropertySignatureCompare from the
10346         class, as we no longer depend on the property signature to compute
10347         whether it is possible to implement a method or not.
10348
10349         The reason is that calling PropertyInfo.GetGetMethod will return
10350         null (in .NET, in Mono it works, and we should change this), in
10351         cases where the Get Method does not exist in that particular
10352         class.
10353
10354         So this code:
10355
10356         class X { public virtual int A { get { return 1; } } }
10357         class Y : X { }
10358         class Z : Y { public override int A { get { return 2; } } }
10359
10360         Would fail in Z because the parent (Y) would not have the property
10361         defined.  So we avoid this completely now (because the alternative
10362         fix was ugly and slow), and we now depend exclusively on the
10363         method names.
10364
10365         (PropertyBase.CheckBase): Use a method-base mechanism to find our
10366         reference method, instead of using the property.
10367
10368         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
10369         routines are gone now.
10370
10371         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
10372         names, they were incorrectly named.
10373
10374         * cs-tokenizer.cs: Return are more gentle token on failure. 
10375
10376         * pending.cs (PendingImplementation.InterfaceMethod): This routine
10377         had an out-of-sync index variable, which caused it to remove from
10378         the list of pending methods the wrong method sometimes.
10379
10380 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
10381
10382         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
10383         CanWrite, because those refer to this particular instance of the
10384         property, and do not take into account the fact that we can
10385         override single members of a property.
10386
10387         Constructor requires an EmitContext.  The resolution process does
10388         not happen here, but we need to compute the accessors before,
10389         because the resolution does not always happen for properties.
10390
10391         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
10392         subclass, before we did not update this flag, but we did update
10393         bindingflags. 
10394
10395         (GetAccessors): Drop this routine, as it did not work in the
10396         presence of partially overwritten set/get methods. 
10397
10398         Notice that this broke the cs1540 detection, but that will require
10399         more thinking. 
10400
10401 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10402
10403         * class.cs:
10404         * codegen.cs:
10405         * driver.cs: issue a warning instead of an error if we don't support
10406         debugging for the platform. Also ignore a couple of errors that may
10407         arise when trying to write the symbols. Undo my previous patch.
10408
10409 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10410
10411         * driver.cs: ignore /debug switch except for Unix platforms.
10412
10413 2002-10-23  Nick Drochak  <ndrochak@gol.com>
10414
10415         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
10416
10417 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
10418
10419         * driver.cs: Do not make mcs-debug conditional, so we do not break
10420         builds that use it.
10421
10422         * statement.cs (UsageVector.MergeChildren): I would like Martin to
10423         review this patch.  But basically after all the children variables
10424         have been merged, the value of "Breaks" was not being set to
10425         new_breaks for Switch blocks.  I think that it should be set after
10426         it has executed.  Currently I set this to the value of new_breaks,
10427         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
10428         conservative, but I do not understand this code very well.
10429
10430         I did not break anything in the build, so that is good ;-)
10431
10432         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
10433
10434 2002-10-20  Mark Crichton  <crichton@gimp.org>
10435
10436         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
10437
10438 2002-10-20  Nick Drochak  <ndrochak@gol.com>
10439
10440         * cfold.cs: Fixed compile blocker.
10441
10442 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
10443
10444         * driver.cs: I was chekcing the key, not the file.
10445
10446 2002-10-19  Ravi Pratap  <ravi@ximian.com>
10447
10448         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
10449         message that we were generating - we just need to silently return
10450         a null.
10451
10452 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
10453
10454         * class.cs (Event.Define): Change my previous commit, as this
10455         breaks the debugger.  This is a temporary hack, as it seems like
10456         the compiler is generating events incorrectly to begin with.
10457
10458         * expression.cs (Binary.ResolveOperator): Added support for 
10459         "U operator - (E x, E y)"
10460
10461         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
10462         y)".
10463
10464         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
10465         init-only variables, but this path did not take into account that
10466         there might be also instance readonly variables.  Correct this
10467         problem. 
10468
10469         This fixes bug 32253
10470
10471         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
10472         delegates as well.
10473
10474         * driver.cs: Change the extension for modules to `netmodule'
10475
10476         * cs-parser.jay: Improved slightly the location tracking for
10477         the debugger symbols.
10478
10479         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
10480         modifiers that were specified instead of the hardcoded value
10481         (FamAndAssem).  This was basically ignoring the static modifier,
10482         and others.  Fixes 32429.
10483
10484         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
10485         fixed a bug in the process (32476)
10486
10487         * expression.cs (ArrayAccess.EmitAssign): Patch from
10488         hwang_rob@yahoo.ca that fixes bug 31834.3
10489
10490 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
10491
10492         * driver.cs: Make the module extension .netmodule.
10493
10494 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
10495
10496         * driver.cs: Report an error if the resource file is not found
10497         instead of crashing.
10498
10499         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
10500         false, like Emit does.
10501
10502 2002-10-16  Nick Drochak  <ndrochak@gol.com>
10503
10504         * typemanager.cs: Remove unused private member.  Also reported mcs
10505         bug to report this as a warning like csc.
10506
10507 2002-10-15  Martin Baulig  <martin@gnome.org>
10508
10509         * statement.cs (Statement.Emit): Made this a virtual method; emits
10510         the line number info and calls DoEmit().
10511         (Statement.DoEmit): New protected abstract method, formerly knows
10512         as Statement.Emit().
10513
10514         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
10515
10516 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
10517
10518         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
10519         have fixed a remaining problem: not every AddXXXX was adding a
10520         fully qualified name.  
10521
10522         Now everyone registers a fully qualified name in the DeclSpace as
10523         being defined instead of the partial name.  
10524
10525         Downsides: we are slower than we need to be due to the excess
10526         copies and the names being registered this way.  
10527
10528         The reason for this is that we currently depend (on the corlib
10529         bootstrap for instance) that types are fully qualified, because
10530         we dump all the types in the namespace, and we should really have
10531         types inserted into the proper namespace, so we can only store the
10532         basenames in the defined_names array.
10533
10534 2002-10-10  Martin Baulig  <martin@gnome.org>
10535
10536         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
10537         from bug #31834, see the bug report for a testcase which is
10538         miscompiled.
10539
10540 2002-10-10  Martin Baulig  <martin@gnome.org>
10541
10542         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
10543         flow analysis code for this.
10544
10545         * statement.cs (Do, While, For): Tell the flow analysis code about
10546         infinite loops.
10547         (FlowBranching.UsageVector): Added support for infinite loops.
10548         (Block.Resolve): Moved the dead code elimination here and use flow
10549         analysis to do it.
10550
10551 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
10552
10553         * class.cs (Field.Define): Catch cycles on struct type
10554         definitions. 
10555
10556         * typemanager.cs (IsUnmanagedtype): Do not recursively check
10557         fields if the fields are static.  We only need to check instance
10558         fields. 
10559
10560         * expression.cs (As.DoResolve): Test for reference type.
10561
10562         * statement.cs (Using.ResolveExpression): Use
10563         ConvertImplicitRequired, not ConvertImplicit which reports an
10564         error on failture
10565         (Using.ResolveLocalVariableDecls): ditto.
10566
10567         * expression.cs (Binary.ResolveOperator): Report errors in a few
10568         places where we had to.
10569
10570         * typemanager.cs (IsUnmanagedtype): Finish implementation.
10571
10572 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
10573
10574         * expression.cs: Use StoreFromPtr instead of extracting the type
10575         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
10576
10577         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
10578         an enumeration value to a System.Enum, but System.Enum is not a
10579         value type, but an class type, so we need to box.
10580
10581         (Expression.ConvertExplicit): One codepath could return
10582         errors but not flag them.  Fix this.  Fixes #31853
10583
10584         * parameter.cs (Resolve): Do not allow void as a parameter type.
10585
10586 2002-10-06  Martin Baulig  <martin@gnome.org>
10587
10588         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
10589         if it's a class type and not a struct.  Fixes #31815.
10590
10591 2002-10-06  Martin Baulig  <martin@gnome.org>
10592
10593         * statement.cs: Reworked the flow analysis code a bit to make it
10594         usable for dead code elimination.
10595
10596 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10597
10598         * cs-parser.jay: allow empty source files. Fixes bug #31781.
10599
10600 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10601
10602         * expression.cs (ComposedCast.DoResolveType): A quick workaround
10603         to fix the test 165, will investigate deeper.
10604
10605 2002-10-04  Martin Baulig  <martin@gnome.org>
10606
10607         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
10608         finally blocks actually work.
10609         (Try.Resolve): We don't need to create a sibling for `finally' if
10610         there is no finally block.
10611
10612 2002-10-04  Martin Baulig  <martin@gnome.org>
10613
10614         * class.cs (Constructor.Define): The default accessibility for a
10615         non-default constructor is private, not public.
10616
10617 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10618
10619         * class.cs (Constructor): Make AllowedModifiers public, add
10620         EXTERN.
10621
10622         * cs-parser.jay: Perform the modifiers test here, as the
10623         constructor for the Constructor class usually receives a zero
10624         because of the way we create it (first we create, later we
10625         customize, and we were never checking the modifiers).
10626
10627         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
10628         is a version of LookupTypeReflection that includes the type-name
10629         cache.  This can be used as a fast path for functions that know
10630         the fully qualified name and are only calling into *.GetType() to
10631         obtain a composed type.
10632
10633         This is also used by TypeManager.LookupType during its type
10634         composition.
10635
10636         (LookupType): We now also track the real type name, as sometimes
10637         we can get a quey for the real type name from things like
10638         ComposedCast.  This fixes bug 31422.
10639
10640         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
10641         complete type fullname, it does not have to go through the type
10642         resolution system to obtain the composed version of the type (for
10643         obtaining arrays or pointers).
10644
10645         (Conditional.Emit): Use the EmitBoolExpression to
10646         generate nicer code, as requested by Paolo.
10647
10648         (ArrayCreation.CheckIndices): Use the patch from
10649         hwang_rob@yahoo.ca to validate the array initializers. 
10650
10651 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
10652
10653         * class.cs (ConstructorInitializer.Emit): simplify code by using
10654         Invocation.EmitCall, and at the same time, fix the bugs in calling
10655         parent constructors that took variable arguments. 
10656
10657         * ecore.cs (Expression.ConvertNumericExplicit,
10658         Expression.ImplicitNumericConversion): Remove the code that
10659         manually wrapped decimal (InternalTypeConstructor call is now gone
10660         as well).
10661
10662         * expression.cs (Cast.TryReduce): Also handle decimal types when
10663         trying to perform a constant fold on the type.
10664
10665         * typemanager.cs (IsUnmanagedtype): Partially implemented.
10666
10667         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
10668         that only turned off an error report, and did nothing else. 
10669
10670 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
10671
10672         * driver.cs: Handle and ignore /fullpaths
10673
10674 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
10675
10676         * expression.cs (Binary.ResolveOperator): Catch the case where
10677         DoNumericPromotions returns true, 
10678
10679         (Binary.DoNumericPromotions): Simplify the code, and the tests.
10680
10681 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
10682
10683         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
10684         report error 70.
10685
10686 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
10687
10688         * ecore.cs (ConvertNumericExplicit): It is not enough that the
10689         conversion exists, but it is also required that the conversion be
10690         performed.  This manifested in "(Type64Enum) 2".  
10691
10692         * class.cs (TypeManager.AddMethod): The fix is not to change
10693         AddEnum, because that one was using a fully qualified name (every
10694         DeclSpace derivative does), but to change the AddMethod routine
10695         that was using an un-namespaced name.  This now correctly reports
10696         the duplicated name.
10697
10698         Revert patch until I can properly fix it.  The issue
10699         is that we have a shared Type space across all namespaces
10700         currently, which is wrong.
10701
10702         Options include making the Namespace a DeclSpace, and merge
10703         current_namespace/current_container in the parser.
10704
10705 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
10706
10707         * cs-parser.jay: Improve error reporting when we get a different
10708         kind of expression in local_variable_type and
10709         local_variable_pointer_type. 
10710
10711         Propagate this to avoid missleading errors being reported.
10712
10713         * ecore.cs (ImplicitReferenceConversion): treat
10714         TypeManager.value_type as a target just like object_type.   As
10715         code like this:
10716
10717         ValueType v = 1;
10718
10719         Is valid, and needs to result in the int 1 being boxed before it
10720         is assigned to the value type v.
10721
10722         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
10723         to validate the enumeration name.
10724
10725         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
10726         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
10727         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
10728
10729         * ecore.cs (TryImplicitIntConversion): When doing an
10730         implicit-enumeration-conversion, check if the type is 64-bits and
10731         perform a conversion before passing to EnumConstant.
10732
10733 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
10734
10735         * decl.cs (Error_AmbiguousTypeReference); New routine used to
10736         report ambiguous type references.  Unlike the MS version, we
10737         report what the ambiguity is.   Innovation at work ;-)
10738
10739         (DeclSpace.FindType): Require a location argument to
10740         display when we display an ambiguous error.
10741
10742         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
10743
10744         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
10745
10746         * expression.cs (EmitDynamicInitializers): Apply patch from
10747         hwang_rob@yahoo.ca that fixes the order in which we emit our
10748         initializers. 
10749
10750 2002-09-21  Martin Baulig  <martin@gnome.org>
10751
10752         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
10753         delegate takes no arguments.
10754
10755 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
10756
10757         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
10758         from integers.
10759
10760         * expression.cs: Extract the underlying type.
10761
10762         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
10763
10764         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
10765
10766 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
10767
10768         * class.cs (TypeContainer.DefineType): We can not use the nice
10769         PackingSize with the size set to 1 DefineType method, because it
10770         will not allow us to define the interfaces that the struct
10771         implements.
10772
10773         This completes the fixing of bug 27287
10774
10775         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
10776         means also structs.  This fixes part of the problem. 
10777         (Expresion.ImplicitReferenceConversionExists): ditto.
10778
10779         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
10780         error if there were no errors reported during the type lookup
10781         process, to avoid duplicates or redundant errors.  Without this
10782         you would get an ambiguous errors plus a type not found.  We have
10783         beaten the user enough with the first error.  
10784
10785         (DeclSparce.FindType): Emit a warning if we have an ambiguous
10786         reference. 
10787
10788         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
10789         during the resolution process, stop the lookup, this avoids
10790         repeated error reports (same error twice).
10791
10792         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
10793
10794         * typemanager.cs (LookupType): Redo the type lookup code to match
10795         the needs of System.Reflection.  
10796
10797         The issue is that System.Reflection requires references to nested
10798         types to begin with a "+" sign instead of a dot.  So toplevel
10799         types look like: "NameSpace.TopLevelClass", and nested ones look
10800         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
10801         levels. 
10802
10803 2002-09-19  Martin Baulig  <martin@gnome.org>
10804
10805         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
10806         says that a method always returns or always throws an exception,
10807         don't report the CS0161.
10808
10809         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
10810         set `Returns = new_returns'.
10811
10812 2002-09-19  Martin Baulig  <martin@gnome.org>
10813
10814         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
10815         to an enum constant, check for a CS0176.
10816
10817 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
10818
10819         * class.cs (TypeContainer.CheckPairedOperators): Now we check
10820         for operators that must be in pairs and report errors.
10821
10822         * ecore.cs (SimpleName.DoResolveType): During the initial type
10823         resolution process, when we define types recursively, we must
10824         check first for types in our current scope before we perform
10825         lookups in the enclosing scopes.
10826
10827         * expression.cs (MakeByteBlob): Handle Decimal blobs.
10828
10829         (Invocation.VerifyArgumentsCompat): Call
10830         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
10831         I thought we were supposed to always call this, but there are a
10832         few places in the code where we dont do it.
10833
10834 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
10835
10836         * driver.cs: Add support in -linkres and -resource to specify the
10837         name of the identifier.
10838
10839 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10840
10841         * ecore.cs (StandardConversionExists): Sync with the conversion
10842         code: allow anything-* to void* conversions.
10843
10844         (FindMostSpecificSource): Use an Expression argument
10845         instead of a Type, because we might be handed over a Literal which
10846         gets a few more implicit conversions that plain types do not.  So
10847         this information was being lost.
10848
10849         Also, we drop the temporary type-holder expression when not
10850         required.
10851
10852 2002-09-17  Martin Baulig  <martin@gnome.org>
10853
10854         * class.cs (PropertyBase.CheckBase): Don't check the base class if
10855         this is an explicit interface implementation.
10856
10857 2002-09-17  Martin Baulig  <martin@gnome.org>
10858
10859         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
10860         different `IndexerName' attributes.
10861
10862         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
10863         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
10864         virtual CommonResolve().
10865
10866 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10867
10868         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
10869         and convert that to the UnderlyingType.
10870
10871         * statement.cs (Foreach.Resolve): Indexers are just like variables
10872         or PropertyAccesses.
10873
10874         * cs-tokenizer.cs (consume_string): Track line numbers and columns
10875         inside quoted strings, we were not doing this before.
10876
10877 2002-09-16  Martin Baulig  <martin@gnome.org>
10878
10879         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
10880         resolve it.  This is needed for the definite assignment check of the
10881         instance expression, fixes bug #29846.
10882         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
10883
10884 2002-09-16  Nick Drochak  <ndrochak@gol.com>
10885
10886         * parameter.cs: Fix compile error.  Cannot reference static member
10887         from an instance object.  Is this an mcs bug?
10888
10889 2002-09-14  Martin Baulig  <martin@gnome.org>
10890
10891         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
10892         multiple times.  Fixes bug #30295, added test-166.cs.
10893
10894 2002-09-14  Martin Baulig  <martin@gnome.org>
10895
10896         * statement.cs (Block.Emit): Don't emit unreachable code.
10897         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
10898         `break' statements.
10899         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
10900
10901 2002-09-14  Martin Baulig  <martin@gnome.org>
10902
10903         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
10904         is set.
10905
10906 2002-09-14  Martin Baulig  <martin@gnome.org>
10907
10908         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
10909         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
10910         be false on the ms runtime.
10911
10912 2002-09-13  Martin Baulig  <martin@gnome.org>
10913
10914         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
10915         the CS0038 error message.
10916
10917 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
10918
10919         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
10920         constant inside, return it.
10921
10922 2002-09-12  Martin Baulig  <martin@gnome.org>
10923
10924         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
10925         implicit conversion can be done between enum types.
10926
10927         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
10928         check whether an implicit conversion to the current enum's UnderlyingType
10929         exists and report an error if not.
10930
10931         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
10932         without debugging support.
10933
10934         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
10935         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
10936
10937 2002-09-12  Martin Baulig  <martin@gnome.org>
10938
10939         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
10940
10941         * ecore.cs (IMemberExpr.DeclaringType): New property.
10942         (SimpleName.SimpleNameResolve): Check whether we're accessing a
10943         nonstatic member of an outer type (CS0038).
10944
10945 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
10946
10947         * driver.cs: Activate the using-error detector at warning level
10948         4 (at least for MS-compatible APIs).
10949
10950         * namespace.cs (VerifyUsing): Small buglett fix.
10951
10952         * pending.cs (PendingImplementation): pass the container pointer. 
10953
10954         * interface.cs (GetMethods): Allow for recursive definition.  Long
10955         term, I would like to move every type to support recursive
10956         definitions, not the current ordering mechanism that we have right
10957         now.
10958
10959         The situation is this: Attributes are handled before interfaces,
10960         so we can apply attributes to interfaces.  But some attributes
10961         implement interfaces, we will now handle the simple cases
10962         (recursive definitions will just get an error).  
10963
10964         * parameter.cs: Only invalidate types at the end if we fail to
10965         lookup all types.  
10966
10967 2002-09-09  Martin Baulig  <martin@gnome.org>
10968
10969         * ecore.cs (PropertyExpr.Emit): Also check for
10970         TypeManager.system_int_array_get_length so this'll also work when
10971         compiling corlib.  Fixes #30003.
10972
10973 2002-09-09  Martin Baulig  <martin@gnome.org>
10974
10975         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
10976         and throw an exception if we can't get the type's size.  Fixed #30040,
10977         added test-165.cs.
10978
10979 2002-09-09  Martin Baulig  <martin@gnome.org>
10980
10981         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
10982
10983         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
10984         context.  Fixes bug #30027.
10985
10986         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
10987         virtual functions.  Fixes bug #30043, added test-164.cs.
10988
10989 2002-09-08  Ravi Pratap  <ravi@ximian.com>
10990
10991         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
10992
10993 2002-09-08  Nick Drochak  <ndrochak@gol.com>
10994
10995         * driver.cs: Use an object to get the windows codepage since it's not a
10996         static property.
10997
10998 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
10999
11000         * statement.cs (For.Emit): for infinite loops (test == null)
11001         return whether there is a break inside, not always "true".
11002
11003         * namespace.cs (UsingEntry): New struct to hold the name of the
11004         using definition, the location where it is defined, and whether it
11005         has been used in a successful type lookup.
11006
11007         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
11008         strings.
11009
11010         * decl.cs: ditto.
11011
11012 2002-09-06  Ravi Pratap  <ravi@ximian.com>
11013
11014         * attribute.cs : Fix incorrect code which relied on catching
11015         a NullReferenceException to detect a null being passed in
11016         where an object was expected.
11017
11018 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
11019
11020         * statement.cs (Try): flag the catch variable as assigned
11021
11022         * expression.cs (Cast): Simplified by using ResolveType instead of
11023         manually resolving.
11024
11025         * statement.cs (Catch): Fix bug by using ResolveType.
11026
11027 2002-09-06  Ravi Pratap  <ravi@ximian.com>
11028
11029         * expression.cs (BetterConversion): Special case for when we have
11030         a NullLiteral as the argument and we have to choose between string
11031         and object types - we choose string the way csc does.
11032
11033         * attribute.cs (Attribute.Resolve): Catch the
11034         NullReferenceException and report error #182 since the Mono
11035         runtime no more has the bug and having this exception raised means
11036         we tried to select a constructor which takes an object and is
11037         passed a null.
11038
11039 2002-09-05  Ravi Pratap  <ravi@ximian.com>
11040
11041         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
11042         message (1502, 1503) when we can't locate a method after overload
11043         resolution. This is much more informative and closes the bug
11044         Miguel reported.
11045
11046         * interface.cs (PopulateMethod): Return if there are no argument
11047         types. Fixes a NullReferenceException bug.
11048
11049         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
11050         expressions too. Previously we were checking only in one place for
11051         positional arguments leaving out named arguments.
11052
11053         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
11054         type to the enum type is not allowed. Remove code corresponding to
11055         that.
11056
11057         (ConvertNumericExplicit): Allow explicit conversions from
11058         the underlying type to enum type. This precisely follows the spec
11059         and closes a bug filed by Gonzalo.
11060
11061 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11062
11063         * compiler.csproj:
11064         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
11065
11066 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
11067
11068         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
11069         it was important that we stored the right value after the
11070         reduction in `converted'.
11071
11072 2002-09-04  Martin Baulig  <martin@gnome.org>
11073
11074         * location.cs (Location.SymbolDocument): Use full pathnames for the
11075         source files.
11076
11077 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
11078
11079         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
11080         of the expression resolve mechanism, because that will catch the
11081         SimpleName error failures.
11082
11083         (Conditional): If we can not resolve the
11084         expression, return, do not crash.
11085
11086 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11087
11088         * cs-tokenizer.cs:
11089         (location): display token name instead of its number.
11090
11091 2002-08-28  Martin Baulig  <martin@gnome.org>
11092
11093         * expression.cs (Binary.ResolveOperator): Don't silently return
11094         but return an error if an operator cannot be applied between two
11095         enum types.
11096
11097 2002-08-28  Martin Baulig  <martin@gnome.org>
11098
11099         * class.cs (Constructor.Define): Set the permission attributes
11100         correctly instead of making all constructors public.
11101
11102 2002-08-28  Martin Baulig  <martin@gnome.org>
11103
11104         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
11105         for private members before reporting a CS0103; if we find anything,
11106         it's a CS0122.
11107
11108 2002-08-28  Martin Baulig  <martin@gnome.org>
11109
11110         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
11111         to check whether `closure_start_type == closure_invocation_type',
11112         we also need to check whether `m.DeclaringType == closure_invocation_type'
11113         before bypassing the permission checks.  We might be accessing
11114         protected/private members from the base class.
11115         (TypeManager.RealMemberLookup): Only set private_ok if private
11116         members were requested via BindingFlags.NonPublic.
11117
11118         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
11119
11120         * expression.cs (MemberAccess.ResolveMemberAccess): Set
11121         MethodGroupExpr.IsExplicitImpl if appropriate.
11122         (Invocation.DoResolve): Don't report the CS0120 for explicit
11123         interface implementations.
11124
11125 2002-08-27  Martin Baulig  <martin@gnome.org>
11126
11127         * expression.cs (Invocation.DoResolve): If this is a static
11128         method and we don't have an InstanceExpression, we must report
11129         a CS0120.
11130
11131 2002-08-25  Martin Baulig  <martin@gnome.org>
11132
11133         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
11134         `==' between a valuetype and an object.
11135
11136 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
11137
11138         * ecore.cs (TypeExpr): Provide a ToString method.
11139
11140 2002-08-24  Martin Baulig  <martin@gnome.org>
11141
11142         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
11143         now called proggie.dbg and it's a binary file.
11144
11145 2002-08-23  Martin Baulig  <martin@gnome.org>
11146
11147         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
11148
11149 2002-08-23  Martin Baulig  <martin@gnome.org>
11150
11151         * struct.cs (MyStructInfo.ctor): Make this work with empty
11152         structs; it's not allowed to use foreach() on null.
11153
11154 2002-08-23  Martin Baulig  <martin@gnome.org>
11155
11156         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
11157         writer the full pathname of the generated assembly.
11158
11159 2002-08-23  Martin Baulig  <martin@gnome.org>
11160
11161         * statements.cs (FlowBranching.UsageVector.MergeChildren):
11162         A `finally' block never returns or breaks; improved handling of
11163         unreachable code.
11164
11165 2002-08-23  Martin Baulig  <martin@gnome.org>
11166
11167         * statement.cs (Throw.Resolve): Allow `throw null'.
11168
11169 2002-08-23  Martin Baulig  <martin@gnome.org>
11170
11171         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
11172         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
11173         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
11174         MemberLookup would return a wrong event if this is an explicit
11175         interface implementation and the class has an event with the same
11176         name.
11177
11178 2002-08-23  Martin Baulig  <martin@gnome.org>
11179
11180         * statement.cs (Block.AddChildVariableNames): New public method.
11181         (Block.AddChildVariableName): Likewise.
11182         (Block.IsVariableNameUsedInChildBlock): Likewise.
11183         (Block.AddVariable): Check whether a variable name has already
11184         been used in a child block.
11185
11186         * cs-parser.jay (declare_local_variables): Mark all variable names
11187         from the current block as being used in a child block in the
11188         implicit block.
11189
11190 2002-08-23  Martin Baulig  <martin@gnome.org>
11191
11192         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
11193         find the symbol writer.
11194
11195         * driver.cs: csc also allows the arguments to /define being
11196         separated by commas, not only by semicolons.
11197
11198 2002-08-23  Martin Baulig  <martin@gnome.org>
11199
11200         * interface.cs (Interface.GetMembers): Added static check for events.
11201
11202 2002-08-15  Martin Baulig  <martin@gnome.org>
11203
11204         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
11205         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
11206
11207         * ecore.cs (Expression.MemberLookup): Added documentation and explained
11208         why the MethodData.EmitDestructor() change was necessary.
11209
11210 2002-08-20  Martin Baulig  <martin@gnome.org>
11211
11212         * class.cs (TypeContainer.FindMembers): Added static check for events.
11213
11214         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
11215
11216         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
11217         use Type.GetEvents(), not Type.FindMembers().
11218
11219 2002-08-20  Martin Baulig  <martin@gnome.org>
11220
11221         * decl.cs (MemberCache): Added a special method cache which will
11222         be used for method-only searched.  This ensures that a method
11223         search will return a MethodInfo with the correct ReflectedType for
11224         inherited methods.      
11225
11226 2002-08-20  Martin Baulig  <martin@gnome.org>
11227
11228         * decl.cs (DeclSpace.FindMembers): Made this public.
11229
11230 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11231
11232         * delegate.cs: fixed build on windows.
11233         [FIXME:  Filed as bug #29150: MCS must report these errors.]
11234
11235 2002-08-19  Ravi Pratap  <ravi@ximian.com>
11236
11237         * ecore.cs (StandardConversionExists): Return a false
11238         if we are trying to convert the void type to anything else
11239         since that is not allowed.
11240
11241         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
11242         we flag error 70 in the event an event is trying to be accessed
11243         directly from outside the declaring type.
11244
11245 2002-08-20  Martin Baulig  <martin@gnome.org>
11246
11247         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
11248         MemberCache from typemanager.cs to decl.cs.
11249
11250 2002-08-19  Martin Baulig  <martin@gnome.org>
11251
11252         * class.cs (TypeContainer): Implement IMemberContainer.
11253         (TypeContainer.DefineMembers): Create the MemberCache.
11254         (TypeContainer.FindMembers): Do better BindingFlags checking; only
11255         return public members if BindingFlags.Public was given, check
11256         whether members are static.
11257
11258 2002-08-16  Martin Baulig  <martin@gnome.org>
11259
11260         * decl.cs (DeclSpace.Define): Splitted this in Define and
11261         DefineMembers.  DefineMembers is called first and initializes the
11262         MemberCache.
11263
11264         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
11265         DefineMembers() on all our DeclSpaces.
11266
11267         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
11268         but call DefineMembers() on all nested interfaces.  We call their
11269         Define() in our new Define() function.
11270
11271         * interface.cs (Interface): Implement IMemberContainer.
11272         (Interface.Define): Moved all code except the attribute stuf to
11273         DefineMembers().
11274         (Interface.DefineMembers): Initialize the member cache.
11275
11276         * typemanager.cs (IMemberFinder): Removed this interface, we don't
11277         need this anymore since we can use MemberCache.FindMembers directly.
11278
11279 2002-08-19  Martin Baulig  <martin@gnome.org>
11280
11281         * typemanager.cs (MemberCache): When creating the cache for an
11282         interface type, add all inherited members.
11283         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
11284         to `out bool used_cache' and documented it.
11285         (TypeManager.MemberLookup): If we already used the cache in the first
11286         iteration, we don't need to do the interfaces check.
11287
11288 2002-08-19  Martin Baulig  <martin@gnome.org>
11289
11290         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
11291         here from IMemberFinder and don't implement this interface anymore.
11292         (DeclSpace.MemberCache): Moved here from IMemberFinder.
11293
11294         * typemanager.cs (IMemberFinder): This interface is now only used by
11295         classes which actually support the member cache.
11296         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
11297         since we only put DeclSpaces into this Hashtable.
11298         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
11299         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
11300
11301 2002-08-16  Martin Baulig  <martin@gnome.org>
11302
11303         * typemanager.cs (ICachingMemberFinder): Removed.
11304         (IMemberFinder.MemberCache): New property.
11305         (TypeManager.FindMembers): Merged this with RealFindMembers().
11306         This function will never be called from TypeManager.MemberLookup()
11307         so we can't use the cache here, just the IMemberFinder.
11308         (TypeManager.MemberLookup_FindMembers): Check whether the
11309         IMemberFinder has a MemberCache and call the cache's FindMembers
11310         function.
11311         (MemberCache): Rewrote larger parts of this yet another time and
11312         cleaned it up a bit.
11313
11314 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
11315
11316         * driver.cs (LoadArgs): Support quoting.
11317
11318         (Usage): Show the CSC-like command line arguments.
11319
11320         Improved a few error messages.
11321
11322 2002-08-15  Martin Baulig  <martin@gnome.org>
11323
11324         * typemanager.cs (IMemberContainer.Type): New property.
11325         (IMemberContainer.IsInterface): New property.
11326
11327         The following changes are conditional to BROKEN_RUNTIME, which is
11328         defined at the top of the file.
11329
11330         * typemanager.cs (MemberCache.MemberCache): Don't add the base
11331         class'es members, but add all members from TypeHandle.ObjectType
11332         if we're an interface.
11333         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
11334         is the current type.
11335         (MemberCache.CacheEntry.Container): Removed this field.
11336         (TypeHandle.GetMembers): Include inherited members.
11337
11338 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11339
11340         * typemanager.cs: fixed compilation and added a comment on a field that
11341         is never used.
11342
11343 2002-08-15  Martin Baulig  <martin@gnome.org>
11344
11345         * class.cs (ConstructorInitializer.Resolve): In the
11346         Expression.MemberLookup call, use the queried_type as
11347         invocation_type.
11348
11349         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
11350         declared' attribute, it's always true.
11351         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
11352         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
11353         temporary wrapper for FindMembers which tells MemberLookup whether
11354         members from the base classes are included in the return value.
11355         This will go away soon.
11356         (TypeManager.MemberLookup): Use this temporary hack here; once the
11357         new MemberCache is completed, we don't need to do the DeclaredOnly
11358         looping here anymore since the MemberCache will take care of this.
11359         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
11360         (MemberCache): When creating the MemberCache for a class, get
11361         members from the current class and all its base classes.
11362         (MemberCache.CacheEntry.Container): New field.  This is a
11363         temporary hack until the Mono runtime is fixed to distinguish
11364         between ReflectedType and DeclaringType.  It allows us to use MCS
11365         with both the MS runtime and the unfixed Mono runtime without
11366         problems and without accecting performance.
11367         (MemberCache.SearchMembers): The DeclaredOnly looping from
11368         TypeManager.MemberLookup is now done here.      
11369
11370 2002-08-14  Martin Baulig  <martin@gnome.org>
11371
11372         * statement.cs (MyStructInfo.MyStructInfo): Don't call
11373         Type.GetFields on dynamic types but get the fields from the
11374         corresponding TypeContainer.
11375         (MyStructInfo.GetStructInfo): Added check for enum types.
11376
11377         * typemanager.cs (MemberList.IsSynchronized): Implemented.
11378         (MemberList.SyncRoot): Implemented.
11379         (TypeManager.FilterWithClosure): No need to check permissions if
11380         closure_start_type == closure_invocation_type, don't crash if
11381         closure_invocation_type is null.
11382
11383 2002-08-13  Martin Baulig  <martin@gnome.org>
11384
11385         Rewrote TypeContainer.FindMembers to use a member cache.  This
11386         gives us a speed increase of about 35% for the self-hosting MCS
11387         build and of about 15-20% for the class libs (both on GNU/Linux).
11388
11389         * report.cs (Timer): New class to get enhanced profiling.  This
11390         whole class is "TIMER" conditional since it remarkably slows down
11391         compilation speed.
11392
11393         * class.cs (MemberList): New class.  This is an IList wrapper
11394         which we're now using instead of passing MemberInfo[]'s around to
11395         avoid copying this array unnecessarily.
11396         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
11397         (ICachingMemberFinder, IMemberContainer): New interface.
11398         (TypeManager.FilterWithClosure): If `criteria' is null, the name
11399         has already been checked, otherwise use it for the name comparision.
11400         (TypeManager.FindMembers): Renamed to RealMemberFinder and
11401         provided wrapper which tries to use ICachingMemberFinder.FindMembers
11402         if possible.  Returns a MemberList, not a MemberInfo [].
11403         (TypeHandle): New class, implements IMemberContainer.  We create
11404         one instance of this class per type, it contains a MemberCache
11405         which is used to do the member lookups.
11406         (MemberCache): New class.  Each instance of this class contains
11407         all members of a type and a name-based hash table.
11408         (MemberCache.FindMembers): This is our new member lookup
11409         function.  First, it looks up all members of the requested name in
11410         the hash table.  Then, it walks this list and sorts out all
11411         applicable members and returns them.
11412
11413 2002-08-13  Martin Baulig  <martin@gnome.org>
11414
11415         In addition to a nice code cleanup, this gives us a performance
11416         increase of about 1.4% on GNU/Linux - not much, but it's already
11417         half a second for the self-hosting MCS compilation.
11418
11419         * typemanager.cs (IMemberFinder): New interface.  It is used by
11420         TypeManager.FindMembers to call FindMembers on a TypeContainer,
11421         Enum, Delegate or Interface.
11422         (TypeManager.finder_to_member_finder): New PtrHashtable.
11423         (TypeManager.finder_to_container): Removed.
11424         (TypeManager.finder_to_delegate): Removed.
11425         (TypeManager.finder_to_interface): Removed.
11426         (TypeManager.finder_to_enum): Removed.
11427
11428         * interface.cs (Interface): Implement IMemberFinder.
11429
11430         * delegate.cs (Delegate): Implement IMemberFinder.
11431
11432         * enum.cs (Enum): Implement IMemberFinder.
11433
11434         * class.cs (TypeContainer): Implement IMemberFinder.
11435
11436 2002-08-12  Martin Baulig  <martin@gnome.org>
11437
11438         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
11439
11440 2002-08-12  Martin Baulig  <martin@gnome.org>
11441
11442         * ecore.cs (ITypeExpression): New interface for expressions which
11443         resolve to a type.
11444         (TypeExpression): Renamed to TypeLookupExpression.
11445         (Expression.DoResolve): If we're doing a types-only lookup, the
11446         expression must implement the ITypeExpression interface and we
11447         call DoResolveType() on it.
11448         (SimpleName): Implement the new ITypeExpression interface.
11449         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
11450         hack, the situation that we're only looking up types can't happen
11451         anymore when this method is called.  Moved the type lookup code to
11452         DoResolveType() and call it.
11453         (SimpleName.DoResolveType): This ITypeExpression interface method
11454         is now doing the types-only lookup.
11455         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
11456         (ResolveFlags): Added MaskExprClass.
11457
11458         * expression.cs (MemberAccess): Implement the ITypeExpression
11459         interface.
11460         (MemberAccess.DoResolve): Added support for a types-only lookup
11461         when we're called via ITypeExpression.DoResolveType().
11462         (ComposedCast): Implement the ITypeExpression interface.
11463
11464         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
11465         Expression.Resolve() with ResolveFlags.Type instead.
11466
11467 2002-08-12  Martin Baulig  <martin@gnome.org>
11468
11469         * interface.cs (Interface.Define): Apply attributes.
11470
11471         * attribute.cs (Attribute.ApplyAttributes): Added support for
11472         interface attributes.
11473
11474 2002-08-11  Martin Baulig  <martin@gnome.org>
11475
11476         * statement.cs (Block.Emit): Only check the "this" variable if we
11477         do not always throw an exception.
11478
11479         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
11480         whether the property has a set accessor.
11481
11482 2002-08-11  Martin Baulig  <martin@gnome.org>
11483
11484         Added control flow analysis support for structs.
11485
11486         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
11487         with control flow analysis turned off.
11488         (IVariable): New interface.
11489         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
11490         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
11491         (FieldExpr.DoResolve): Resolve the instance expression with flow
11492         analysis turned off and do the definite assignment check after the
11493         resolving when we know what the expression will resolve to.
11494
11495         * expression.cs (LocalVariableReference, ParameterReference):
11496         Implement the new IVariable interface, only call the flow analysis
11497         code if ec.DoFlowAnalysis is true.
11498         (This): Added constructor which takes a Block argument.  Implement
11499         the new IVariable interface.
11500         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
11501         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
11502         This does the definite assignment checks for struct members.
11503
11504         * class.cs (Constructor.Emit): If this is a non-static `struct'
11505         constructor which doesn't have any initializer, call
11506         Block.AddThisVariable() to tell the flow analysis code that all
11507         struct elements must be initialized before control returns from
11508         the constructor.
11509
11510         * statement.cs (MyStructInfo): New public class.
11511         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
11512         argument to this indexer.  If non-zero, check an individual struct
11513         member, not the whole struct.
11514         (FlowBranching.CheckOutParameters): Check struct members.
11515         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
11516         overloaded versions of these methods which take an additional
11517         `int field_idx' argument to check struct members.
11518         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
11519         overloaded versions of these methods which take an additional
11520         `string field_name' argument to check struct member.s
11521         (VariableInfo): Implement the IVariable interface.
11522         (VariableInfo.StructInfo): New public property.  Returns the
11523         MyStructInfo instance of the variable if it's a struct or null.
11524         (Block.AddThisVariable): New public method.  This is called from
11525         Constructor.Emit() for non-static `struct' constructor which do
11526         not have any initializer.  It creates a special variable for the
11527         "this" instance variable which will be checked by the flow
11528         analysis code to ensure that all of the struct's fields are
11529         initialized before control returns from the constructor.
11530         (UsageVector): Added support for struct members.  If a
11531         variable/parameter is a struct with N members, we reserve a slot
11532         in the usage vector for each member.  A struct is considered fully
11533         initialized if either the struct itself (slot 0) or all its
11534         members are initialized.
11535
11536 2002-08-08  Martin Baulig  <martin@gnome.org>
11537
11538         * driver.cs (Driver.MainDriver): Only report an error CS5001
11539         if there were no compilation errors.
11540
11541         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
11542         `UnsafeContext' property to determine whether the parent is in
11543         unsafe context rather than checking the parent's ModFlags:
11544         classes nested in an unsafe class are unsafe as well.
11545
11546 2002-08-08  Martin Baulig  <martin@gnome.org>
11547
11548         * statement.cs (UsageVector.MergeChildren): Distinguish between
11549         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
11550         we return.  Added test17() and test18() to test-154.cs.
11551
11552 2002-08-08  Martin Baulig  <martin@gnome.org>
11553
11554         * typemanager.cs (TypeManager.FilterWithClosure): If we have
11555         Family access, make sure the invoking type isn't a subclass of the
11556         queried type (that'd be a CS1540).
11557
11558         * ecore.cs (Expression.MemberLookup): Added overloaded version of
11559         this method which takes an additional `Type invocation_type'.
11560
11561         * expression.cs (BaseAccess.DoResolve): Use the base type as
11562         invocation and query type.
11563         (MemberAccess.DoResolve): If the lookup failed and we're about to
11564         report a CS0122, try a lookup with the ec.ContainerType - if this
11565         succeeds, we must report a CS1540.
11566
11567 2002-08-08  Martin Baulig  <martin@gnome.org>
11568
11569         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
11570         (MethodGroupExpr): Implement the IMemberExpr interface.
11571
11572         * expression (MemberAccess.ResolveMemberAccess): No need to have
11573         any special code for MethodGroupExprs anymore, they're now
11574         IMemberExprs.   
11575
11576 2002-08-08  Martin Baulig  <martin@gnome.org>
11577
11578         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
11579         Family, FamANDAssem and FamORAssem permissions.
11580         (TypeManager.IsSubclassOrNestedChildOf): New public method.
11581
11582 2002-08-08  Martin Baulig  <martin@gnome.org>
11583
11584         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
11585         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
11586         or loop block.
11587
11588 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
11589
11590         * driver.cs: implemented /resource option to embed managed resources.
11591
11592 2002-08-07  Martin Baulig  <martin@gnome.org>
11593
11594         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
11595         (FieldBase.HasFieldInitializer): New public property.
11596         (FieldBase.GetInitializerExpression): New public method.  Resolves and
11597         returns the field initializer and makes sure it is only resolved once.
11598         (TypeContainer.EmitFieldInitializers): Call
11599         FieldBase.GetInitializerExpression to get the initializer, this ensures
11600         that it isn't resolved multiple times.
11601
11602         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
11603         the resolving process (SimpleName/MemberLookup) that we're currently
11604         emitting a field initializer (which must not access any instance members,
11605         this is an error CS0236).
11606
11607         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
11608         argument, if the `IsFieldInitializer' flag is set, we must report and
11609         error CS0236 and not an error CS0120.   
11610
11611 2002-08-07  Martin Baulig  <martin@gnome.org>
11612
11613         * ecore.cs (IMemberExpr): New public interface.
11614         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
11615         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
11616         if the expression is an IMemberExpr.
11617
11618         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
11619         to be null, implicitly default to `this' if we're non-static in
11620         this case.  Simplified the code a lot by using the new IMemberExpr
11621         interface.  Also fixed bug #28176 here.
11622
11623 2002-08-06  Martin Baulig  <martin@gnome.org>
11624
11625         * cs-parser.jay (SimpleLookup): Removed.  We need to create
11626         ParameterReferences during semantic analysis so that we can do a
11627         type-only search when resolving Cast, TypeOf and SizeOf.
11628         (block): Pass the `current_local_parameters' to the Block's
11629         constructor.
11630
11631         * class.cs (ConstructorInitializer): Added `Parameters parameters'
11632         argument to the constructor.
11633         (ConstructorInitializer.Resolve): Create a temporary implicit
11634         block with the parameters.
11635
11636         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
11637         references here if we aren't doing a type-only search.
11638
11639         * statement.cs (Block): Added constructor which takes a
11640         `Parameters parameters' argument.
11641         (Block.Parameters): New public property.
11642
11643         * support.cs (InternalParameters.Parameters): Renamed `parameters'
11644         to `Parameters' and made it public readonly.
11645
11646 2002-08-06  Martin Baulig  <martin@gnome.org>
11647
11648         * ecore.cs (Expression.Warning): Made this public as well.
11649
11650         * report.cs (Report.Debug): Print the contents of collections.
11651
11652 2002-08-06  Martin Baulig  <martin@gnome.org>
11653
11654         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
11655         used to tell Resolve() which kinds of expressions it may return.
11656         (Expression.Resolve): Added overloaded version of this method which
11657         takes a `ResolveFlags flags' argument.  This can be used to tell
11658         Resolve() which kinds of expressions it may return.  Reports a
11659         CS0118 on error.
11660         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
11661         ResolveFlags.SimpleName.
11662         (Expression.Error118): Added overloaded version of this method which
11663         takes a `ResolveFlags flags' argument.  It uses the flags to determine
11664         which kinds of expressions are allowed.
11665
11666         * expression.cs (Argument.ResolveMethodGroup): New public method.
11667         Resolves an argument, but allows a MethodGroup to be returned.
11668         This is used when invoking a delegate.
11669
11670         * TODO: Updated a bit.
11671
11672 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11673
11674         Fixed compilation with csc.
11675
11676         * ecore.cs: Expression.Error made public. Is this correct? Should
11677         Warning be made public too?
11678
11679         * expression.cs: use ea.Location instead of ea.loc.
11680         [FIXME:  Filed as bug #28607: MCS must report these errors.]
11681
11682 2002-08-06  Martin Baulig  <martin@gnome.org>
11683
11684         * ecore.cs (Expression.loc): Moved the location here instead of
11685         duplicating it in all derived classes.
11686         (Expression.Location): New public property.
11687         (Expression.Error, Expression.Warning): Made them non-static and
11688         removed the location argument.
11689         (Expression.Warning): Added overloaded version which takes an
11690         `int level' argument.
11691         (Expression.Error118): Make this non-static and removed the
11692         expression and location arguments.
11693         (TypeExpr): Added location argument to the constructor.
11694
11695         * expression.cs (StaticCallExpr): Added location argument to
11696         the constructor.
11697         (Indirection, PointerArithmetic): Likewise.
11698         (CheckedExpr, UnCheckedExpr): Likewise.
11699         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
11700         (StringPtr): Likewise.
11701
11702
11703 2002-08-05  Martin Baulig  <martin@gnome.org>
11704
11705         * expression.cs (BaseAccess.DoResolve): Actually report errors.
11706
11707         * assign.cs (Assign.DoResolve): Check whether the source
11708         expression is a value or variable.
11709
11710         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
11711         while resolving the corresponding blocks.
11712
11713         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
11714         an error, don't silently return null.
11715
11716         * statement.cs (Block.AddVariable): Do the error reporting here
11717         and distinguish between CS0128 and CS0136.
11718         (Block.DoResolve): Report all unused labels (warning CS0164).
11719         (LabeledStatement): Pass the location to the constructor.
11720         (LabeledStatement.HasBeenReferenced): New property.
11721         (LabeledStatement.Resolve): Set it to true here.
11722
11723         * statement.cs (Return.Emit): Return success even after reporting
11724         a type mismatch error (CS0126 or CS0127), this is what csc does and
11725         it avoids confusing the users with any consecutive errors.
11726
11727 2002-08-05  Martin Baulig  <martin@gnome.org>
11728
11729         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
11730
11731         * const.cs (Const.LookupConstantValue): Catch circular definitions.
11732
11733         * expression.cs (MemberAccess.DoResolve): Silently return if an
11734         error has already been reported.
11735
11736         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
11737         error has already been reported.
11738
11739 2002-08-05  Martin Baulig  <martin@gnome.org>
11740
11741         * statement.cs (UsageVector): Only initialize the `parameters'
11742         vector if we actually have any "out" parameters.
11743
11744 2002-08-05  Martin Baulig  <martin@gnome.org>
11745
11746         * expression.cs (Binary.ResolveOperator): When combining delegates,
11747         they must have the same type.
11748
11749 2002-08-05  Martin Baulig  <martin@gnome.org>
11750
11751         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
11752         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
11753         work with the ms runtime and we also don't need it: if we're a
11754         PropertyBuilder and not in the `indexer_arguments' hash, then we
11755         are a property and not an indexer.
11756
11757         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
11758         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
11759         since the latter one doesn't work with the ms runtime.
11760
11761 2002-08-03  Martin Baulig  <martin@gnome.org>
11762
11763         Fixed bugs #27998 and #22735.
11764
11765         * class.cs (Method.IsOperator): New public field.
11766         (Method.CheckBase): Report CS0111 if there's already a method
11767         with the same parameters in the current class.  Report CS0508 when
11768         attempting to change the return type of an inherited method.
11769         (MethodData.Emit): Report CS0179 if a method doesn't have a body
11770         and it's not marked abstract or extern.
11771         (PropertyBase): New abstract base class for Property and Indexer.
11772         (PropertyBase.CheckBase): Moved here from Property and made it work
11773         for indexers.
11774         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
11775         the same so we can reuse it there.
11776         (Property, Indexer): Derive from PropertyBase.
11777         (MethodSignature.inheritable_property_signature_filter): New delegate
11778         to find properties and indexers.
11779
11780         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
11781         argument and improved error reporting.
11782
11783         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
11784         EmptyReadOnlyParameters and made it a property.
11785
11786         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
11787         version of this method which takes a `PropertyInfo indexer'.
11788         (TypeManager.RegisterIndexer): New method.
11789
11790         * class.cs: Added myself as author of this file :-)
11791
11792 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11793
11794         * class.cs: fixed compilation on windoze.
11795
11796 2002-08-03  Martin Baulig  <martin@gnome.org>
11797
11798         * interface.cs (Interface.GetInterfaceBases): Check whether all
11799         base interfaces are at least as accessible than the current one.
11800
11801         * class.cs (TypeContainer.GetClassBases): Check whether base types
11802         are at least as accessible than the current type.
11803         (TypeContainer.AsAccessible): Implemented and made non-static.
11804         (MemberBase.CheckParameters): Report errors if the accessibility
11805         checks fail.
11806
11807         * delegate.cs (Delegate.Delegate): The default visibility is
11808         internal for top-level types and private for nested types.
11809         (Delegate.Define): Report errors if the accessibility checks fail.
11810
11811         * enum.cs (Enum.Enum): The default visibility is internal for
11812         top-level types and private for nested types.
11813         (Enum.DefineType): Compute the correct visibility.
11814
11815         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
11816         function which takes a `bool is_toplevel' instead of a TypeContainer.
11817
11818         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
11819         builtin type.
11820
11821 2002-08-02  Martin Baulig  <martin@gnome.org>
11822
11823         * expression.cs (LocalVariableReferenc): Added constructor which
11824         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
11825         (LocalVariableReference.IsReadOnly): New property.
11826         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
11827         variable is readonly, use our own readonly flag to do this; you can
11828         use the new constructor to get a writable reference to a read-only
11829         variable.
11830
11831         * cs-parser.jay (foreach_statement, using_statement): Get a writable
11832         reference to the local variable.
11833
11834 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
11835
11836         * rootcontext.cs (ResolveCore): Also include System.Exception
11837
11838         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
11839         we reach an EmptyStatement.
11840
11841         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
11842         is also fine.
11843
11844         * expression.cs (Binary.ResolveOperator): Check error result in
11845         two places.
11846
11847         use brtrue/brfalse directly and avoid compares to null.
11848
11849 2002-08-02  Martin Baulig  <martin@gnome.org>
11850
11851         * class.cs (TypeContainer.Define): Define all nested interfaces here.
11852         Fixes bug #28407, added test-155.cs.
11853
11854 2002-08-01  Martin Baulig  <martin@gnome.org>
11855
11856         * class.cs (Event.EmitDefaultMethod): Make this work with static
11857         events.  Fixes #28311, added verify-3.cs.
11858
11859 2002-08-01  Martin Baulig  <martin@gnome.org>
11860
11861         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
11862         `is_disposable' fields.
11863         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
11864         `hm.is_disposable' if we're using the collection pattern.
11865         (Foreach.EmitCollectionForeach): Use the correct type for the
11866         enumerator's local variable, only emit the try/finally block if
11867         necessary (fixes #27713).
11868
11869 2002-08-01  Martin Baulig  <martin@gnome.org>
11870
11871         * ecore.cs (Expression.report118): Renamed to Error118 and made
11872         it public static.
11873
11874         * statement.cs (Throw.Resolve): Check whether the expression is of
11875         the correct type (CS0118) and whether the type derives from
11876         System.Exception (CS0155).
11877         (Catch.Resolve): New method.  Do the type lookup here and check
11878         whether it derives from System.Exception (CS0155).
11879         (Catch.CatchType, Catch.IsGeneral): New public properties.
11880
11881         * typemanager.cs (TypeManager.exception_type): Added.
11882
11883 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
11884
11885         * driver.cs: Updated About function.
11886
11887 2002-07-31  Martin Baulig  <martin@gnome.org>
11888
11889         Implemented Control Flow Analysis.
11890
11891         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
11892         (EmitContext.CurrentBranching): Added.
11893         (EmitContext.StartFlowBranching): Added.
11894         (EmitContext.EndFlowBranching): Added.
11895         (EmitContext.KillFlowBranching): Added.
11896         (EmitContext.IsVariableAssigned): Added.
11897         (EmitContext.SetVariableAssigned): Added.
11898         (EmitContext.IsParameterAssigned): Added.
11899         (EmitContext.SetParameterAssigned): Added.
11900         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
11901         Added control flow analysis stuff here.
11902
11903         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
11904         resolve the expression as lvalue.
11905         (LocalVariableReference.DoResolve): Check whether the variable has
11906         already been assigned.
11907         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
11908         the parameter as assigned here.
11909         (ParameterReference.DoResolve): Check whether the parameter has already
11910         been assigned.
11911         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
11912         expression as lvalue.
11913
11914         * statement.cs (FlowBranching): New class for the flow analysis code.
11915         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
11916         (LabeledStatement.IsDefined): New public property.
11917         (LabeledStatement.AddUsageVector): New public method to tell flow
11918         analyis that the label may be reached via a forward jump.
11919         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
11920         flow analysis.
11921         (VariableInfo.Number): New public field.  This is used by flow analysis
11922         to number all locals of a block.
11923         (Block.CountVariables): New public property.  This is the number of
11924         local variables in this block (including the locals from all parent
11925         blocks).
11926         (Block.EmitMeta): Number all the variables.
11927
11928         * statement.cs: Added flow analysis support to all classes.
11929
11930 2002-07-31  Martin Baulig  <martin@gnome.org>
11931
11932         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
11933         To get debugging messages, compile mcs with /define:MCS_DEBUG and
11934         then use this argument.
11935
11936         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
11937
11938         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
11939         use this to specify /define options.
11940
11941 2002-07-29  Martin Baulig  <martin@gnome.org>
11942
11943         * statement.cs (Fixed): Moved all code that does variable lookups
11944         and resolvings from Emit to Resolve.
11945
11946         * statement.cs (For): Moved all code that does variable lookups
11947         and resolvings from Emit to Resolve.
11948
11949         * statement.cs (Using): Moved all code that does variable lookups
11950         and resolvings from Emit to Resolve.
11951
11952 2002-07-29  Martin Baulig  <martin@gnome.org>
11953
11954         * attribute.cs (Attribute.Resolve): Explicitly catch a
11955         System.NullReferenceException when creating the
11956         CustromAttributeBuilder and report a different warning message.
11957
11958 2002-07-29  Martin Baulig  <martin@gnome.org>
11959
11960         * support.cs (ParameterData.ParameterName): Added method to
11961         get the name of a parameter.
11962
11963         * typemanager.cs (TypeManager.IsValueType): New public method.
11964
11965 2002-07-29  Martin Baulig  <martin@gnome.org>
11966
11967         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
11968         is a flag which specifies that it's either ref or out.
11969         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
11970         the out parameter to `out Parameter.Modifier mod', also set the
11971         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
11972
11973         * support.cs (InternalParameters.ParameterModifier): Distinguish
11974         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11975         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11976
11977         * expression.cs (Argument.GetParameterModifier): Distinguish
11978         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11979         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11980
11981 2002-07-29  Martin Baulig  <martin@gnome.org>
11982
11983         * expression.cs (ParameterReference.ParameterReference): Added
11984         `Location loc' argument to the constructor.
11985
11986         * cs-parser.jay: Pass location to ParameterReference.
11987
11988 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
11989
11990         * statement.cs (Try): Initialize the location.
11991
11992         * cs-parser.jay: pass location to Try.
11993
11994         * expression.cs (Unary.Reduce): Change the prototype to return
11995         whether a constant fold could be performed or not.  The result is
11996         returned in an out parameters.  In the case of Indirection and
11997         AddressOf, we want to perform the full tests.
11998
11999 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
12000
12001         * statement.cs (Statement.Emit): Flag dead code.
12002
12003 2002-07-27  Andrew Birkett  <andy@nobugs.org>
12004
12005         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
12006
12007 2002-07-27  Martin Baulig  <martin@gnome.org>
12008
12009         * class.cs (MethodData.Define): Put back call to
12010         TypeManager.AddMethod(), accidentally commented this out.
12011
12012         * report.cs (Debug): New public method to print debugging information,
12013         this is `[Conditional ("DEBUG")]'.
12014
12015 2002-07-26  Martin Baulig  <martin@gnome.org>
12016
12017         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
12018         (switch_statement): Push the current_block to the switch_stack and
12019         pop it again when we're done with the switch.
12020         (switch_section): The new block is a child of the current_block.
12021         Fixes bug #24007, added test-152.cs.
12022
12023 2002-07-27  Martin Baulig  <martin@gnome.org>
12024
12025         * expression.cs (Invocation.EmitArguments): When calling a varargs
12026         function with only its fixed arguments, we need to pass an empty
12027         array.
12028
12029 2002-07-27  Martin Baulig  <martin@gnome.org>
12030
12031         Mono 0.13 has been released.
12032
12033 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
12034
12035         * driver.cs: Rename --resource to --linkres, because that is what
12036         we do currently, we dont support --resource yet.
12037
12038         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
12039
12040 2002-07-25  Martin Baulig  <martin@gnome.org>
12041
12042         * class.cs (MethodData): New public class.  This is a `method builder'
12043         class for a method or one accessor of a Property/Indexer/Event.
12044         (MethodData.GetMethodFlags): Moved here from MemberBase.
12045         (MethodData.ApplyAttributes): Likewise.
12046         (MethodData.ApplyObsoleteAttribute): Likewise.
12047         (MethodData.ApplyConditionalAttribute): Likewise.
12048         (MethodData.ApplyDllImportAttribute): Likewise.
12049         (MethodData.CheckAbstractAndExternal): Likewise.
12050         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
12051         (MethodData.Emit): Formerly known as Method.Emit().
12052         (MemberBase): Moved everything which was specific to a single
12053         accessor/method to MethodData.
12054         (Method): Create a new MethodData and call Define() and Emit() on it.
12055         (Property, Indexer, Event): Create a new MethodData objects for each
12056         accessor and call Define() and Emit() on them.
12057
12058 2002-07-25  Martin Baulig  <martin@gnome.org>
12059
12060         Made MethodCore derive from MemberBase to reuse the code from there.
12061         MemberBase now also checks for attributes.
12062
12063         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
12064         (MemberBase.GetMethodFlags): Moved here from class Method and marked
12065         as virtual.
12066         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
12067         `CallingConventions cc' and `Attributes opt_attrs' arguments.
12068         (MemberBase.ApplyAttributes): New virtual method; applies the
12069         attributes to a method or accessor.
12070         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
12071         (MemberBase.ApplyConditionalAttribute): Likewise.
12072         (MemberBase.ApplyDllImportAttribute): Likewise.
12073         (MemberBase.CheckAbstractAndExternal): Likewise.
12074         (MethodCore.ParameterTypes): This is now a property instead of a
12075         method, it's initialized from DoDefineParameters().
12076         (MethodCore.ParameterInfo): Removed the set accessor.
12077         (MethodCore.DoDefineParameters): New protected virtual method to
12078         initialize ParameterTypes and ParameterInfo.
12079         (Method.GetReturnType): We can now simply return the MemberType.
12080         (Method.GetMethodFlags): Override the MemberBase version and add
12081         the conditional flags.
12082         (Method.CheckBase): Moved some code from Define() here, call
12083         DoDefineParameters() here.
12084         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
12085         here to avoid some larger code duplication.
12086         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
12087         ensure that abstract and external accessors don't declare a body.
12088
12089         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
12090         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
12091         lookup in the attribute's parent classes, so we need to abort as soon
12092         as we found the first match.
12093         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
12094         the attribute has no arguments.
12095
12096         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
12097         of a Method.
12098
12099 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12100
12101         * cs-parser.jay: reverted previous patch.
12102
12103 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12104
12105         * cs-parser.jay: fixed bug #22119.
12106
12107 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12108
12109         * attribute.cs: fixed compilation. The error was:
12110         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
12111         be assigned to before control leaves the current method."
12112         [FIXME:  Filed as bug #28186: MCS must report this error.]
12113
12114 2002-07-25  Martin Baulig  <martin@gnome.org>
12115
12116         * attribute.cs (Attribute.Conditional_GetConditionName): New static
12117         method to pull the condition name ouf of a Conditional attribute.
12118         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
12119         the obsolete message and error flag out of an Obsolete attribute.
12120
12121         * class.cs (Method.GetMethodFlags): New public method to get the
12122         TypeManager.MethodFlags for this method.
12123         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
12124         private methods.
12125         (Method.Define): Get and apply the Obsolete and Conditional attributes;
12126         if we're overriding a virtual function, set the new private variable
12127         `parent_method'; call the new TypeManager.AddMethod().
12128
12129         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
12130         the MethodBuilder and the Method in a PtrHashtable.
12131         (TypeManager.builder_to_method): Added for this purpose.
12132         (TypeManager.MethodFlags): Added IsObsoleteError.
12133         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
12134         Obsolete and Conditional arguments in MethodBuilders.  If we discover
12135         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
12136         the message from the attribute.
12137
12138 2002-07-24  Martin Baulig  <martin@gnome.org>
12139
12140         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
12141         preprocessor directives, ensure that the argument to #define/#undef is
12142         exactly one identifier and that it's actually an identifier.
12143
12144         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
12145         did not work ....
12146
12147 2002-07-24  Martin Baulig  <martin@gnome.org>
12148
12149         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
12150         initialize it to TypeManager.object_type in the constructor.
12151         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
12152         of the `hm.get_current' method if we're using the collection pattern.
12153         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
12154         for the explicit conversion to make it work when we're using the collection
12155         pattern and the `Current' property has a different return type than `object'.
12156         Fixes #27713.
12157
12158 2002-07-24  Martin Baulig  <martin@gnome.org>
12159
12160         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
12161         does not match, but don't report any errors.  This method is called in
12162         order for all methods in a MethodGroupExpr until a matching method is
12163         found, so we don't want to bail out if the first method doesn't match.
12164         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
12165         matches, report the 123.  Fixes #28070.
12166
12167 2002-07-24  Martin Baulig  <martin@gnome.org>
12168
12169         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
12170         TypeManager.TypeToCoreType() to the top of the method so the
12171         following equality checks will work.  Fixes #28107.
12172
12173 2002-07-24  Martin Baulig  <martin@gnome.org>
12174
12175         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
12176         operand is of type uint, and the other operand is of type sbyte,
12177         short or int, the operands are converted to type long." -
12178         Actually do what this comment already told us.  Fixes bug #28106,
12179         added test-150.cs.
12180
12181 2002-07-24  Martin Baulig  <martin@gnome.org>
12182
12183         * class.cs (MethodBase): New abstract class.  This is now a base
12184         class for Property, Indexer and Event to avoid some code duplication
12185         in their Define() and DefineMethods() methods.
12186         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
12187         generic methods for Define() and DefineMethods().
12188         (FieldBase): Derive from MemberBase, not MemberCore.
12189         (Property): Derive from MemberBase, not MemberCore.
12190         (Property.DefineMethod): Moved all the code from this method to the
12191         new MethodBase.DefineAccessor(), just call it with appropriate
12192         argumetnts.
12193         (Property.Define): Call the new Property.DoDefine(), this does some
12194         sanity checks and we don't need to duplicate the code everywhere.
12195         (Event): Derive from MemberBase, not MemberCore.
12196         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
12197         accessors, this will also make them work with interface events.
12198         (Indexer): Derive from MemberBase, not MemberCore.
12199         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
12200         (Indexer.Define): Use the new MethodBase functions.
12201
12202         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
12203         argument to the constructor.
12204         (Interface.FindMembers): Added support for interface events.
12205         (Interface.PopluateEvent): Implemented.
12206
12207         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
12208
12209 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
12210
12211         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
12212         but this is required to check for a method name being the same as
12213         the containing class.  
12214
12215         Handle this now.
12216
12217 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12218
12219         * interface.cs: initialize variable.
12220
12221 2002-07-23  Martin Baulig  <martin@gnome.org>
12222
12223         Implemented the IndexerName attribute in interfaces.
12224
12225         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
12226         name if this is an explicit interface implementation.
12227         (Indexer.InterfaceIndexerName): New public variable.  If we're
12228         implementing an interface indexer, this is the IndexerName in that
12229         interface.  Otherwise, it's the IndexerName.
12230         (Indexer.DefineMethod): If we're implementing interface indexer,
12231         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
12232         and Pending.ImplementIndexer methods.
12233         (Indexer.Define): Also define the PropertyBuilder if we're
12234         implementing an interface indexer and this is neither an explicit
12235         interface implementation nor do the IndexerName match the one in
12236         the interface.
12237
12238         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
12239         If a method is defined here, then we always need to create a proxy
12240         for it.  This is used when implementing interface indexers.
12241         (Pending.IsInterfaceIndexer): New public method.
12242         (Pending.ImplementIndexer): New public method.
12243         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
12244         This is used when implementing interface indexers to define a proxy
12245         if necessary.
12246         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
12247         define a proxy if necessary.
12248
12249         * interface.cs (Interface.IndexerName): New public variable.
12250         (Interface.PopulateIndexer): Set the IndexerName.
12251         (Interface.DefineIndexers): New private method.  Populate all the
12252         indexers and make sure their IndexerNames match.
12253
12254         * typemanager.cs (IndexerPropertyName): Added support for interface
12255         indexers.
12256
12257 2002-07-22  Martin Baulig  <martin@gnome.org>
12258
12259         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
12260         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
12261         ret if HasReturnLabel.
12262         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
12263         variables.
12264
12265         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
12266         and set the ec.LoopBeginTryCatchLevel.
12267         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
12268         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
12269         the current ec.TryCatchLevel, the branch goes out of an exception
12270         block.  In this case, we need to use Leave and not Br.
12271
12272 2002-07-22  Martin Baulig  <martin@gnome.org>
12273
12274         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
12275         block unless the block does not always return or it is contained in
12276         another try { ... } catch { ... } block.  Fixes bug #26506.
12277         Added verify-1.cs to the test suite.
12278
12279 2002-07-22  Martin Baulig  <martin@gnome.org>
12280
12281         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
12282         then we do not always return.  Fixes bug #24985.
12283
12284 2002-07-22  Martin Baulig  <martin@gnome.org>
12285
12286         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
12287         lookup on a per-class level; ie. walk up the class hierarchy until we
12288         found at least one applicable method, then choose the best among them.
12289         Fixes bug #24463 and test-29.cs.
12290
12291 2002-07-22  Martin Baulig  <martin@gnome.org>
12292
12293         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
12294         return types of the methods.  The return type is not part of the
12295         signature and we must not check it to make the `new' modifier work.
12296         Fixes bug #27999, also added test-147.cs.
12297         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
12298
12299         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
12300         on the method's return type.
12301
12302 2002-07-21  Martin Baulig  <martin@gnome.org>
12303
12304         * assign.cs: Make this work if the rightmost source is a constant and
12305         we need to do an implicit type conversion.  Also adding a few more tests
12306         to test-38.cs which should have caught this.
12307
12308         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
12309         target in the makefile for this.  The makefile.gnu is primarily intended
12310         for end-users who don't want to debug the compiler.
12311
12312 2002-07-21  Martin Baulig  <martin@gnome.org>
12313
12314         * assign.cs: Improved the Assign class so it can now handle embedded
12315         assignments (X = Y = Z = something).  As a side-effect this'll now also
12316         consume less local variables.  test-38.cs now passes with MCS, added
12317         a few new test cases to that test.
12318
12319 2002-07-20  Martin Baulig  <martin@gnome.org>
12320
12321         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
12322         instructions.  Fixes bug #27977, also added test-146.cs.
12323
12324 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12325
12326         * cs-tokenizer.cs: fixed getHex ().
12327
12328 2002-07-19  Martin Baulig  <martin@gnome.org>
12329
12330         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
12331         not Type.GetType() to lookup the array type.  This is needed when
12332         we're constructing an array of a user-defined type.
12333         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
12334         single-dimensional arrays, but also for single-dimensial arrays of
12335         type decimal.
12336
12337 2002-07-19  Martin Baulig  <martin@gnome.org>
12338
12339         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
12340         this function is called, it's not allowed to share LocalBuilders
12341         among ILGenerators.
12342
12343 2002-07-19  Martin Baulig  <martin@gnome.org>
12344
12345         * expression.cs (Argument.Resolve): Report an error 118 when trying
12346         to pass a type as argument.
12347
12348 2002-07-18  Martin Baulig  <martin@gnome.org>
12349
12350         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
12351         Conv_R_Un for the signed `long' type.
12352
12353 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
12354
12355         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
12356         `expr' for the temporary result, as that will fail if we do
12357         multiple resolves on the same expression.
12358
12359 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
12360
12361         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
12362         ec.TypeContainer for looking up aliases. 
12363
12364         * class.cs (TypeContainer): Remove LookupAlias from here.
12365
12366         * decl.cs (DeclSpace); Move here.
12367
12368 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
12369
12370         * class.cs (FindMembers): Only call filter if the constructor
12371         bulider is not null.
12372
12373         Also handle delegates in `NestedTypes' now.  Now we will perform
12374         type lookups using the standard resolution process.  This also
12375         fixes a bug.
12376
12377         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
12378         This uses Expressions (the limited kind that can be parsed by the
12379         tree) instead of strings.
12380
12381         * expression.cs (ComposedCast.ToString): Implement, used to flag
12382         errors since now we have to render expressions.
12383
12384         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
12385         FormArrayType. 
12386
12387         * ecore.cs (SimpleName.ToString): ditto.
12388
12389         * cs-parser.jay: Instead of using strings to assemble types, use
12390         Expressions to assemble the type (using SimpleName, ComposedCast,
12391         MemberAccess).  This should fix the type lookups in declarations,
12392         because we were using a different code path for this.
12393
12394         * statement.cs (Block.Resolve): Continue processing statements
12395         even when there is an error.
12396
12397 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
12398
12399         * class.cs (Event.Define): Also remove the `remove' method from
12400         the list of pending items.
12401
12402         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
12403         generate more compact code. 
12404
12405 2002-07-17  Martin Baulig  <martin@gnome.org>
12406
12407         * const.cs (Const.LookupConstantValue): Add support for constant
12408         `unchecked' and `checked' expressions.
12409         Also adding test case test-140.cs for this.
12410
12411 2002-07-17  Martin Baulig  <martin@gnome.org>
12412
12413         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
12414         check whether mi.ReturnType implements the IEnumerator interface; the
12415         `==' and the IsAssignableFrom() will fail in this situation.
12416
12417 2002-07-16  Ravi Pratap  <ravi@ximian.com>
12418
12419         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
12420         here too.
12421
12422 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12423
12424         * expression.cs: fixed bug #27811.
12425
12426 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
12427
12428         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
12429         Molaro: when we are a ref, the value already contains a pointer
12430         value, do not take the address of it.
12431
12432 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
12433         * removed mb-parser.jay and mb-tokenizer.cs
12434
12435 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12436
12437         * expression.cs: check against the building corlib void type.
12438
12439 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
12440
12441         * ecore.cs: fix for valuetype static readonly fields: when 
12442         initializing them, we need their address, not the address of a copy.
12443
12444 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
12445
12446         * typemanager.cs: register also enum_type in corlib.
12447
12448 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12449
12450         * class.cs: allow calling this (but not base) initializers in structs.
12451
12452 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
12453
12454         * ecore.cs: make sure we compare against the building base types
12455         in GetTypeSize ().
12456
12457 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
12458
12459         * typemanager.cs: fix TypeToCoreType() to handle void and object
12460         (corlib gets no more typerefs after this change).
12461
12462 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
12463
12464         * expression.cs (ArrayCreation.EmitArrayArguments): use
12465         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
12466
12467         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
12468         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
12469         array indexes, the runtime actually forbids them.
12470
12471         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
12472         for array arguments here.
12473
12474         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
12475         instead of the default for ValueTypes.
12476
12477         (New.DoEmit): Use IsValueType instead of
12478         IsSubclassOf (value_type)
12479         (New.DoResolve): ditto.
12480         (Invocation.EmitCall): ditto.
12481
12482         * assign.cs (Assign): ditto.
12483
12484         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
12485         Statements *are* currently doing part of their resolution during
12486         Emit.  
12487
12488         Expressions do always resolve during resolve, but statements are
12489         only required to propagate resolution to their children.
12490
12491 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
12492
12493         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
12494
12495         (LoadAssembly): Do not add the dll if it is already specified
12496
12497         (MainDriver): Add the System directory to the link path at the end,
12498         after all the other -L arguments. 
12499
12500         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
12501         wrong opcode for loading bytes and bools (ldelem.i1 instead of
12502         ldelem.u1) and using the opposite for sbytes.
12503
12504         This fixes Digger, and we can finally run it.
12505
12506         * driver.cs (UnixParseOption): Move the option parsing here.  
12507         (CSCParseOption): Implement CSC-like parsing of options.
12508
12509         We now support both modes of operation, the old Unix way, and the
12510         new CSC-like way.  This should help those who wanted to make cross
12511         platform makefiles.
12512
12513         The only thing broken is that /r:, /reference: and /lib: are not
12514         implemented, because I want to make those have the same semantics
12515         as the CSC compiler has, and kill once and for all the confussion
12516         around this.   Will be doing this tomorrow.
12517
12518         * statement.cs (Unsafe.Resolve): The state is checked during
12519         resolve, not emit, so we have to set the flags for IsUnsfe here.
12520
12521 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12522
12523         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
12524         not catch the Error_ObjectRefRequired in SimpleName (as it is
12525         possible to have a class/instance variable name that later gets
12526         deambiguated), we have to check this here.      
12527
12528 2002-07-10  Ravi Pratap  <ravi@ximian.com>
12529
12530         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
12531         make static and put into Expression.
12532
12533         (Event.Define): Register the private field of the event with the 
12534         TypeManager so that GetFieldFromEvent can get at it.
12535
12536         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
12537         keep track of the private field associated with an event which
12538         has no accessors.
12539
12540         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
12541         private field.
12542
12543         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
12544
12545 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12546
12547         * expression.cs (Binary.EmitBranchable): this routine emits the
12548         Binary expression in a branchable context.  This basically means:
12549         we need to branch somewhere, not just get the value on the stack.
12550
12551         This works together with Statement.EmitBoolExpression.
12552
12553         * statement.cs (Statement.EmitBoolExpression): Use
12554         EmitBranchable. 
12555
12556 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
12557
12558         * statement.cs (For): Reduce the number of jumps in loops.
12559
12560         (For): Implement loop inversion for the For statement.
12561
12562         (Break): We can be breaking out of a Try/Catch controlled section
12563         (foreach might have an implicit try/catch clause), so we need to
12564         use Leave instead of Br.
12565
12566         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
12567         now).  If the instace expression supports IMemoryLocation, we use
12568         the AddressOf method from the IMemoryLocation to extract the
12569         address instead of emitting the instance.
12570
12571         This showed up with `This', as we were emitting the instance
12572         always (Emit) instead of the Address of This.  Particularly
12573         interesting when This is a value type, as we dont want the Emit
12574         effect (which was to load the object).
12575
12576 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
12579
12580         * statement.cs (Checked): Set the CheckedState during the resolve
12581         process too, as the ConvCast operations track the checked state on
12582         the resolve process, and not emit.
12583
12584         * cs-parser.jay (namespace_member_declaration): Flag that we have
12585         found a declaration when we do.  This is used to flag error 1529
12586
12587         * driver.cs: Report ok when we display the help only.
12588
12589 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
12590
12591         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
12592
12593 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
12594
12595         * cs-tokenizer.cs (define): We also have to track locally the
12596         defines.  AllDefines is just used for the Conditional Attribute,
12597         but we also need the local defines for the current source code. 
12598
12599 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
12600
12601         * statement.cs (While, For, Do): These loops can exit through a
12602         Break statement, use this information to tell whether the
12603         statement is the last piece of code.
12604
12605         (Break): Flag that we break.
12606
12607         * codegen.cs (EmitContexts): New `Breaks' state variable.
12608
12609 2002-07-03  Martin Baulig  <martin@gnome.org>
12610
12611         * class.cs (TypeContainer.MethodModifiersValid): Allow override
12612         modifiers in method declarations in structs.  Otherwise, you won't
12613         be able to override things like Object.Equals().
12614
12615 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12616
12617         * class.cs (Method, Property, Indexer): Do not allow the public
12618         modifier to be used in explicit interface implementations.
12619
12620         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
12621         override modifiers in method declarations in structs
12622
12623 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
12624
12625         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
12626         integer or real overflow, report an error
12627
12628 2002-07-02  Martin Baulig  <martin@gnome.org>
12629
12630         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
12631         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
12632         to tell the runtime about our newly created System.Object and
12633         System.ValueType types.
12634
12635 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12636
12637         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
12638         struct instead of Ldarg/Starg.
12639
12640 2002-07-02  Martin Baulig  <martin@gnome.org>
12641
12642         * expression.cs (Indirection.Indirection): Call
12643         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
12644
12645 2002-07-02  Martin Baulig  <martin@gnome.org>
12646
12647         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
12648         ValueType, call TypeManager.TypeToCoreType() on it.
12649         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
12650         the OpCodes.Newarr argument.
12651
12652 2002-07-02  Martin Baulig  <martin@gnome.org>
12653
12654         * expression.cs (Invocation.EmitCall): When compiling corlib,
12655         replace all calls to the system's System.Array type to calls to
12656         the newly created one.
12657
12658         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
12659         System.Array methods.
12660         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
12661         from the system's System.Array type which must be replaced.
12662
12663 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
12664
12665         * typemanager.cs: load unverifiable_code_ctor so we can build
12666         corlib using the correct type. Avoid using GetTypeCode() with
12667         TypeBuilders.
12668         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
12669         TypeManager.object_type to allow building corlib.
12670
12671 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
12672
12673         * ecore.cs: handle System.Enum separately in LoadFromPtr().
12674
12675 2002-07-01  Martin Baulig  <martin@gnome.org>
12676
12677         * class.cs: Make the last change actually work, we need to check
12678         whether `ifaces != null' to avoid a crash.
12679
12680 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12681
12682         * class.cs: when we build structs without fields that implement
12683         interfaces, we need to add the interfaces separately, since there is
12684         no API to both set the size and add the interfaces at type creation
12685         time.
12686
12687 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12688
12689         * expression.cs: the dimension arguments to the array constructors
12690         need to be converted if they are a long.
12691
12692 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
12693
12694         * class.cs: don't emit ldarg.0 if there is no parent constructor
12695         (fixes showstopper for corlib).
12696
12697 2002-06-29  Martin Baulig  <martin@gnome.org>
12698
12699         MCS now compiles corlib on GNU/Linux :-)
12700
12701         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
12702         ie. check for MethodImplOptions.InternalCall.
12703
12704         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
12705         and TypeManager.attribute_type are null, so we must explicitly check
12706         whether parent is not null to find out whether it's an attribute type.
12707         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
12708         and SetBuilder, not only if the property is neither abstract nor external.
12709         This is necessary to set the MethodImplOptions on the accessor methods.
12710         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
12711         SetBuilder, see Property.Emit().
12712
12713         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
12714         populate "System.Object", "System.ValueType" and "System.Attribute" since
12715         they've already been populated from BootCorlib_PopulateCoreTypes().
12716
12717 2002-06-29  Martin Baulig  <martin@gnome.org>
12718
12719         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
12720         is the NullLiteral, we also need to make sure that target_type is not
12721         an enum type.   
12722
12723 2002-06-29  Martin Baulig  <martin@gnome.org>
12724
12725         * rootcontext.cs (RootContext.ResolveCore): We must initialize
12726         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
12727         before calling BootstrapCorlib_ResolveDelegate ().
12728
12729 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12730
12731         * statement.cs: fixed build-breaker. All tests passed ok.
12732
12733 2002-06-27  Martin Baulig  <martin@gnome.org>
12734
12735         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
12736         for System.Decimal when compiling corlib.
12737
12738 2002-06-27  Martin Baulig  <martin@gnome.org>
12739
12740         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
12741         switch blocks which contain nothing but a default clause.
12742
12743 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
12744
12745        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
12746
12747 2002-06-27  Martin Baulig  <martin@gnome.org>
12748
12749         * ecore.cs (PropertyExpr.PropertyExpr): Call
12750         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
12751
12752         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
12753         is already a TypeBuilder.
12754
12755 2002-06-27  Martin Baulig  <martin@gnome.org>
12756
12757         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
12758         `target_type == TypeManager.array_type', not IsAssignableFrom() in
12759         the "from an array-type to System.Array" case.  This makes it work
12760         when compiling corlib.
12761
12762 2002-06-27  Martin Baulig  <martin@gnome.org>
12763
12764         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
12765         non-static PropertyExpr, set its InstanceExpression.  This makes
12766         the `ICollection.Count' property work in System/Array.cs.
12767
12768 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
12769
12770         * driver.cs: Made error handling more consistent.  Errors now
12771         tracked by Report class, so many methods which used to return int
12772         now return void.  Main() now prints success/failure and 
12773         errors/warnings message.
12774
12775         Renamed '--probe' compiler argument to '--expect-error'.  Removed
12776         the magic number return values (123 and 124).  Now, if the
12777         expected error occurs, the compiler exits with success (exit value
12778         0).  If the compilation completes without seeing that particular
12779         error, the compiler exits with failure (exit value 1).  The
12780         makefile in mcs/errors has been changed to handle the new behaviour.
12781
12782         * report.cs: Made 'expected error' number a property and renamed
12783         it from 'Probe' to 'ExpectedError'.
12784
12785         * genericparser.cs: Removed error handling support, since it is
12786         now all done by Report class.
12787
12788         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
12789         class, so parse() no longer returns an int.
12790
12791         * namespace.cs: Use Report.Error instead of GenericParser.error
12792
12793 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
12794
12795         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
12796         TypeContainer.AddOperator): At the front of the list put the
12797         explicit implementations, so they get resolved/defined first. 
12798
12799 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
12800
12801         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
12802         interface type is implemented by this TypeContainer.  Used during
12803         explicit interface implementation.
12804
12805         (Property.Define, Indexer.Define, Method.Define): Validate that
12806         the given interface in the explicit implementation is one of the
12807         base classes for the containing type.
12808
12809         Also if we are explicitly implementing an interface, but there is
12810         no match in the pending implementation table, report an error.
12811
12812         (Property.Define): Only define the property if we are
12813         not explicitly implementing a property from an interface.  Use the
12814         correct name also for those properties (the same CSC uses,
12815         although that is really not needed).
12816
12817         (Property.Emit): Do not emit attributes for explicitly implemented
12818         properties, as there is no TypeBuilder.
12819
12820         (Indexer.Emit): ditto.
12821
12822         Hiding then means that we do not really *implement* a pending
12823         implementation, which makes code fail.
12824
12825 2002-06-22  Martin Baulig  <martin@gnome.org>
12826
12827         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
12828         the return value of Object.GetType().  [FIXME: we need to do this whenever
12829         we get a type back from the reflection library].
12830
12831 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
12832
12833         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
12834
12835 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
12836
12837         * attribute.cs: Return null if we can not look up the type.
12838
12839         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
12840         the interface types found.
12841
12842         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
12843         interface types found.
12844
12845         * typemanager.cs (GetInterfaces): Make this routine returns alll
12846         the interfaces and work around the lame differences between
12847         System.Type and System.Reflection.Emit.TypeBuilder in the results
12848         result for GetInterfaces.
12849
12850         (ExpandInterfaces): Given an array of interface types, expand and
12851         eliminate repeated ocurrences of an interface.  This expands in
12852         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
12853         be IA, IB, IC.
12854
12855 2002-06-21  Martin Baulig  <martin@gnome.org>
12856
12857         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
12858         on System.Enum.
12859
12860 2002-06-21  Martin Baulig  <martin@gnome.org>
12861
12862         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
12863         and called with one of the core types, return the corresponding typebuilder for
12864         that type.
12865
12866         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
12867         element type.
12868
12869 2002-06-21  Martin Baulig  <martin@gnome.org>
12870
12871         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
12872         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
12873         (Expression.ConvertReferenceExplicit): Likewise.
12874
12875         * expression.cs (ElementAccess.DoResolve): Likewise.
12876         (ElementAccess.DoResolveLValue): Likewise.
12877
12878 2002-06-10  Martin Baulig  <martin@gnome.org>
12879
12880         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
12881         add the "value" parameter to the parameter list.
12882
12883         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
12884         to our caller.
12885
12886 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
12887
12888         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
12889         the argument to an int, uint, long or ulong, per the spec.  Also
12890         catch negative constants in array creation.
12891
12892 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
12893
12894         * class.cs: do not allow the same interface to appear twice in
12895         the definition list.
12896
12897 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
12898
12899         * ecore.cs: don't use ldlen with System.Array.
12900
12901 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
12902
12903         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
12904
12905 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
12906
12907         * modifiers.cs: produce correct field attributes for protected
12908         internal. Easy fix so miguel can work on ther harder stuff:-)
12909
12910 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
12911
12912         * pending.cs: New file.  Move the code from class.cs here.
12913         Support clearning the pending flag for all methods (when not doing
12914         explicit interface implementation).
12915
12916 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
12917
12918         * rootcontext.cs: added a couple more types needed to bootstrap.
12919
12920 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
12921
12922         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
12923         constructor in the type, instead of any constructor in the type
12924         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
12925         a bug in the Mono runtime when applying the params attribute). 
12926
12927 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
12928         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
12929
12930 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
12931
12932         * expression.cs (Unary.ResolveOperator): Use TypeManager
12933         to resolve the type.
12934
12935 2002-06-13  Ravi Pratap  <ravi@ximian.com>
12936
12937         * cs-parser.jay (enum_member_declaration): Pass in the attributes
12938         attached.
12939
12940         * enum.cs (AddEnumMember): Add support to store the attributes associated 
12941         with each member too.
12942
12943         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
12944         field builders too - this takes care of the enum member case.
12945
12946 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
12947
12948         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
12949         address-of operator on both value types and pointers.
12950
12951 2002-06-10  Martin Baulig  <martin@gnome.org>
12952
12953         * interface.cs (Interface.PopulateIndexer): Add the indexer's
12954         PropertyBuilder to the `property_builders' list.
12955
12956         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
12957         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
12958         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
12959         find any indexers which are inherited from an interface.
12960
12961 2002-06-09  Martin Baulig  <martin@gnome.org>
12962
12963         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
12964         the same type as the constant if necessary.  There's also a test-130.cs
12965         for this.
12966
12967         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
12968
12969         * typemanager.cs (TypeManager.ChangeType): Previously known as
12970         Enum.ChangeEnumType().
12971
12972 2002-06-09  Martin Baulig  <martin@gnome.org>
12973
12974         * expression.cs (Cast.TryReduce): Added support for consts.
12975
12976 2002-06-08  Ravi Pratap  <ravi@ximian.com>
12977
12978         * class.cs (Accessor): Hold attributes information so we can pass
12979         it along.
12980
12981         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
12982         Modify to pass in attributes attached to the methods.
12983
12984         (add_accessor_declaration, remove_accessor_declaration): Ditto.
12985
12986         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
12987         to handle the Accessor kind :-)
12988
12989         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
12990
12991 2002-06-08  Martin Baulig  <martin@gnome.org>
12992
12993         * expression.cs (Unary.TryReduceNegative): Added support for
12994         ULongConstants.
12995
12996 2002-06-08  Martin Baulig  <martin@gnome.org>
12997
12998         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
12999         name can't be found in the `defined_names' - the caller will do a
13000         MemberLookup in this case and thus find methods in System.Enum
13001         such as Enum.IsDefined().
13002
13003 2002-06-08  Martin Baulig  <martin@gnome.org>
13004
13005         * enum.cs (Enum.ChangeEnumType): This is a custom version of
13006         Convert.ChangeType() which works with TypeBuilder created types.
13007         (Enum.LookupEnumValue, Enum.Define): Use it here.
13008
13009         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
13010         `TypeBuilder.BaseType != null' check.
13011         (TypeContainer.FindMembers): Only lookup parent members if we
13012         actually have a parent.
13013         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
13014         (ConstructorInitializer.Resolve): Likewise.
13015
13016         * interface.cs (Interface.FindMembers): Added
13017         `TypeBuilder.BaseType != null' check.
13018
13019         * rootcontext.cs (RootContext.ResolveCore): Added
13020         "System.Runtime.CompilerServices.IndexerNameAttribute" to
13021         classes_second_stage.
13022
13023         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
13024         debug_type and trace_type when compiling with --nostdlib.       
13025
13026 2002-06-07  Martin Baulig  <martin@gnome.org>
13027
13028         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
13029         (AddField): Set it to true when adding a non-static field.
13030         (DefineType): Use `have_nonstatic_fields' to find out whether we
13031         have non-static fields, not `Fields != null'.
13032
13033 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
13034
13035         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
13036         dereferencing a null on the static-field code path)
13037
13038 2002-05-30  Martin Baulig  <martin@gnome.org>
13039
13040         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
13041         to take command line arguments.  Use reflection to call the new
13042         custom `Initialize' function on the symbol writer and pass it the
13043         command line arguments.
13044
13045         * driver.cs (--debug-args): New command line argument to pass command
13046         line arguments to the symbol writer.
13047
13048 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
13049
13050         * assign.cs (DoResolve): Forgot to do the implicit conversion to
13051         the target type for indexers and properties.  Thanks to Joe for
13052         catching this.
13053
13054 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
13055
13056         * typemanager.cs (MethodFlags): returns the method flags
13057         (Obsolete/ShouldIgnore) that control warning emission and whether
13058         the invocation should be made, or ignored. 
13059
13060         * expression.cs (Invocation.Emit): Remove previous hack, we should
13061         not do this on matching a base type, we should do this based on an attribute
13062
13063         Only emit calls to System.Diagnostics.Debug and
13064         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
13065         on the command line.
13066
13067         * rootcontext.cs: Global settings for tracing and debugging.
13068
13069         * cs-tokenizer.cs (define): New utility function to track
13070         defines.   Set the global settings for TRACE and DEBUG if found.
13071
13072 2002-05-25  Ravi Pratap  <ravi@ximian.com>
13073
13074         * interface.cs (Populate*): Pass in the TypeContainer as well as
13075         the DeclSpace as parameters so that we can create EmitContexts and
13076         then use that to apply attributes etc.
13077
13078         (PopulateMethod, PopulateEvent, PopulateProperty)
13079         (PopulateIndexer): Apply attributes everywhere.
13080
13081         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
13082         etc.
13083
13084         (ApplyAttributes): Update accordingly.
13085
13086         We now apply interface attributes for all members too.
13087
13088 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
13089
13090         * class.cs (Indexer.Define); Correctly check if we are explicit
13091         implementation (instead of checking the Name for a ".", we
13092         directly look up if the InterfaceType was specified).
13093
13094         Delay the creation of the PropertyBuilder.
13095
13096         Only create the PropertyBuilder if we are not an explicit
13097         interface implementation.   This means that explicit interface
13098         implementation members do not participate in regular function
13099         lookups, and hence fixes another major ambiguity problem in
13100         overload resolution (that was the visible effect).
13101
13102         (DefineMethod): Return whether we are doing an interface
13103         implementation. 
13104
13105         * typemanager.cs: Temporary hack until we get attributes in
13106         interfaces (Ravi is working on that) and we get IndexerName
13107         support in interfaces.
13108
13109         * interface.cs: Register the indexers as properties.
13110
13111         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
13112         warning, I have verified that this is a bug in the .NET runtime
13113         (JavaScript suffers of the same problem).
13114
13115         * typemanager.cs (MemberLookup): When looking up members for
13116         interfaces, the parent of an interface is the implicit
13117         System.Object (so we succeed in searches of Object methods in an
13118         interface method invocation.  Example:  IEnumerable x;  x.ToString
13119         ()) 
13120
13121 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
13122
13123         * class.cs (Event): Events should also register if they do
13124         implement the methods that an interface requires.
13125
13126         * typemanager.cs (MemberLookup); use the new GetInterfaces
13127         method. 
13128
13129         (GetInterfaces): The code used to lookup interfaces for a type is
13130         used in more than one place, factor it here. 
13131
13132         * driver.cs: Track the errors at the bottom of the file, we kept
13133         on going.
13134
13135         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
13136         instance if the method we are calling is static!
13137
13138 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
13139
13140         * attribute.cs (ApplyAttributes): Make this function filter out
13141         the IndexerName attribute (as that attribute in reality is never
13142         applied) and return the string constant for the IndexerName
13143         attribute. 
13144
13145         * class.cs (TypeContainer.Emit): Validate that all the indexers
13146         have the same IndexerName attribute, and if so, set the
13147         DefaultName attribute on the class. 
13148
13149         * typemanager.cs: The return value might contain other stuff (not
13150         only methods).  For instance, consider a method with an "Item"
13151         property and an Item method.
13152
13153         * class.cs: If there is a problem with the parameter types,
13154         return. 
13155
13156 2002-05-24  Ravi Pratap  <ravi@ximian.com>
13157
13158         * ecore.cs (ImplicitConversionExists): Wrapper function which also
13159         looks at user defined conversion after making a call to 
13160         StandardConversionExists - we need this for overload resolution.
13161
13162         * expression.cs : Update accordingly the various method calls.
13163
13164         This fixes 2 bugs filed against implicit user defined conversions 
13165
13166 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
13167
13168         * statement.cs: Track the result of the assignment.
13169
13170 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
13171
13172         * expression.cs (MemberAccess): Improved error reporting for
13173         inaccessible members.
13174
13175 2002-05-22  Martin Baulig  <martin@gnome.org>
13176
13177         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
13178         itself with debugging support.
13179
13180 2002-05-22  Martin Baulig  <martin@gnome.org>
13181
13182         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
13183         Removed, this isn't needed anymore.
13184
13185 2002-05-20  Martin Baulig  <martin@gnome.org>
13186
13187         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
13188         be underlying type for an enum.
13189
13190 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
13191
13192         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
13193         that splits out the loading of just the core types.
13194
13195         * rootcontext.cs (ResolveCore): Split the struct resolution in
13196         two, so we can load the enumeration underlying types before any
13197         enums are used.
13198
13199         * expression.cs (Is): Bandaid until we fix properly Switch (see
13200         bug #24985 for details).
13201
13202         * typemanager.cs (ImplementsInterface): The hashtable will contain
13203         a null if there are no interfaces implemented.
13204
13205 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
13206
13207         * cs-parser.jay (indexer_declarator): It is fine to have array
13208         parameters
13209
13210 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13211
13212         * typemanager.cs: (RegisterBuilder): New function used to register
13213         TypeBuilders that implement interfaces.  Since
13214         TypeBuilder.GetInterfaces (as usual) does not work with lame
13215         Reflection.Emit. 
13216         (AddUserType): register interfaces.
13217
13218         (ImplementsInterface): Use the builder_to_ifaces hash if we are
13219         dealing with TypeBuilder.  Also, arrays are showing up as
13220         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
13221         methods can not be invoked on them!
13222
13223         * ecore.cs (ExplicitReferenceConversionExists): Made public.
13224         (ImplicitReferenceConversionExists): Split out from
13225         StandardConversionExists. 
13226
13227         * expression.cs (As): We were only implementing one of the three
13228         cases for the as operator.  We now implement them all.
13229         (Is): Implement the various other cases for Is as well.
13230
13231         * typemanager.cs (CACHE): New define used to control if we want or
13232         not the FindMembers cache.  Seems to have a negative impact on
13233         performance currently
13234
13235         (MemberLookup): Nested types have full acess to
13236         enclosing type members
13237
13238         Remove code that coped with instance/static returns for events, we
13239         now catch this in RealFindMembers.
13240
13241         (RealFindMembers): only perform static lookup if the instance
13242         lookup did not return a type or an event.  
13243
13244 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13245
13246         * assign.cs (CompoundAssign): We pass more semantic information
13247         now to Compound Assignments than we did before: now we have all
13248         the information at hand, and now we resolve the target *before* we
13249         do the expression expansion, which allows the "CacheValue" method
13250         to have the effect we intended (before, a [x] += 1 would generate
13251         two differen ArrayAccess expressions from the ElementAccess,
13252         during the resolution process).
13253
13254         (CompoundAssign.DoResolve): Resolve target and original_source here.
13255
13256 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
13257
13258         * expression.cs (ArrayAccess): dropped debugging information. 
13259
13260         * typemanager.cs: Small bug fix: I was always returning i_members,
13261         instead of one of i_members or s_members (depending on which had
13262         the content).
13263
13264         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
13265         method is invoked before any code generation takes place, and it
13266         is a mechanism to inform that the expression will be invoked more
13267         than once, and that the method should use temporary values to
13268         avoid having side effects
13269
13270         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
13271
13272         * ecore.cs (Expression.CacheTemporaries): Provide empty default
13273         implementation.
13274
13275         * expression.cs (Indirection, ArrayAccess): Add support for
13276         CacheTemporaries in these two bad boys. 
13277
13278         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
13279         ldobj or ldind_ref.  
13280         (StoreFromPtr): Handle stobj as well.
13281
13282         * expression.cs (UnaryMutator): Share more code.
13283
13284         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
13285         down: I was not tracking the Filter function as well, which
13286         was affecting the results of the cache.
13287
13288 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * attribute.cs: Remove the hack to handle the CharSet property on
13291         StructLayouts. 
13292
13293 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
13294
13295         * attribute.cs (DoResolve): More uglyness, we now only try to
13296         resolve the attribute partially, to extract the CharSet
13297         information (only if we are a StructLayout attribute).  Otherwise 
13298
13299         (GetExtraTypeInfo): Add some code to conditionally kill in the
13300         future this.   I am more and more convinced that the .NET
13301         framework has special code to handle the attribute setting on
13302         certain elements.
13303
13304         * expression.cs (IsParamsMethodApplicable): Revert my previous
13305         foreach change here, it was wrong.
13306
13307 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
13308
13309         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
13310         (pp_expr): do not abort on unknown input, just return.
13311         (eval): abort if there are pending chars.
13312
13313         * attribute.cs (Attribute.Resolve): Positional parameters are
13314         optional.  Deal with that case.
13315
13316         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
13317         the Ansi/Unicode/Auto information for the type.
13318
13319         (TypeContainer.DefineType): instantiate the EmitContext here, as
13320         we will be using it during the type definition (to resolve
13321         attributes) and during the emit phase.
13322
13323         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
13324         to pull type information out of the attributes
13325
13326         (Attribute.Resolve): track the constructor builder, and allow for
13327         multiple invocations (structs and classes will use this).
13328
13329         * ecore.cs (MemberLookupFinal): new version with all the
13330         parameters customizable.
13331
13332         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
13333         constructors.  Return if the result value is null (as the error
13334         would have been flagged already by MemberLookupFinal)
13335
13336         Do not allow instances of abstract classes or interfaces to be
13337         created.
13338
13339         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
13340         We have to compare the assembly property here when dealing with
13341         FamANDAssem and Assembly access modifiers, because we might be
13342         creating an assembly from *modules* (that means that we are not
13343         getting TypeBuilders for types defined in other modules that are
13344         part of this assembly).
13345
13346         (Method.Emit): If the method is marked abstract and has a body,
13347         emit an error. 
13348
13349         (TypeContainer.DefineMembers): If both the defined member and the
13350         parent name match are methods, then do not emit any warnings: let
13351         the Method.Define routine take care of flagging warnings.  But if
13352         there is a mismatch (method overrides something else, or method is
13353         overriwritten by something, then emit warning).
13354
13355         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
13356         set to null, this means `do not check for the return type on the
13357         signature'. 
13358
13359         (Method.Define): set the return type for the method signature to
13360         null, so that we get methods with the same name and parameters and
13361         different return types.  This is used to flag warning 114 (you are
13362         hiding a method, and you probably want to use the new/override
13363         keywords instead).
13364
13365         * typemanager.cs (MemberLookup): Implemented proper access
13366         control, closing a long standing set of bug reports.  The problem
13367         was that the Framework only has two bits: Public and NonPublic,
13368         and NonPublic includes private and protected methods, but we need
13369         to enforce the FamANDAssem, FamOrAssem and Family. 
13370
13371 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
13372
13373         * statement.cs (GotoCase): Return true: Ammounts to giving up
13374         knowledge on whether we return or not, and letting the other case
13375         be responsible for it.
13376
13377 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
13378
13379         * driver.cs: Do not load directories for each file processed, only
13380         do it if there is a pattern.
13381
13382         * ecore.cs: Report readonly assigns here as well, as we might have
13383         been resolved only by MemberAccess.
13384
13385         (SimpleName.SimpleNameResolve): Also be useful for LValue
13386         resolution.   We need this to propagate assign to local readonly variables
13387
13388         * typemanager.cs: Use a ptrhashtable for the criteria, because we
13389         do not want to reuse potential criteria memory.
13390
13391         * class.cs (MyEventBuilder): Set reflected_type;
13392
13393         * ecore.cs (Constantify): Added support for constifying bools.
13394
13395         (RootContext.LookupType): Added a cache for values looked up in
13396         the declaration space.
13397
13398         * typemanager.cs (FindMembers): Now is a front-end to
13399         RealFindMembers, and provides a two-level hashtable-based cache to
13400         the request.  
13401
13402         15% performance improvement: from 22.5 to 19.2 seconds.
13403
13404         * expression.cs (IsParamsMethodApplicable): use foreach.
13405         (Invocation.DoResolve): ditto.
13406         (New.DoResolve): ditto.
13407         (ArrayCreation.DoResolve): ditto.
13408
13409         * ecore.cs (FindMostEncompassingType): use foreach.
13410
13411         * delegate.cs (NewDelegate.DoResolve): Use foreach
13412
13413         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
13414         (RemoveMethods): use foreach.
13415
13416         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
13417         nested foreach statements instead of for, and also break out of
13418         the inner loop once a match is found.
13419
13420         (Invocation.OverloadResolve): Use foreach, simplify the code. 
13421
13422 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
13423
13424         * cfold.cs (BinaryFold): During an enumeration evaluation context,
13425         we actually unwrap the expression to allow for extra information
13426         to be extracted. 
13427
13428         * expression.cs: Use Shr_Un on unsigned operations. 
13429
13430 2002-05-08  Ravi Pratap  <ravi@ximian.com>
13431
13432         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
13433         applicable operators was not being considered correctly. This closes
13434         the bug Miguel reported.
13435
13436 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
13437
13438         * attribute.cs: check that the type derives from System.Attribute
13439         and report the correct error in that case (moved the duplicate code to
13440         its own method, too).
13441
13442 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
13443
13444         * attribute.cs: lookup attribute type name as the spec says: first the
13445         bare attribute name and then name + "Attribute" (nant compiles with
13446         mcs after this fix).
13447
13448 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
13449
13450         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
13451         Because of the way we parse things, we should try to see if a
13452         UIntConstant can fit in an integer.
13453
13454 2002-05-07  Ravi Pratap  <ravi@ximian.com>
13455
13456         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
13457         when we are in an explicit context.
13458
13459         (ConvertReferenceExplicit): When converting from Iface type S to Class
13460         T make sure the rules are implemented as an OR.
13461
13462         * parameter.cs (ParameterType): Make it a property for now although the
13463         purpose really isn't anything immediate.
13464
13465         * expression.cs (Is*Applicable): Do better checking on the parameter type
13466         of a ref/out parameter. The ones from the system assemblies are already 
13467         marked with the correct type so we don't need to do any correction.
13468
13469         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
13470         the object type is standard too so include that.
13471
13472 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13473
13474         * ecore.cs (StandardConversionExists): Augment with missing code:
13475         deal with IntConstant, LongConstants and Enumerations.
13476
13477         * assign.cs: Report the error, instead of failing silently
13478
13479         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
13480         typecontainer that they are declared, because the
13481         typecontainer/namespace will have the list of using clauses that
13482         need to be applied.
13483
13484         Assembly Attributes were escaping the normal registration
13485         mechanism. 
13486
13487         (EmitCode): Apply attributes within an EmitContext that represents
13488         the container they were declared on.
13489
13490         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
13491
13492 2002-05-06  Ravi Pratap  <ravi@ximian.com>
13493
13494         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
13495         Revamp completely - make much cleaner as we now operate only
13496         on a set of Types.
13497
13498         (FindMostSpecificSource, FindMostSpecificTarget): New methods
13499         to implement the logic detailed in the spec more correctly.
13500
13501         (UserDefinedConversion): Update accordingly.
13502
13503 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13504
13505         * statement.cs: Return flow analysis information up.
13506
13507         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
13508         and the default.
13509
13510         (token): Do not consume an extra character before calling
13511         decimal_digits.
13512
13513 2002-05-06  Piers Haken <piersh@friskit.com>
13514
13515         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
13516
13517 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13518
13519         * class.cs (Constructor.Emit): Set the IsStatic flag in the
13520         EmitContext during the instance constructor initializer
13521         resolution, to stop access to instance variables.
13522
13523         This is mandated by the spec, last paragraph of the `constructor
13524         initializers' section. 
13525
13526 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
13527
13528         * cs-parser.jay, class.cs (Accessor): new class used to represent
13529         an accessor (get or set).  In the past we used `null' to represent
13530         a missing accessor.  But this is ambiguous because there was no
13531         way to tell in abstract indexers/properties if one of them was
13532         specified.
13533
13534         Now there is a way of addressing that.
13535
13536         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
13537         instead of FindMembers.
13538
13539         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
13540         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
13541
13542         * attribute.cs: Treat indexers and properties as the same in terms
13543         of applying attributes
13544
13545         * ecore.cs (FindMostEncompassedType): Use statically initialized
13546         EmptyExpressions()s like we do elsewhere to avoid creating useless
13547         objects (and we take this out of the tight loop).
13548
13549         (GetConversionOperators): Move the code to extract the actual
13550         operators to a separate routine to clean things up.
13551
13552 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
13553
13554         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
13555         events are always registered FieldBuilders.
13556
13557         * class.cs (FieldBase): New class shared by Fields 
13558
13559         * delegate.cs: If we are a toplevel delegate, use our full name.
13560         If we are a nested delegate, then only use our tail name.
13561
13562 2002-05-02  Ravi Pratap  <ravi@ximian.com>
13563
13564         * expression.cs (IsApplicable): Ensure that we add the "&" to
13565         ref/out types before comparing it with the type of the argument.
13566
13567         (IsParamsMethodApplicable): Ditto.
13568
13569         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
13570         silly me ;-)
13571
13572         * delegate.cs : Handle the case when we have more than one applicable
13573         method. Flag an error only when we finish checking all.
13574
13575 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
13576
13577         * expression.cs: Add support for boolean static initializers.
13578
13579 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
13580
13581         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
13582
13583         * parameter.cs (ComputeParameterTypes,
13584         ComputeAndDefineParameterTypes): Better error handling: now we
13585         clear the `types' cache if we fail during any of the type lookups.
13586         We also return the status code correctly to our caller
13587
13588         * delegate.cs: If we fail to define a delegate, abort the extra
13589         steps. 
13590
13591         * expression.cs (Binary.ResolveOperator): for
13592         operator==(object,object) and operator !=(object, object) we also
13593         have to verify that there is an implicit conversion from one to
13594         the other.
13595
13596         (ArrayAccess.DoResolve): Array Access can operate on
13597         non-variables. 
13598
13599 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
13600
13601         * assign.cs (CompoundAssign): A new class used as a "flag" that
13602         the assignment actually is happening as part of a compound
13603         assignment operator.
13604
13605         During compound assignment, a few new rules exist to enable things
13606         like:
13607
13608         byte b |= 1 + 2
13609
13610         From the spec:
13611
13612         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
13613         to the type of x) if y is implicitly convertible to the type of x,
13614         and the operator is a builtin operator and the return type of the
13615         operator is explicitly convertible to the type of x. 
13616
13617         * rootcontext.cs: Reset warning level to 2.  4 catches various
13618         "interesting" features in mcs, we must clean this up at some
13619         point, but currently am trying to kill other bugs ;-)
13620
13621         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
13622         in container classes as well.  
13623
13624         * expression.cs (Binary.ResolveOperator): Handle string case
13625         before anything else (as operator overloading does emit an error
13626         before doing anything else).
13627
13628         This code could go away when we move to a table driven model, but
13629         i could not come up with a good plan last night.
13630
13631 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
13632
13633         * typemanager.cs (CSharpName): reimplementation using regex.
13634         * class.cs: added null check for fields in Emit
13635         * rootcontext.cs: set warninglevel to 4
13636
13637 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
13638
13639         * typemanager.cs (CSharpName): reimplemented with Lupus
13640         suggestion.
13641
13642 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
13643
13644         * statement.cs (If): correclty implement Resolve, because we were
13645         not catching sem errors in there.  The same process is needed
13646         everywhere else. 
13647         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
13648
13649
13650         (Statement.Warning_DeadCodeFound): Factorize code.
13651         (While): Report dead code here too.
13652
13653         (Statement): Added Resolve virtual method to allow
13654         for resolution split from the emit code.
13655
13656 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13657
13658         * statement.cs (EmitBoolExpression): No longer try to resolve the
13659         expression here.    
13660         (MakeBoolean): New utility function that resolve, implicitly
13661         converts to boolean and tags the expression. 
13662
13663
13664         (If, Do): Implement dead code elimination.
13665         (While): Implement loop inversion
13666
13667         (Do, While, For, If): Resolve the expression prior to calling our
13668         code generation.
13669
13670 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
13671
13672         * class.cs:
13673           - added method Report28 (warning: program has more than one entry point)
13674           - added method IsEntryPoint, implements paragraph 10.1 of the spec
13675           - modified method Method.Define, the part at the end of the method
13676
13677         * rootcontext.cs: added static public Location EntryPointLocation;
13678           
13679         * ../errors/cs0028.cs : Add test case for the above warning.              
13680
13681         * typemanager.cs:
13682           - modified method CSharpName to allow arrays of primitive type to
13683             be printed nicely (e.g. instead of System.Int32[][] it now prints
13684             int[][])
13685           - added method CSharpSignature: returns the signature of a method
13686             in string format to be used in reporting errors, warnings, etc.
13687
13688         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
13689         with String.Empty.
13690
13691 2002-04-26  Ravi Pratap  <ravi@ximian.com>
13692
13693         * delegate.cs (Define): Fix extremely silly bug where I was
13694         setting the type of the 'object' parameter of the BeginInvoke
13695         method to System.IAsyncResult instead of System.Object ;-)
13696
13697 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13698
13699         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
13700         here. 
13701
13702         (Constructor.Emit): return if we fail to initialize the
13703         constructor.  Another door closed!  
13704
13705         * expression.cs (New.DoResolve): Improve error message (from -6 to
13706         1501).  Use DeclaredOnly lookup to find the exact constructor.
13707
13708         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
13709         loop.  This is useful.
13710
13711         * cs-parser.jay: Adjust the default parameters so that destructors
13712         have the proper signature.
13713
13714 2002-04-26  Martin Baulig  <martin@gnome.org>
13715
13716         * driver.cs (LoadAssembly): If `assembly' contains any characters
13717         which are only valid in path names and not in assembly names
13718         (currently slash, backslash and point), use Assembly.LoadFrom ()
13719         instead of Assembly.Load () on the `assembly' (before iteration
13720         over the link_paths).
13721
13722 2002-04-26  Martin Baulig  <martin@gnome.org>
13723
13724         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
13725
13726 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
13727
13728         * class.cs (Property): use the new typemanager.MemberLookup
13729
13730         (TypeContainer.MemberLookup): Implement using the
13731         TypeManager.MemberLookup now. 
13732
13733         * typemanager.cs: Make MemberLookup a function of the TypeManager,
13734         and return MemberInfos, so that these can be used without an
13735         EmitContext (what we had before).
13736
13737 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
13738
13739         * expression.cs: Fix the case where the argument to params if the
13740         type of the params.  I omitted handling this before.   Fixed
13741
13742 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13743
13744         * driver.cs: Call BootCorlib_PopulateCoreType
13745
13746         * class.cs (Property.CheckBase): Check for properties only, not
13747         for all members. 
13748
13749         * interface.cs: Temporary hack: try/catch around the
13750         CustomAttributeBuilder, because I am getting an exception that I
13751         do not understand.
13752
13753         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
13754         types whose definitions are required to be there (attributes are
13755         defined before standard types).
13756
13757         Compute definitions as we boot the various types, as they are used
13758         immediately (value_type class will need object_type, but if we do
13759         not initialize object_type, we will pass a null, which will let
13760         the runtime pick the System.Object from the existing corlib, which
13761         is not what we want).
13762
13763 2002-04-22  Patrik Torstensson <totte@labs2.com>
13764
13765         * cs-tokenizer.cs: fixed a number of trim() issues.
13766
13767 2002-04-22  Ravi Pratap  <ravi@ximian.com>
13768
13769         * expression.cs (Argument.Type): Ensure that we return the correct
13770         type when we have out or ref parameters [in which case we 
13771         append a "&"].
13772
13773 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13774
13775         * class.cs (Property, Indexer): Allow extern modifier in there. 
13776
13777         * typemanager.cs (InitBaseTypes): Initializes object_type and
13778         value_type, since those will be used early on during the bootstrap
13779         process to compile corlib.
13780
13781         (InitCoreTypes): Move code from here to InitBaseTypes.
13782
13783 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
13784
13785         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
13786         single-dimension arrays as using the ldlen opcode.  
13787
13788         Daniel Lewis discovered this optimization.  
13789
13790         * typemanager.cs: Add signature for System.Array::get_Length
13791
13792 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13793
13794         * statement.cs: report the error when the foreach does not apply to an
13795         array nor a collection.
13796
13797 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
13798
13799         * expression.cs: Add implicit conversions to the operator ~.
13800
13801         * constant.cs (DecimalConstant.Emit): Emit decimal value.
13802
13803         * typemanager.cs: Locate the decimal constructor.
13804
13805 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13806
13807         * attribute.cs: use the new property of TypeOf.
13808         * expression.cs: added 'get' property around typearg.
13809
13810         These changes fix a build breaker reported by NickD. Is this the
13811         correct way to fix?  If not, please, revert my changes and make it
13812         work :-).
13813
13814 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
13815
13816         * attribute.cs: Add support for typeof in attribute invocations.
13817         I am not sure that this is right though.
13818
13819 2002-04-14  Duncan Mak  <duncan@ximian.com>
13820
13821         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
13822         Binary.Operator.Division case.
13823
13824 2002-04-13  Ravi Pratap  <ravi@ximian.com>
13825
13826         * class.cs (DefineType): Ensure that we do a proper check on
13827         attribute types and also register it with the TypeManager.
13828
13829         (TypeContainer.Targets): The default for attribute types is
13830         AttributeTargets.All.
13831
13832         * attribute.cs (ApplyAttributes): Registering the attribute type
13833         is done elsewhere, not when we discover we have a Usage attribute.
13834
13835 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13836
13837         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
13838         and get rid of is_delegate parameter.
13839
13840         * everywhere : update.
13841
13842 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13843
13844         * cs-parser.jay (compilation_unit): Revamp completely to use
13845         some new ideas that I got from Rhys' grammar to solve the problems
13846         with assembly level attributes.
13847
13848         (outer_declaration): New grammar production.
13849
13850         (attribute_sections): Add.
13851
13852         (opt_attributes): Base on attribute_sections
13853
13854         (namespace_declaration): Allow opt_attributes to tackle the case
13855         when we have assembly level attributes - we are clever in this
13856         regard now ;-)
13857
13858         * attribute.cs (ApplyAttributes): Do not worry about assembly 
13859         attributes in the non-global context.
13860
13861         * rootcontext.cs (AddGlobalAttributes): Go back to using this
13862         instead of SetGlobalAttributes.
13863
13864         * class.cs, rootcontext.cs : Ensure we define and generate 
13865         attribute types before anything else.
13866
13867         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
13868         and flag the new error -20 for the case when the attribute type
13869         does not have valid targets specified. csc does not catch this.
13870
13871         * ../errors/errors.txt : update for error # -20
13872
13873 2002-04-11  Ravi Pratap  <ravi@ximian.com>
13874
13875         * support.cs (InternalParameters.ParameterModifier): Do some null
13876         checking and return sane values.
13877
13878         * class.cs (Method.Define): If we are a PInvoke method, ensure
13879         that we are static and extern. Report error # 601
13880
13881         * ../errors/cs0601.cs : Add test case for the above error.
13882
13883 2002-04-07  Ravi Pratap  <ravi@ximian.com>
13884
13885         * rootcontext.cs (attribute_types): We need to keep type of
13886         all attribute types separately and emit code for them first.
13887
13888         (RegisterAttribute) : Implement.
13889
13890         * class.cs (DefineType): Check if the current Type is a custom
13891         attribute type and register it accordingly.
13892
13893         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
13894         adding the first attribute twice and rename to
13895
13896         (SetGlobalAttributes): this.
13897
13898         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
13899         lookups.
13900
13901         * attribute.cs (ApplyAttributes): Take an additional argument telling us
13902         if we are processing global arguments. Hmm, I am unsure of this.
13903
13904 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13905
13906         * expression.cs: added static array of strings to avoid calling
13907         Enum.ToString () for Operator in Binary. Significant recover of
13908         performance.
13909
13910 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
13911
13912         * class.cs (FindMembers): Allow the Builders of the various
13913         members to be null.  If they are skip them.  This only happens
13914         during the PInvoke declaration.
13915
13916 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
13917
13918         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
13919         failure, so we do not keep going afterwards.
13920
13921         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
13922         wanted to pass `false' as the `is_delegate' argument.  If this is
13923         the case, why not use delegate_type == null to mean `is_delegate =
13924         false' and anything else as is_delegate = true.
13925
13926 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
13927
13928         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
13929         code for the section, not the beginning of the tests.
13930
13931 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
13932
13933         * cfold.cs: Handle operator + (Enum x, Underlying x) 
13934
13935         * expression.cs (Binary): same.  Warn about errors where we have
13936         Enum/Enum in operator + as well.
13937
13938 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
13939
13940         * statement.cs:
13941                 - added support for switch(bool)
13942                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
13943                 - add TableSwitchEmit() to handle table-based switch statements
13944
13945 2002-04-05  Ravi Pratap  <ravi@ximian.com>
13946
13947         * expression.cs (Invocation.OverloadResolve): Factor out code which
13948         does parameter compatibility checking with arguments so that we can 
13949         re-use the code even from Delegate.VerifyApplicability
13950
13951         (VerifyArgumentsCompat): Move above code here.
13952
13953         * delegate.cs (VerifyApplicability): Get rid of duplicate code
13954         and instead make a call to the above method.
13955
13956 2002-03-31  Ravi Pratap  <ravi@ximian.com>
13957
13958         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
13959         We use it to keep track of classes which are attribute types.
13960
13961 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
13962
13963         * delegate.cs (Delegate.Define): Correctly define the types in the
13964         presence of fixed and array parameters.
13965
13966         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
13967         doing FindMembers.
13968
13969         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
13970         include NonPublic after the first iteration.
13971
13972         * class.cs (Indexer.CheckBase): Only check if both parents are
13973         non-null. 
13974
13975         * cs-parser.jay (accessor_body): If empty, set to null.
13976
13977         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
13978         same code path here to resolve constants names that we did have in
13979         MemberAccess.DoResolve.  There is too much code duplicated here.
13980
13981 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
13982
13983         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
13984
13985         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
13986         to MakeUnionSet.
13987
13988         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
13989         tokens, numbers and strings.
13990
13991         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
13992         parenthesis.
13993
13994         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
13995         asyncronous parameters and the regular parameters.  
13996
13997         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
13998         specify the target directory.
13999
14000         * expression.cs: (This.DoResolve): Simplify
14001         (As.Emit): Optimize, do not generate IsInst if the expression is
14002         always of the given type.
14003
14004         (Is.DoResolve): Bug fix, we were reporting both always/never for
14005         the is expression.
14006
14007         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
14008         creating too many unnecessary arrays.
14009
14010 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
14011
14012         * class.cs (EmitFieldInitializer): Use Assign expression to assign
14013         fields instead of rolling our own initializer.   Takes care of all
14014         implicit conversions, and drops unnecessary static checks/argument.
14015
14016 2002-03-31  Dick Porter  <dick@ximian.com>
14017
14018         * driver.cs: use the GetDirectories() return values properly, and
14019         use "/" as path separator.
14020
14021 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
14022
14023         * expression.cs (Unary): Optimize - - expr into expr.
14024         (Binary): Optimize a + (-b) into a -b.
14025
14026         * codegen.cs (CodeGen): Made all methods static.
14027
14028 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
14029
14030         * rootcontext.cs: 
14031
14032         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
14033         TypeBuilder property.
14034
14035         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
14036         instead. 
14037
14038         * tree.cs: Removed the various RecordXXXX, and replaced with a
14039         single RecordDecl.  Removed all the accessor methods, and just
14040         left a single access point Type 
14041
14042         * enum.cs: Rename DefineEnum to DefineType.
14043
14044         * decl.cs: New abstract method `DefineType' used to unify the
14045         Defines for Enumerations, Interfaces, TypeContainers and
14046         Delegates.
14047
14048         (FindType): Moved LookupInterfaceOrClass here.  Moved the
14049         LookupBaseClasses method that used to live in class.cs and
14050         interface.cs here, and renamed to FindType.
14051
14052         * delegate.cs: Implement DefineType.  Take advantage of the
14053         refactored pattern for locating the parent builder without taking
14054         the parent_builder argument (which we know does not work if we are
14055         nested, and triggering a toplevel definition).
14056
14057 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14058
14059         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
14060         accessibility of a member has changed during override and report
14061         an error if so.
14062
14063         * class.cs (Method.Define, Property.Define): Only complain on
14064         overrides if the method is private, any other accessibility is
14065         fine (and since we just checked the permission is the same, we are
14066         good to go).
14067
14068         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
14069         and elif are processed always.  The other pre-processing
14070         directives are only processed if we are "taking" the path
14071
14072 2002-03-29  Martin Baulig  <martin@gnome.org>
14073
14074         * class.cs (Method.Emit): Only emit symbolic debugging info if the
14075         current location is not Null.
14076
14077         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
14078         a separate method so we can profile it.
14079
14080         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
14081         `span.Seconds' are just seconds, but no minutes or hours.
14082         (MainDriver): Profile the CodeGen.SaveSymbols calls.
14083
14084 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14085
14086         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
14087         Remove the gratuitous set of Final:
14088
14089                                 // If an interface implementation, then we can set Final.
14090                                 if (((flags & MethodAttributes.Abstract) == 0) &&
14091                                     implementing.DeclaringType.IsInterface)
14092                                         flags |= MethodAttributes.Final;
14093
14094         I do not know what I was smoking when I used that.
14095
14096
14097         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
14098         step into fixing the name resolution issues for delegates and
14099         unifying the toplevel name resolution.
14100
14101 2002-03-28  Martin Baulig  <martin@gnome.org>
14102
14103         * class.cs (Method.Emit): If we have a symbol writer, call its
14104         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
14105         tell it about the current method.
14106
14107         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
14108         writer that we're going to emit the first byte of IL code for a new
14109         statement (a new source line).
14110         (EmitContext.EmitTopBlock): If we have a symbol writer, call
14111         EmitContext.Mark() before emitting any code.
14112
14113         * location.cs (SymbolDocument): Return null when we're Null.
14114
14115         * statement.cs (Statement): Moved the `Location loc' variable here.
14116         (Statement.EmitBoolExpression): If we have a symbol writer, call
14117         ec.Mark() before emitting any code to tell it that we're at the
14118         beginning of a new statement.
14119         (StatementExpression): Added `Location' argument to the constructor.
14120         (Block): Added public readonly variable `StartLocation' and public
14121         variable `EndLocation'.  The latter is to be set using SetEndLocation().
14122         (Block): Added constructor which takes a start and end location.
14123         (Block.SetEndLocation): New method. This sets the end location.
14124         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
14125         local variables we create.
14126         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
14127         each statement and do also mark the begin and end of the block.
14128
14129         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
14130         tell it the current lexer.Location, use Location.Null for the end of the
14131         block.
14132         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
14133         current block, set its end location using SetEndLocation().
14134         (statement_expression): StatementExpression constructor now takes the
14135         lexer.Location as additional argument.
14136         (for_statement, declare_local_variables): Likewise.
14137         (declare_local_variables): When creating a new implicit block, use the
14138         new Block constructor and pass it the lexer.Location.
14139
14140 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14141
14142         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
14143         members also on the parent interfaces recursively.
14144
14145 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
14146
14147         * report.cs: Use new formats, since Gonzalo finished the missing
14148         bits. 
14149
14150         * expression.cs (Binary.ResolveOperator): added missing operator|
14151         operator& and operator^ for bool/bool.
14152
14153         * cs-parser.jay: CheckDef now takes a Location argument that is
14154         used to report errors more precisly (instead of reporting the end
14155         of a definition, we try to track something which is a lot closer
14156         to the source of the problem).
14157
14158         * cs-tokenizer.cs: Track global token use, so we can properly flag
14159         the use of #define/#undef after the first token has been seen.
14160
14161         Also, rename the reportXXXX to Error_DescriptiveName
14162
14163         * decl.cs (DeclSpace.IsTopLevel): Move property here from
14164         TypeContainer, so that Enum and Interface can use this too.
14165
14166         * class.cs (TypeContainer.LookupInterfaceOrClass,
14167         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
14168         `builder' argument.  Typically this was used to pass the parent
14169         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
14170         the definition).  
14171
14172         The problem is that a nested class could trigger the definition of
14173         a toplevel class, and the builder would be obviously wrong in that
14174         case. 
14175
14176         So we drop this argument, and we compute dynamically the
14177         TypeBuilder/ModuleBuilder (the correct information was available
14178         to us anyways from DeclSpace.Parent)
14179
14180         * interface.cs (Interface.DefineInterface): Drop builder
14181         parameter cleanup like class.cs
14182
14183         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
14184         like class.cs
14185
14186         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
14187         values. 
14188
14189         (Try.Emit): Propagate the returns value from the statement.
14190
14191         (Return.Emit): Even if we are leavning 
14192
14193         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
14194
14195         * modifiers.cs: Fix the computation of MethodAttributes flags.
14196
14197 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
14198
14199         * driver.cs: allow compilation of files that start with '/'.
14200         Add a default case when checking the argument of --target.
14201
14202 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
14203
14204         * interface.cs: Implement the same search algorithm for types in
14205         the interface code.
14206
14207         * delegate.cs: Do not allow multiple definition.
14208
14209         * Recovered ChangeLog that got accidentally amputated
14210
14211         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
14212
14213         * rootcontext.cs: Load manually enum to allow core classes to
14214         contain enumerations.
14215
14216         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
14217         Update to new static methods in TypeManager.
14218
14219         * typemanager.cs (GetMethod, GetConstructor): Use our
14220         implementation of FindMembers to find the members, since during
14221         corlib compilation, the types are TypeBuilders and GetMethod and
14222         GetConstructor do not work.
14223
14224         Make all methods in TypeManager static.
14225
14226         (InitCodeHelpers): Split the functionality from
14227         the InitCodeTypes function.
14228
14229         * driver.cs: Call InitCodeHelpers after we have populated the
14230         types. 
14231
14232         * cs-parser.jay (delegate_declaration): we did not used to compute
14233         the delegate name correctly for void delegates.
14234
14235 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
14236
14237         * rootcontext.cs (RootContext): Init the interface_resolve_order
14238         and type_container_resolve_order always.
14239
14240         (ResolveCore, BootstrapCorlib_ResolveClass,
14241         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
14242         compiler when compiling with --nostdlib
14243
14244         * class.cs (TypeContainer.DefineType): Check that our parent is
14245         not null.  This test is most important when we are bootstraping
14246         the core types.
14247
14248         * codegen.cs: Split out the symbol writing code.
14249
14250 2002-03-25  Martin Baulig  <martin@gnome.org>
14251
14252         * driver.cs (-g): Made -g an alias for --debug.
14253
14254 2002-03-24  Martin Baulig  <martin@gnome.org>
14255
14256         * codegen.cs (SymbolWriter): New public variable. Returns the
14257         current symbol writer.
14258         (CodeGen): Added `bool want_debugging_support' argument to the
14259          constructor. If true, tell the ModuleBuild that we want debugging
14260         support and ask it for the ISymbolWriter.
14261         (Save): If we have a symbol writer, call it's Close() method after
14262         saving the assembly.
14263
14264         * driver.c (--debug): New command line argument to create a
14265         debugger information file.
14266
14267         * location.cs (SymbolDocument): New public property. Returns an
14268         ISymbolDocumentWriter object for the current source file or null
14269         if we don't have a symbol writer.
14270
14271 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
14272
14273         * driver.cs (LoadAssembly): Correctly return when all the paths
14274         have been tried and not before.
14275
14276         * statement.cs (Switch.Emit): return the actual coverage for this
14277         statement (returns/not-returns)
14278
14279         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
14280         switch of the statement if we are the last switch section.  That
14281         kills two problems: try/catch problems (we used to emit an empty
14282         nop at the end) and switch statements where all branches would
14283         return. 
14284
14285 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
14286
14287         * driver.cs: Add default assemblies (the equivalent to the
14288         Microsoft CSC.RSP file)
14289
14290         * cs-tokenizer.cs: When updating `cols and setting it to zero,
14291         also update tokens_seen and set it to false.
14292
14293         * driver.cs: Implement --recurse for Mike.
14294
14295         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
14296         correctly splitting out the paths.
14297
14298 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
14299
14300         * interface.cs (Interface.PopulateProperty): Instead of using
14301         `parent' as the declaration space for the set parameters, use
14302         `this' 
14303
14304         * support.cs (InternalParameters): InternalParameters constructor
14305         takes a DeclSpace instead of a TypeContainer.
14306
14307         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
14308         types are being initialized, load the address of it before calling
14309         the function.  
14310
14311         (New): Provide a mechanism to disable the generation of local
14312         value type temporaries when the caller will be providing us with
14313         an address to store it.
14314
14315         (ArrayCreation.EmitDynamicInitializers): Use it.
14316
14317 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
14318
14319         * expression.cs (Invocation.EmitArguments): Only probe for array
14320         property if there is more than one argument.  Sorry about that.
14321
14322         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
14323         empty param arrays.
14324
14325         * class.cs (Method.LabelParameters): Fix incorrect code path that
14326         prevented the `ParamArrayAttribute' from being applied to the
14327         params attribute.
14328
14329 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
14330
14331         * support.cs (ReflectionParameters): Correctly compute whether the
14332         last argument is a params array.  Fixes the problem with
14333         string.Split ('a')
14334
14335         * typemanager.cs: Make the assemblies array always be non-null
14336         (empty, but non-null)
14337
14338         * tree.cs (RecordDecl): New function that abstracts the recording
14339         of names.  This reports error 101, and provides a pointer to the
14340         previous declaration.  Fixes a crash in the compiler.
14341
14342         * cs-parser.jay (constructor_declaration): Update to new grammar,
14343         and provide a constructor_body that can be empty.
14344
14345 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
14346
14347         * driver.cs: Add support for --resources.
14348
14349         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
14350         Make all types for the various array helper methods be integer.
14351
14352         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
14353         CheckState to ConvCast.
14354
14355         (ConvCast): Now it takes a `checked' state argument, to avoid
14356         depending on the emit context for the conversion, and just using
14357         the resolve time setting.
14358
14359         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
14360         instead of Invocation.EmitArguments.  We do not emit the original
14361         arguments, instead we emit those which have been converted to
14362         unsigned int expressions.
14363
14364         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
14365
14366         * codegen.cs: ditto.
14367
14368         * expression.cs (LocalVariableReference): Drop the use of the
14369         Store function that depended on the variable index.
14370
14371         * statement.cs (VariableInfo): Drop the `Idx' property from this
14372         class, as this is not taking into account the indexes for
14373         temporaries tat we generate during the execution, getting the
14374         indexes wrong.
14375
14376         * class.cs: First emit class initializers, then call the parent
14377         constructor. 
14378
14379         * expression.cs (Binary): Fix opcode emision.
14380         (UnaryMutator.EmitCode): Support checked code generation
14381
14382         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
14383         matches for events for both the Static and Instance scans,
14384         pointing to the same element.   Fix that.
14385
14386 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
14387
14388         * rootcontext.cs (ResolveTree): Always set the
14389         interface_resolve_order, because nested interfaces will be calling
14390         into us.
14391
14392         * class.cs (GetInterfaceOrClass): Track the same resolution
14393         process used by TypeManager.LookupType.  This fixes the nested
14394         type lookups in class declarations (separate path from
14395         LookupType). 
14396
14397         (TypeContainer.DefineType): Also define nested interfaces.
14398         (TypeContainer.RegisterOrder): New public function used to
14399         register the order in which child interfaces need to be closed.
14400
14401         Nested interfaces need to be closed after their parents have been
14402         created. 
14403
14404         * interface.cs (InterfaceAttr): Put all the logic for computing
14405         the interface attribute here. 
14406
14407         (DefineInterface): Register our interface order with the
14408         RootContext or with the TypeContainer depending on the case.
14409
14410 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14411
14412         * cs-parser.jay: rework foreach statement to work with the new
14413         changes to the policy on SimpleNames.
14414
14415         * report.cs: support Stacktrace on warnings as well.
14416
14417         * makefile: drop --unsafe and /unsafe from the compile.
14418
14419 2002-03-13  Ravi Pratap  <ravi@ximian.com>
14420
14421         * ecore.cs (StandardConversionExists): Modify to take an Expression
14422         as the first parameter. Ensure we do null -> reference type conversion
14423         checking.
14424
14425         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
14426         temporary Expression objects.
14427
14428 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
14429
14430         * interface.cs: workaround bug in method overloading resolution
14431         (there is already a bugzilla bug for it).
14432
14433 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14434
14435         We could also solve this problem by having a separate path for
14436         performing type lookups, instead of DoResolve, we could have a
14437         ResolveType entry point, and only participating pieces of the
14438         production (simplename, deref, array) would implement this. 
14439
14440         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
14441         signal SimpleName to only resolve type names and not attempt to
14442         resolve anything else.
14443
14444         * expression.cs (Cast): Set the flag.
14445
14446         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
14447
14448         * class.cs: Only report 108 if there is no `new' modifier.
14449
14450         * cs-parser.jay: rework foreach statement to work with the new
14451         changes to the policy on SimpleNames.
14452         
14453         * report.cs: support Stacktrace on warnings as well.
14454
14455         * makefile: drop --unsafe and /unsafe from the compile.
14456
14457 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
14458
14459         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14460         lookups here, instead of doing that at parse time.  This means
14461         that our grammar will not introduce `LocalVariableReferences' as
14462         expressions at this point.  That solves the problem of code like
14463         this:
14464
14465         class X {
14466            static void Main ()
14467            { int X = 1;
14468             { X x = null }}}
14469
14470         This is only half the fix.  The full fix requires parameters to
14471         also be handled in this way.
14472
14473         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
14474         makes the use more obvious of the DeclSpace.  The
14475         ec.TypeContainer.TypeBuilder is now only used to pull the
14476         TypeBuilder for it.
14477
14478         My theory is that I can get rid of the TypeBuilder completely from
14479         the EmitContext, and have typecasts where it is used (from
14480         DeclSpace to where it matters).  
14481
14482         The only pending problem is that the code that implements Aliases
14483         is on TypeContainer, and probably should go in DeclSpace.
14484
14485         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14486         lookups here, instead of doing that at parse time.  This means
14487         that our grammar will not introduce `LocalVariableReferences' as
14488         expressions at this point.  That solves the problem of code like
14489         this:
14490
14491         class X {
14492            static void Main ()
14493            { int X = 1;
14494             { X x = null }}}
14495
14496         This is only half the fix.  The full fix requires parameters to
14497         also be handled in this way.
14498
14499         * class.cs (Property.DefineMethod): When implementing an interface
14500         method, set newslot, when implementing an abstract method, do not
14501         set the flag (before we tried never setting it, or always setting
14502         it, which is the difference).
14503         (Indexer.DefineMethod): same.
14504         (Method.DefineMethod): same.
14505
14506         * ecore.cs: Only set the status used flag if we get back a Field.
14507
14508         * attribute.cs: Temporary hack, so Paolo can keep working.
14509
14510 2002-03-08  Ravi Pratap  <ravi@ximian.com>
14511
14512         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
14513         the unmanaged type in the case we have a MarshalAs attribute.
14514
14515         (Resolve): Handle the case when we are parsing the special MarshalAs
14516         attribute [we need to store the unmanaged type to use later]
14517
14518         * typemanager.cs (marshal_as_attr_type): Built in type for the 
14519         MarshalAs Attribute.
14520
14521         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
14522         on parameters and accordingly set the marshalling info.
14523
14524 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
14525
14526         * class.cs: Optimizing slightly by removing redundant code after
14527         we switched to the `NoTypes' return value.
14528         (Property.DefineMethod): use NoTypes here too.
14529
14530         This fixes the bug I introduced in my last batch of changes.
14531
14532 2002-03-05  Ravi Pratap  <ravi@ximian.com>
14533
14534         * tree.cs (RecordEnum): Add. We now keep track of enums too.
14535
14536         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
14537         Enums since those are types too. 
14538
14539         * cs-parser.jay (enum_declaration): Record enums as we parse them.
14540
14541         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
14542         thanks to a call during the lookup process.
14543
14544 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
14545
14546         * statement.cs (Foreach): Lots of work to accomodate a particular
14547         kind of foreach statement that I had not kept in mind.  It is
14548         possible to have foreachs on classes that provide a GetEnumerator
14549         method that return objects that implement the "pattern" for using
14550         a foreach, there is no need to support GetEnumerator
14551         specifically. 
14552
14553         This is needed to compile nant.
14554
14555         * decl.cs: Only report 114 if the member is not `Finalize' and if
14556         the warning level is at least 2.
14557
14558         * class.cs: Moved the compare function from Method to
14559         MethodSignature. 
14560
14561         (MethodSignature.InheritableMemberSignatureCompare): Add new
14562         filter function that is used to extract inheritable methods from a
14563         class. 
14564
14565         (Method.Define): Use the new `inheritable_method_signature_filter'
14566         delegate
14567
14568         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
14569         command. 
14570
14571 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
14572
14573         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
14574
14575         * cs-parser.jay: Add opt_semicolon to the interface declaration.
14576
14577         * expression.cs: Pass location information to
14578         ConvertImplicitStandard. 
14579
14580         * class.cs: Added debugging code to track return values from
14581         interfaces. 
14582
14583 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
14584
14585         * expression.cs (Is.DoResolve): If either side of the `is' is an
14586         interface, do not flag the warning.
14587
14588         * ecore.cs (ImplicitReferenceConversion): We need a separate test
14589         for interfaces
14590
14591         * report.cs: Allow for --fatal to be used with --probe.
14592
14593         * typemanager.cs (NoTypes): Move the definition for the empty Type
14594         array here. 
14595
14596         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
14597         properties. 
14598         (TypeContainer.DefineProxy): New function used to proxy to parent
14599         implementations when implementing interfaces.
14600         (TypeContainer.ParentImplements): used to lookup if our parent
14601         implements a public function that is required by an interface.
14602         (TypeContainer.VerifyPendingMethods): Hook this up.
14603
14604         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
14605         `modules' and `assemblies' arraylists into arrays.  We only grow
14606         these are the very early start up of the program, so this improves
14607         the speedof LookupType (nicely measured).
14608
14609         * expression.cs (MakeByteBlob): Replaced unsafe code with
14610         BitConverter, as suggested by Paolo.
14611
14612         * cfold.cs (ConstantFold.Binary): Special case: perform constant
14613         folding of string concatenation, but if either side is a string,
14614         and the other is not, then return null, and let the runtime use
14615         the concatenation on the string plus the object (using
14616         `Object.ToString'). 
14617
14618 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
14619
14620         Constant Folding has been implemented now.
14621
14622         * expression.cs (Unary.Reduce): Do not throw an exception, catch
14623         the error instead on types that are not supported in one's
14624         complement. 
14625
14626         * constant.cs (Constant and all children): New set of functions to
14627         perform implict and explicit conversions.
14628
14629         * ecore.cs (EnumConstant): Implement the new functions to perform
14630         conversion by proxying to the child expression.
14631
14632         * codegen.cs: (ConstantCheckState): Constant evaluation has its
14633         own separate setting that can not be turned off from the command
14634         line using --unchecked or --checked and is only controlled using
14635         the checked/unchecked statements and expressions.  This setting is
14636         used by the constant folder to flag errors.
14637
14638         * expression.cs (CheckedExpr, UncheckedExpr): Set the
14639         ConstantCheckState as well.   
14640
14641         During Resolve, they also have to flag the state, because the
14642         constant folder runs completely in the Resolve phase.
14643
14644         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
14645         well.
14646
14647 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14648
14649         * cfold.cs: New file, this file contains the constant folder.
14650
14651         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
14652         argument to track whether we are using the resulting address to
14653         load or store a value and provide better error messages. 
14654
14655         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
14656         new AddressOf arguments.
14657
14658         * statement.cs (Foreach.EmitCollectionForeach): Update
14659
14660         * expression.cs (Argument.Emit): Call AddressOf with proper
14661         arguments to track usage.
14662
14663         (New.DoEmit): Call AddressOf with new arguments.
14664
14665         (Unary.Emit): Adjust AddressOf call.
14666
14667 2002-03-01  Ravi Pratap  <ravi@ximian.com>
14668
14669         * cs-parser.jay (member_access): Change the case for pre-defined types
14670         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
14671         this suggestion.
14672
14673         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
14674         a method body.
14675
14676         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
14677         essentially like methods and apply attributes like MethodImplOptions to them too.
14678
14679         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
14680         not being null.
14681
14682         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
14683         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
14684         is the DeclSpace.
14685
14686         * Update code everywhere accordingly.
14687
14688         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
14689
14690         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
14691
14692 2002-02-28  Ravi Pratap  <ravi@ximian.com>
14693
14694         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
14695         try performing lookups against those instead of jumping straight into using
14696         the 'using' clauses.
14697
14698         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
14699
14700         (LookupType): Perform lookups in implicit parents too.
14701
14702         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
14703         sequence as RootContext.LookupType. 
14704
14705         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
14706         the various cases of namespace lookups into this method.
14707
14708 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14709
14710         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
14711         in positional arguments)
14712
14713         * class.cs (Operator): Update the AllowedModifiers to contain
14714         extern. 
14715
14716         * cs-parser.jay: Update operator declaration to allow for the
14717         operator body to be empty.
14718
14719         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
14720         values. 
14721
14722 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
14723
14724         * class.cs (Method.Emit): Label parameters.
14725
14726         * driver.cs: Return 1 or 0 as the program exit code.
14727
14728 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
14729
14730         * expression.cs: Special case the `null' object when trying to
14731         auto-compute the type, as anything can be explicitly converted to
14732         that. 
14733
14734         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
14735         spotting this Paolo.
14736
14737         (Expression.ImplicitNumericConversion): Perform comparissions of
14738         the type using the underlying type in the case of an enumeration
14739         rather than using the enumeration type for the compare.
14740
14741         Cope with the underlying == type case, which is not possible to
14742         catch before. 
14743
14744         (Expression.ConvertNumericExplicit): Perform comparissions of
14745         the type using the underlying type in the case of an enumeration
14746         rather than using the enumeration type for the compare.
14747
14748         * driver.cs: If the user does not supply an extension, assume .exe
14749
14750         * cs-parser.jay (if_statement): Rewrote so that we can track the
14751         location for the if statement.
14752
14753         * expression.cs (Binary.ConstantFold): Only concat strings when
14754         the operation is "+", not everything ;-)
14755
14756         * statement.cs (Statement.EmitBoolExpression): Take a location
14757         argument. 
14758         (If, While, Do): Track location.
14759
14760         * expression.cs (Binary.ResolveOperator): In the object + string
14761         case, I was missing a call to ConvertImplicit
14762
14763 2002-02-25  Ravi Pratap  <ravi@ximian.com>
14764
14765         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
14766         Location arguments. Ensure we use RootContext.LookupType to do our work
14767         and not try to do a direct Type.GetType and ModuleBuilder.GetType
14768
14769         * interface.cs (PopulateMethod): Handle the type of the parameter being
14770         null gracefully.
14771
14772         * expression.cs (Invocation.BetterFunction): Handle the case when we 
14773         have a params method with no fixed arguments and a call is made with no
14774         arguments.
14775
14776 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
14777
14778         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
14779         the verbatim-string-literal
14780
14781         * support.cs (InternalParameters.ParameterModifier): handle null
14782         fixed parameters.
14783         (InternalParameters.ParameterType): ditto.
14784
14785         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
14786         duplicating the name of the variable parameter.
14787         (GetParameterByName): Fix bug where we were not looking up array
14788         paramters if they were the only present (thanks Paolo!).
14789         (GetParameterInfo): We only have an empty set of types if both
14790         fixed and array are set to null.
14791         (GetParameterInfo-idx): Handle FixedParameter == null
14792
14793         * cs-parser.jay: Handle the case where there is no catch
14794         statements (missing null test).
14795
14796 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
14797
14798         * driver.cs (MainDriver): Be conservative on our command line
14799         handling.
14800
14801         Catch DirectoryNotFoundException when calling GetFiles.
14802
14803         (SplitPathAndPattern): Used to split the input specification into
14804         a path and a pattern that we can feed to Directory.GetFiles.
14805
14806 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
14807
14808         * statement.cs (Fixed): Implement the last case of the Fixed
14809         statement (string handling).
14810
14811         * expression.cs (StringPtr): New class used to return a char * to
14812         a string;  Used by the Fixed statement.
14813
14814         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
14815
14816         * expression.cs (Binary.ResolveOperator): Remove redundant
14817         MemberLookup pn parent type.
14818         Optimize union call, we do not need a union if the types are the same.
14819         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
14820         type.
14821
14822         Specialize the use of MemberLookup everywhere, instead of using
14823         the default settings. 
14824
14825         (StackAlloc): Implement stackalloc keyword.
14826
14827         * cs-parser.jay: Add rule to parse stackalloc.
14828
14829         * driver.cs: Handle /h, /help, /?
14830
14831         * expression.cs (MakeByteBlob): Removed the hacks we had in place
14832         before we supported unsafe code.
14833
14834         * makefile: add --unsafe to the self compilation of mcs.
14835
14836 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
14837
14838         * expression.cs (PointerArithmetic): New class that is used to
14839         perform pointer arithmetic.
14840         (Binary.Resolve): Handle pointer arithmetic
14841         Handle pointer comparission.
14842         (ArrayPtr): Utility expression class that is used to take the
14843         address of an array.
14844
14845         (ElementAccess): Implement array access for pointers
14846
14847         * statement.cs (Fixed): Implement fixed statement for arrays, we
14848         are missing one more case before we are done.
14849
14850         * expression.cs (Indirection): Implement EmitAssign and set the
14851         ExprClass to Variable.  This allows pointer dereferences to be
14852         treated as variables, and to have values assigned to them.
14853
14854         * ecore.cs (Expression.StoreFromPtr): New utility function to
14855         store values dereferencing.
14856
14857 2002-02-20  Ravi Pratap  <ravi@ximian.com>
14858
14859         * expression.cs (Binary.ResolveOperator): Ensure that we are
14860         not trying to operate on a void type - this fixes the reported
14861         bug.
14862
14863         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
14864         the parent implementation is sealed.
14865
14866         * ../errors/cs0239.cs : Add.
14867
14868         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
14869
14870         * typemanager.cs (unverifiable_code_type): Corresponds to 
14871         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
14872         which have unsafe code in them.
14873
14874         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
14875         unsafe context.
14876
14877 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
14878
14879         * cs-tokenizer.cs: Add support for @"litreal strings"
14880
14881         Make tokenizer accept pre-processor directives
14882         on any column (remove the old C-like limitation). 
14883
14884         * rootcontext.cs (EmitCode): Emit any global attributes.
14885         (AddGlobalAttributes): Used to keep track of assembly attributes. 
14886
14887         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
14888
14889         * cs-parser.jay: Add support for global attributes.  
14890
14891 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
14892
14893         * expression.cs (Indirection): New helper class.  Unary will
14894         create Indirection classes to be able to implement the
14895         IMemoryLocation interface on it.
14896
14897 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
14898
14899         * cs-parser.jay (fixed_statement): reference the right statement.
14900
14901         * statement.cs (Fixed.Emit): Finish implementing the fixed
14902         statement for the &x case.
14903
14904 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
14905
14906         * class.cs (Property.Define, Method.Define): Remove newslot when
14907         `implementing'.  
14908
14909         * modifiers.cs: My use of NewSlot when `Abstract' was set was
14910         wrong.  NewSlot should only be used if the `new' keyword is present.
14911
14912         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
14913         locating our system dir.  Sorry about this.
14914
14915 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14916
14917         * driver.cs (GetSystemDir): Compute correctly the location of our
14918         system assemblies.  I was using the compiler directory instead of
14919         the library directory.
14920
14921 2002-02-13  Ravi Pratap  <ravi@ximian.com>
14922
14923         * expression.cs (BetterFunction): Put back in what Miguel commented out
14924         since it is the correct fix. The problem is elsewhere ;-)
14925
14926         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
14927         parameters of the parms method are themselves compatible or not !
14928
14929         (StandardConversionExists): Fix very dangerous bug where we were forgetting
14930         to check that a class implements an interface before saying that an implicit
14931         conversion was allowed. Use ImplementsInterface to do the checking.
14932
14933 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14934
14935         * class.cs (Method.Define): Track whether we are an explicit
14936         implementation or not.  And only call DefineMethodOverride if we
14937         are an explicit implementation.
14938
14939         (Property.DefineMethod): Ditto.
14940
14941 2002-02-11  Ravi Pratap  <ravi@ximian.com>
14942
14943         * expression.cs (BetterFunction): Catch hideous bug which was
14944          preventing us from detecting ambiguous calls due to implicit casts i.e
14945         cs0121.
14946
14947 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
14948
14949         * support.cs (Pair): Remove un-needed method.  I figured why I was
14950         getting the error in cs-parser.jay, the variable in a foreach loop
14951         is readonly, and the compiler does not really treat this as a variable.
14952
14953         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
14954         instead of EQUALS in grammar.  
14955
14956         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
14957
14958         * expression.cs (Unary.DoResolve): Check whether the argument is
14959         managed or not.
14960
14961 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
14962
14963         * support.cs: Api for Pair to set a value.  Despite the fact that
14964         the variables are public the MS C# compiler refuses to compile
14965         code that accesses the field if the variable is part of a foreach
14966         statement. 
14967
14968         * statement.cs (Fixed): Begin implementation of the fixed
14969         statement.
14970
14971         (Block.AddVariable): Return the VariableInfo on success and null
14972         on failure instead of true/false. 
14973
14974         * cs-parser.jay (foreach): Catch errors on variables already
14975         defined (we were ignoring this value before) and properly unwind
14976         the block hierarchy
14977
14978         (fixed_statement): grammar for the fixed statement.
14979
14980 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
14981
14982         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
14983         pointer types to be incretemented.
14984
14985         (SizeOf): Implement.
14986
14987         * cs-parser.jay (pointer_member_access): Implement
14988         expr->IDENTIFIER production.
14989
14990         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
14991         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
14992         on safe contexts.
14993
14994         (Unary): Implement indirection.
14995
14996         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
14997         use in non-unsafe context).
14998
14999         (SimpleName.DoResolve): Check for pointers in field access on safe
15000         contexts. 
15001
15002         (Expression.LoadFromPtr): Factor the load-indirect code in this
15003         function.  This was duplicated in UnboxCast and ParameterReference
15004
15005 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
15006
15007         * expression.cs (ComposedCast): report an error if a pointer cast
15008         is used in a safe region.
15009
15010         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
15011         pointer type casts in unsafe context.
15012
15013         * codegen.cs (EmitContext): Set up IsUnsafe.
15014
15015         * cs-parser.jay (non_expression_type): Add productions for pointer
15016         casts. 
15017
15018         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
15019         code.  We should not use force into static mode if the method is
15020         not virtual.  Fixes bug in MIS
15021
15022         * statement.cs (Do.Emit, While.Emit, For.Emit,
15023         Statement.EmitBoolExpression): Add support to Do and While to
15024         propagate infinite loop as `I do return' semantics.
15025
15026         Improve the For case to also test for boolean constants.
15027
15028         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
15029         to the list of attributes we can add.
15030
15031         Remove `EmitContext' argument.
15032
15033         * class.cs (Method.Define): Apply parameter attributes.
15034         (Constructor.Define): Apply parameter attributes.
15035         (MethodCore.LabelParameters): Move here the core of labeling
15036         parameters. 
15037
15038         * support.cs (ReflectionParameters.ParameterModifier,
15039         InternalParameters.ParameterModifier): Use IsByRef on the type and
15040         only return the OUT bit for these parameters instead of in/out/ref
15041         flags.
15042
15043         This is because I miss-understood things.  The ParameterInfo.IsIn
15044         and IsOut represent whether the parameter has the [In] and [Out]
15045         attributes set.  
15046
15047 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
15048
15049         * ecore.cs (FieldExpr.Emit): Release temporaries.
15050
15051         * assign.cs (LocalTemporary.Release): new function.
15052
15053         * codegen.cs (EmitContext.GetTemporaryStorage,
15054         EmitContext.FreeTemporaryStorage): Rework the way we deal with
15055         temporary storage.  Now we can "put back" localbuilders when we
15056         are done with them
15057
15058 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
15059
15060         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
15061         need to make a copy of the variable to generate verifiable code.
15062
15063 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
15064
15065         * driver.cs: Compute dynamically the system directory.
15066
15067         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
15068         Slower, but more generally useful.  Used by the abstract
15069         registering implementation. 
15070
15071         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
15072         the rules for the special rule on Type/instances.  First check if
15073         we have the same name, and if so, try that special static path
15074         rather than the instance path.
15075
15076 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
15077
15078         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
15079         for, while and if.
15080
15081         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
15082         Enum, ValueType, Delegate or Array for non-corlib compiles.
15083
15084         * cs-tokenizer.cs: Catch long identifiers (645)
15085
15086         * typemanager.cs (IndexerPropetyName): Ravi never tested this
15087         piece of code.
15088
15089         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
15090         fix, we were returning too early, so we were not registering
15091         pending methods from abstract classes.
15092
15093         Do not register pending methods if the class is abstract.
15094
15095         * expression.cs (Conditional.DoResolve): Report circular implicit
15096         conversions when we neecd to compute it for conditional
15097         expressions. 
15098
15099         (Is.DoResolve): If the expression is always of the provided type,
15100         flag warning 183.  If the expression can not ever be of the
15101         provided type flag warning 184.
15102
15103         * class.cs: Catch 169 as well.
15104
15105         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
15106         read. 
15107
15108 2002-01-18  Nick Drochak  <ndrochak@gol.com>
15109
15110         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
15111
15112 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
15113
15114         * interface.cs: (PopulateMethod): Check for pointers being defined
15115         only if the unsafe context is active.
15116         (PopulateProperty): ditto.
15117         (PopulateIndexer): ditto.
15118
15119         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
15120         specified.  If pointers are present, make sure that they are
15121         present in an unsafe context.
15122         (Constructor, Constructor.Define): ditto.
15123         (Field, Field.Define): ditto.
15124         (Property, Property.Define): ditto.
15125         (Event, Event.Define): ditto.
15126
15127         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
15128         hashtable if there are classes or structs defined.
15129
15130         * expression.cs (LocalVariableReference.DoResolve): Simplify this
15131         code, as the constant resolution moved.
15132
15133         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
15134         the metadata, so we can flag error 133. 
15135
15136         * decl.cs (MemberCore.UnsafeOK): New function to test that a
15137         pointer is being declared in an unsafe context.
15138
15139 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
15140
15141         * modifiers.cs (Modifiers.Check): Require a Location argument.
15142         Report error 227 for Unsafe use.
15143
15144         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
15145
15146         * statement.cs (For.Emit): If the test is null, then report that
15147         we do `return', as we wont reach anything afterwards.
15148
15149         (Switch.SwitchGoverningType): Track the expression that matched
15150         the conversion.
15151
15152         * driver.cs: Allow negative numbers as an error code to flag.
15153
15154         * cs-parser.jay: Handle 1551.
15155
15156         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
15157
15158 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15159
15160         * cs-parser.jay: Report 1518 (type declaration can only contain
15161         class, struct, interface, enum or delegate)
15162
15163         (switch_label): Report 1523 (keywords `case' or `default' must
15164         preced code)
15165
15166         (opt_switch_sections): Report 1522 (empty switch)
15167
15168         * driver.cs: Report 1515 (response file specified multiple times)
15169         Report 1516 (Source file specified multiple times).
15170
15171         * expression.cs (Argument.Resolve): Signal 1510
15172
15173         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
15174         access not allowed in static code)
15175
15176 2002-01-11  Ravi Pratap  <ravi@ximian.com>
15177
15178         * typemanager.cs (IsPointerType): Utility method which we are going
15179         to need a lot.
15180
15181         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
15182         the object type, so we take care of that.
15183
15184         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
15185
15186         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
15187         added to non-params parameters :-)
15188
15189         * typemanager.cs (CSharpName): Include 'void' type too. 
15190
15191         (void_ptr_type): Include in the set of core types.
15192
15193         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
15194         duplicating code.
15195
15196         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
15197         an unsafe context.
15198
15199         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
15200         completely forgotten about it.
15201
15202 2002-01-10  Ravi Pratap  <ravi@ximian.com>
15203
15204         * cs-parser.jay (pointer_type): Add. This begins our implementation
15205         of parsing rules for unsafe code.
15206
15207         (unsafe_statement): Implement.
15208
15209         (embedded_statement): Modify to include the above.
15210
15211         * statement.cs (Unsafe): Implement new class for unsafe blocks.
15212
15213         * codegen.cs (EmitContext.InUnsafe): Add. This determines
15214         if the current context is an unsafe one.
15215
15216         * cs-parser.jay (local_variable_pointer_type): Since local variable types
15217         are handled differently, we need separate rules for them.
15218
15219         (local_variable_declaration): Update to use local_variable_pointer_type
15220         to allow variable declarations of unmanaged pointer types.
15221
15222         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
15223         in unsafe contexts.
15224
15225         * ../errors/cs0214.cs : Add.
15226
15227 2002-01-16  Nick Drochak  <ndrochak@gol.com>
15228
15229         * makefile: remove 'response' file when cleaning.
15230
15231 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15232
15233         * cs-parser.jay: Report 1524.
15234
15235 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
15236
15237         * typemanager.cs (RegisterMethod): drop checking if we have
15238         registered this from here
15239
15240 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
15241
15242         * class.cs (Method.EmitDestructor): Implement calling our base
15243         destructor. 
15244
15245         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
15246         value of InFinally.
15247
15248         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
15249         this routine and will wrap the call in a try/catch block.  Deal
15250         with the case.
15251
15252 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
15253
15254         * ecore.cs (Expression.MemberLookup): instead of taking a
15255         parameter `same_type' that was used to tell whether we could
15256         access private members we compute our containing type from the
15257         EmitContext.
15258
15259         (FieldExpr): Added partial support for volatile fields.  This does
15260         not work for volatile fields exposed from assemblies, as I can not
15261         figure out how to extract the modreq from it.
15262
15263         Updated all the source files to use this.
15264
15265         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
15266         because it is referenced by MemberLookup very often. 
15267
15268 2002-01-09  Ravi Pratap  <ravi@ximian.com>
15269
15270         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
15271         TypeBuilder.GetCustomAttributes to retrieve what we need.
15272
15273         Get rid of redundant default_member_attr_type as this is the same as
15274         default_member_type which already exists.
15275
15276         * interface.cs, attribute.cs : Update accordingly.
15277
15278 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
15279
15280         * typemanager.cs: Enable IndexerPropertyName again.  It does not
15281         work for TYpeBuilders though.  Ravi, can you please fix this?
15282
15283         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
15284
15285         * expression.cs (Argument.Emit): Handle the case of ref objects
15286         being passed to ref functions;  
15287
15288         (ParameterReference.EmitLoad): Loads the content of the pointer
15289         without dereferencing.
15290
15291 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15292
15293         * cs-tokenizer.cs: Implemented the pre-processing expressions.
15294
15295 2002-01-08  Ravi Pratap  <ravi@ximian.com>
15296
15297         * class.cs (Indexer.DefineMethod): Incorporate the interface
15298         type in the name of the method if we are doing explicit interface
15299         implementation.
15300
15301         * expression.cs (ConversionExists): Remove as it is completely obsolete.
15302
15303         (BetterConversion): Fix extremely trivial bug where we were referring to
15304         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
15305         again !
15306
15307         * ../errors/bug16.cs : Add although we have fixed it.
15308
15309 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15310
15311         * expression.cs (BaseIndexer): Begin implementation.
15312
15313         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
15314
15315         * cs-parser.jay (indexer_declarator): Use qualified_identifier
15316         production directly to remove a shift/reduce, and implement
15317         explicit interface implementation.
15318
15319         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
15320         after a floating point suffix.
15321
15322         * expression.cs (DoNumericPromotions): Improved the conversion for
15323         uint/uint.  If we have a constant, we avoid doing a typecast to a
15324         larger type.
15325
15326         * class.cs (Indexer): Implement explicit interface implementation
15327         for indexers.
15328
15329 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
15330
15331         * class.cs: make the default instance constructor public and hidebysig.
15332
15333 2001-01-03  Ravi Pratap  <ravi@ximian.com>
15334
15335         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
15336         so we can call it from elsewhere.
15337
15338         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
15339         we emit it internally if the class has a defined indexer; otherwise the user
15340         emits it by decorating the class definition with the DefaultMemberAttribute.
15341
15342         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
15343         attribute is not used on a type which defines an indexer.
15344
15345         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
15346         character when we skip whitespace.
15347
15348         * ../errors/cs0646.cs : Add.
15349
15350 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
15351
15352         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
15353         again. 
15354
15355         * makefile: Add practical target `mcs3.exe' which builds the third
15356         generation compiler. 
15357
15358         * expression.cs (New): Fix structures constructor calling.
15359
15360         * class.cs (Property, Method, Indexer): Emit Final flag on the
15361         method if we are an interface implementation and we are not
15362         abstract. 
15363
15364         * ecore.cs (PropertyExpr): New public field `IsBase', tells
15365         whether this property is referencing a `base' method.
15366
15367         * expression.cs (Invocation.EmitCall): take an extra argument:
15368         is_base, this is used to determine whether the `call' or
15369         `callvirt' opcode should be used.
15370
15371
15372         * delegate.cs: update EmitCall.
15373
15374         * class.cs (Method.Define): Set NewSlot for the cases where we are
15375         not implementing an interface method.
15376
15377         (Property.Define): ditto.
15378
15379 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
15380
15381         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
15382         'r'.  Allows mcs to parse itself fully.
15383
15384 2002-01-02  Ravi Pratap  <ravi@ximian.com>
15385
15386         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
15387         of the number of initializers that require the InitializeArray method.
15388
15389         (CheckIndices): Store the Expression in all cases - not the plain value. Also
15390         update the above field where necessary.
15391
15392         (MakeByteBlob): Update accordingly.
15393
15394         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
15395         greater than 2.
15396
15397         (EmitDynamicInitializers): Update in accordance with the new optimization.
15398
15399         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
15400         same OpCode applies.
15401
15402         * cs-parser.jay : Fix some glaring errors I introduced.
15403
15404 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
15405
15406         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
15407         so that we can check for name clashes there too.
15408
15409         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
15410         for interface indexers.
15411
15412         * interfaces.cs (Define): Emit the default member attribute.
15413
15414         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
15415         variable was being referred to while setting the value ;-)
15416
15417 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
15418
15419         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
15420         byte-by-byte information when we know the data is zero.
15421
15422         Make the block always a multiple of 4, because
15423         DefineInitializedData has a bug.
15424
15425         * assign.cs: Fix, we should assign from the temporary, not from
15426         the source. 
15427
15428         * expression.cs (MakeByteBlob): Fix my incorrect code.
15429
15430 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
15431
15432         * typemanager.cs (EnumToUnderlying): This function is used to get
15433         the underlying type from an enumeration, because it does not
15434         always work. 
15435
15436         * constant.cs: Use the I4_S form for values between -128 and 127.
15437
15438         * statement.cs (Block.LookupLabel): Looks up a label.
15439         (Block): Drop support for labeled blocks.
15440
15441         (LabeledStatement): New kind of statement that represents a label
15442         only.
15443
15444         (Goto): Finally implement this bad boy.
15445
15446         * cs-parser.jay: Update to reflect new mechanism to implement
15447         labels.
15448
15449 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
15450
15451         * codegen.cs (EmitContext.This): a codegen property that keeps the
15452         a single instance of this instead of creating many different this
15453         instances. 
15454
15455         * delegate.cs (Delegate.DoResolve): Update to use the property;
15456
15457         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
15458
15459         * expression.cs (BaseAccess.DoResolve): Ditto.
15460
15461 2001-12-29  Ravi Pratap  <ravi@ximian.com>
15462
15463         * typemanager.cs (methodimpl_attr_type): Add to hold the type
15464         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
15465
15466         (InitCoreTypes): Update accordingly.
15467
15468         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
15469         so we can quickly store the state.
15470
15471         (ApplyAttributes): Set the correct implementation flags
15472         for InternalCall methods.
15473
15474 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
15475
15476         * expression.cs (EmitCall): if a method is not virtual, then do
15477         not use callvirt on it.
15478
15479         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
15480         user defined stuff) requires the use of stobj, which takes an
15481         address on the stack instead of an array and an index.  So emit
15482         the Ldelema operation for it.
15483
15484         (EmitStoreOpcode): Use stobj for valuetypes.
15485
15486         (UnaryMutator.EmitCode): Use the right 1 value depending on
15487         whether we are dealing with int64/uint64, float or doubles.
15488
15489         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
15490         constructors that I implemented last night.
15491
15492         (Constructor.IsDefault): Fix to work properly for static
15493         constructors.
15494
15495         * cs-parser.jay (CheckDef): report method signature errors.
15496         Update error number 103 to be 132.
15497
15498         * decl.cs: New AdditionResult enumeration value: MethodExists.
15499         Although we do this check for methods later on in the semantic
15500         analysis, catching repeated default constructors is so easy that
15501         we catch these here. 
15502
15503         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
15504         promotions code.
15505
15506         (ParameterReference.EmitAssign, Emit): handle
15507         bools as bytes.
15508
15509         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
15510         (ArrayAccess.EmitStoreOpcode): ditto.
15511
15512         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
15513
15514         * expression.cs (MakeByteBlob): Complete all the missing types
15515         (uint, short, ushort, byte, sbyte)
15516
15517         * class.cs: Only init instance field initializers on instance
15518         constructors. 
15519
15520         Rename `constructors' to instance_constructors. 
15521
15522         (TypeContainer.AddConstructor): Only add constructors to the list
15523         if it is not static.
15524
15525         Make sure that we handle default_static_constructor independently
15526         everywhere where we handle instance_constructors
15527
15528 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
15529
15530         * class.cs: Do not lookup or create a base initializer for a
15531         static constructor.
15532
15533         (ConstructorInitializer.Resolve): use the proper type to lookup
15534         for constructors.
15535
15536         * cs-parser.jay: Report error 1585 (modifiers between type and name).
15537
15538         * enum.cs, interface.cs: Remove CloseType, this is taken care by
15539         in DeclSpace. 
15540
15541         * decl.cs: CloseType is now an virtual method, the default
15542         implementation just closes this type.
15543
15544 2001-12-28  Ravi Pratap  <ravi@ximian.com>
15545
15546         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
15547         to PreserveSig by default. Also emit HideBySig on such methods.
15548
15549         Basically, set the defaults to standard values.
15550
15551         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
15552         argument, if candidate is better, it can't be worse than the best !
15553
15554         (Invocation): Re-write bits to differentiate between methods being
15555         applicable in their expanded form and their normal form - for params
15556         methods of course.
15557
15558         Get rid of use_standard everywhere as only standard conversions are allowed
15559         in overload resolution. 
15560
15561         More spec conformance.
15562
15563 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15564
15565         * driver.cs: Add --timestamp, to see where the compiler spends
15566         most of its time.
15567
15568         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
15569         `this' in static code.
15570
15571         (SimpleName.DoResolve): Implement in terms of a helper function
15572         that allows static-references to be passed upstream to
15573         MemberAccess.
15574
15575         (Expression.ResolveWithSimpleName): Resolve specially simple
15576         names when called by MemberAccess to implement the special
15577         semantics. 
15578
15579         (Expression.ImplicitReferenceConversion): Handle conversions from
15580         Null to reference types before others, as Null's type is
15581         System.Object. 
15582
15583         * expression.cs (Invocation.EmitCall): Handle the special case of
15584         calling methods declared on a reference type from a ValueType
15585         (Base classes System.Object and System.Enum)
15586
15587         (MemberAccess.Resolve): Only perform lookups on Enumerations if
15588         the left hand side is a TypeExpr, not on every enumeration. 
15589
15590         (Binary.Resolve): If types are reference types, then do a cast to
15591         object on operators != and == of both arguments.
15592
15593         * typemanager.cs (FindMembers): Extract instance and static
15594         members if requested.
15595
15596         * interface.cs (PopulateProperty): Use void_type instead of null
15597         as the return type for the setter method.
15598
15599         (PopulateIndexer): ditto.
15600
15601 2001-12-27  Ravi Pratap  <ravi@ximian.com>
15602
15603         * support.cs (ReflectionParameters): Fix minor bug where we
15604         were examining the wrong parameter for the ParamArray attribute.
15605
15606         Cope with requests for the type of the parameter at position
15607         greater than the params parameter's. We now return the element
15608         type of the params array as that makes more sense.
15609
15610         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
15611         accordingly as we no longer have to extract the element type
15612         ourselves.
15613
15614         (Invocation.OverloadResolve): Update.
15615
15616 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15617
15618         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
15619         against IEnumerator, test whether the return value is a descendant
15620         of the IEnumerator interface.
15621
15622         * class.cs (Indexer.Define): Use an auxiliary method to implement
15623         the other bits of the method definition.  Begin support for
15624         explicit interface implementation.
15625
15626         (Property.DefineMethod): Use TypeManager.void_type instead of null
15627         for an empty return value.
15628
15629 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
15630
15631         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
15632         dealing with a FieldExpr which is composed of a FieldBuilder, in
15633         the code path we did extract the constant, but we should have
15634         obtained the underlying value to be able to cast it (otherwise we
15635         end up in an infinite loop, this is what Ravi was running into).
15636
15637         (ArrayCreation.UpdateIndices): Arrays might be empty.
15638
15639         (MemberAccess.ResolveMemberAccess): Add support for section
15640         14.5.4.1 that deals with the special case of E.I when E is a type
15641         and something else, that I can be a reference to a static member.
15642
15643         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
15644         handle a particular array type to create byte blobs, it is just
15645         something we dont generate byteblobs for.
15646
15647         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
15648         arguments. 
15649
15650         * location.cs (Push): remove the key from the hashtable that we
15651         are about to add.   This happens for empty files.
15652
15653         * driver.cs: Dispose files after we have parsed them.
15654
15655         (tokenize): new function that only runs the tokenizer on its
15656         input, for speed testing.
15657
15658 2001-12-26  Ravi Pratap  <ravi@ximian.com>
15659
15660         * class.cs (Event.Define): Define the private field only if there
15661         are no accessors defined.
15662
15663         * expression.cs (ResolveMemberAccess): If there is no associated
15664         field with the event, that means we have an event defined with its
15665         own accessors and we should flag error cs0070 since transforming
15666         ourselves into a field is not valid in that case.
15667
15668         * ecore.cs (SimpleName.DoResolve): Same as above.
15669
15670         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
15671         and charset to sane values.
15672
15673 2001-12-25  Ravi Pratap  <ravi@ximian.com>
15674
15675         * assign.cs (DoResolve): Perform check on events only if they 
15676         are being accessed outside the declaring type.
15677
15678         * cs-parser.jay (event_declarations): Update rules to correctly
15679         set the type of the implicit parameter etc.
15680
15681         (add_accessor, remove_accessor): Set current local parameters.
15682
15683         * expression.cs (Binary): For delegate addition and subtraction,
15684         cast the return value from the method into the appropriate delegate
15685         type.
15686
15687 2001-12-24  Ravi Pratap  <ravi@ximian.com>
15688
15689         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
15690         of these as the workaround is unnecessary.
15691
15692         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
15693         delegate data - none of that is needed at all.
15694
15695         Re-write bits to extract the instance expression and the delegate method
15696         correctly.
15697
15698         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
15699         on delegates too.
15700
15701         * attribute.cs (ApplyAttributes): New method to take care of common tasks
15702         of attaching attributes instead of duplicating code everywhere.
15703
15704         * everywhere : Update code to do attribute emission using the above method.
15705
15706 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15707
15708         * expression.cs (IsParamsMethodApplicable): if there are not
15709         parameters, return immediately.
15710
15711         * ecore.cs: The 0 literal can be implicity converted to an enum
15712         type. 
15713
15714         (SimpleName.DoResolve): First lookup the type, then lookup the
15715         members. 
15716
15717         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
15718         want to get its address.  If the InstanceExpression is not
15719         addressable, store the result in a temporary variable, then get
15720         the address of it.
15721
15722         * codegen.cs: Only display 219 errors on warning level or above. 
15723
15724         * expression.cs (ArrayAccess): Make it implement the
15725         IMemoryLocation interface.
15726
15727         (Binary.DoResolve): handle the operator == (object a, object b)
15728         and operator != (object a, object b) without incurring into a
15729         BoxedCast (because 5 != o should never be performed).
15730
15731         Handle binary enumerator operators.
15732
15733         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
15734         value type, otherwise use Ldelem_ref.
15735
15736         Use precomputed names;
15737
15738         (AddressOf): Implement address of
15739
15740         * cs-parser.jay (labeled_statement): Fix recursive block
15741         addition by reworking the production.
15742
15743         * expression.cs (New.DoEmit): New has a special case:
15744                 
15745                  If we are dealing with a ValueType, we have a few
15746                  situations to deal with:
15747                 
15748                     * The target of New is a ValueType variable, that is
15749                       easy, we just pass this as the variable reference
15750                 
15751                     * The target of New is being passed as an argument,
15752                       to a boxing operation or a function that takes a
15753                       ValueType.
15754                 
15755                       In this case, we need to create a temporary variable
15756                       that is the argument of New.
15757
15758
15759 2001-12-23  Ravi Pratap  <ravi@ximian.com>
15760
15761         * rootcontext.cs (LookupType): Check that current_type is not null before
15762         going about looking at nested types.
15763
15764         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
15765         not implement the IAssignMethod interface any more.
15766
15767         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
15768         where we tranform them into FieldExprs if they are being resolved from within
15769         the declaring type.
15770
15771         * ecore.cs (SimpleName.DoResolve): Do the same here.
15772
15773         * assign.cs (DoResolve, Emit): Clean up code considerably. 
15774
15775         * ../errors/bug10.cs : Add.
15776
15777         * ../errors/cs0070.cs : Add.
15778
15779         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
15780
15781         * assign.cs : Get rid of EventIsLocal everywhere.
15782
15783 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15784
15785         * ecore.cs (ConvertIntLiteral): finished the implementation.
15786
15787         * statement.cs (SwitchLabel): Convert the value we are using as a
15788         key before looking up the table.
15789
15790 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15791
15792         * codegen.cs (EmitTopBlock): Require a Location argument now.
15793
15794         * cs-parser.jay (constructor_declarator): We need to setup
15795         current_local_parameters before we parse the
15796         opt_constructor_initializer, to allow the variables to be bound
15797         to the constructor arguments.
15798
15799         * rootcontext.cs (LookupType): First lookup nested classes in our
15800         class and our parents before we go looking outside our class.
15801
15802         * expression.cs (ConstantFold): Extract/debox the values at the
15803         beginnning. 
15804
15805         * rootcontext.cs (EmitCode): Resolve the constants first before we
15806         resolve the types.  This is not really needed, but it helps debugging.
15807
15808         * statement.cs: report location.
15809
15810         * cs-parser.jay: pass location to throw statement.
15811
15812         * driver.cs: Small bug fix.
15813
15814         * report.cs: Updated format to be 4-zero filled digits.
15815
15816 2001-12-22  Ravi Pratap  <ravi@ximian.com>
15817
15818         * expression.cs (CheckIndices): Fix minor bug where the wrong
15819         variable was being referred to ;-)
15820
15821         (DoEmit): Do not call EmitStaticInitializers when the 
15822         underlying type is System.Object.
15823
15824 2001-12-21  Ravi Pratap  <ravi@ximian.com>
15825
15826         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
15827         and do the usual workaround for SRE.
15828
15829         * class.cs (MyEventBuilder.EventType): New member to get at the type
15830         of the event, quickly.
15831
15832         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
15833
15834         * assign.cs (Assign.DoResolve): Handle the case when the target
15835         is an EventExpr and perform the necessary checks.
15836
15837         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
15838         interface.
15839
15840         (SimpleName.MemberStaticCheck): Include check for EventExpr.
15841
15842         (EventExpr): Set the type in the constructor itself since we 
15843         are meant to be born fully resolved.
15844
15845         (EventExpr.Define): Revert code I wrote earlier.
15846                 
15847         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
15848         instance expression is null. The instance expression is a This in that case
15849         or a null, depending on whether it is a static method or not.
15850
15851         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
15852         refers to more than one method.
15853
15854         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
15855         and accordingly flag errors.
15856
15857 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15858
15859         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
15860
15861 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15862
15863         * location.cs (ToString): Provide useful rutine.
15864
15865 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15866
15867         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
15868         objects, return the actual integral boxed.
15869
15870         * statement.cs (SwitchLabel): define an ILLabel for each
15871         SwitchLabel. 
15872
15873         (Switch.CheckSwitch): If the value is a Literal, extract
15874         the underlying literal.
15875
15876         Also in the unused hashtable we had, add the SwitchLabel so we can
15877         quickly look this value up.
15878
15879         * constant.cs: Implement a bunch of new constants.  Rewrite
15880         Literal based on this.  Made changes everywhere to adapt to this.
15881
15882         * expression.cs (Expression.MakeByteBlob): Optimize routine by
15883         dereferencing array only once, and also copes with enumrations.
15884
15885         bytes are two bytes wide, not one.
15886
15887         (Cast): Perform constant conversions.
15888
15889         * ecore.cs (TryImplicitIntConversion): Return literals instead of
15890         wrappers to the literals here.
15891
15892         * expression.cs (DoNumericPromotions): long literals can converted
15893         to ulong implicity (this is taken care of elsewhere, but I was
15894         missing this spot).
15895
15896         * ecore.cs (Expression.Literalize): Make the return type Literal,
15897         to improve type checking.
15898
15899         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
15900
15901 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15902
15903         * literal.cs: Revert code from ravi that checked the bounds.  The
15904         bounds are sane by the definition of the type itself. 
15905
15906         * typemanager.cs: Fix implementation of ImplementsInterface.  We
15907         need to actually look up in our parent hierarchy for interfaces
15908         implemented. 
15909
15910         * const.cs: Use the underlying type for enumerations
15911
15912         * delegate.cs: Compute the basename for the delegate creation,
15913         that should fix the delegate test case, and restore the correct
15914         Type Lookup semantics in rootcontext
15915
15916         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
15917         referencing a nested type with the Reflection API is using the "+"
15918         sign. 
15919
15920         * cs-parser.jay: Do not require EOF token at the end.
15921
15922 2001-12-20  Ravi Pratap  <ravi@ximian.com>
15923
15924         * rootcontext.cs (LookupType): Concatenate type names with
15925         a '.' instead of a '+' The test suite passes again.
15926
15927         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
15928         field of the enumeration.
15929
15930         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
15931         the case when the member is an EventExpr.
15932
15933         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
15934         static has an associated instance expression.
15935
15936         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
15937
15938         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
15939
15940         * class.cs (Event.Define): Register event and perform appropriate checks
15941         for error #111.
15942
15943         We define the Add and Remove methods even if the use provides none because
15944         in that case, we provide default implementations ourselves.
15945
15946         Define a private field of the type of the event. This is done by the CSC compiler
15947         and we should be doing it too ;-)
15948
15949         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
15950         More methods we use in code we generate.
15951
15952         (multicast_delegate_type, delegate_type): Two separate types since the distinction
15953         is important.
15954
15955         (InitCoreTypes): Update accordingly for the above.
15956
15957         * class.cs (Event.Emit): Generate code for default accessors that we provide
15958
15959         (EmitDefaultMethod): Do the job in the above.
15960
15961         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
15962         appropriate place.
15963
15964 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15965
15966         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
15967         builders even if we were missing one.
15968
15969         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
15970         pass the Basename as our class name instead of the Name.  The
15971         basename will be correctly composed for us.
15972
15973         * parameter.cs (Paramters): Now takes a Location argument.
15974
15975         * decl.cs (DeclSpace.LookupType): Removed convenience function and
15976         make all the code call directly LookupType in RootContext and take
15977         this chance to pass the Location information everywhere.
15978
15979         * Everywhere: pass Location information.
15980
15981 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
15982
15983         * class.cs (Constructor.Define): Updated way of detecting the
15984         length of the parameters.
15985
15986         (TypeContainer.DefineType): Use basename as the type name for
15987         nested types.
15988
15989         (TypeContainer.Define): Do not recursively define types here, as
15990         definition is taken care in order by the RootContext.
15991
15992         * tree.cs: Keep track of namespaces in a per-file basis.
15993
15994         * parameter.cs (Parameter.ComputeSignature): Update to use
15995         DeclSpace. 
15996
15997         (Parameters.GetSignature): ditto.
15998
15999         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
16000         instead of a TypeContainer.
16001
16002         (Interface.SemanticAnalysis): Use `this' instead of our parent to
16003         resolve names.  Because we need to be resolve in our context, not
16004         our parents.
16005
16006         * driver.cs: Implement response files.
16007
16008         * class.cs (TypeContainer.DefineType): If we are defined, do not
16009         redefine ourselves.
16010
16011         (Event.Emit): Emit the code for add/remove handlers.
16012         (Event.Define): Save the MethodBuilders for add/remove.
16013
16014         * typemanager.cs: Use pair here too.
16015
16016         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
16017         DictionaryEntry requires the first argument to be non-null.  
16018
16019         (enum_declaration): Compute full name for registering the
16020         enumeration.
16021
16022         (delegate_declaration): Instead of using
16023         formal_parameter_list, use opt_formal_parameter_list as the list
16024         can be empty.
16025
16026         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
16027         (EventParsing): New property that controls whether `add' and
16028         `remove' are returned as tokens or identifiers (for events);
16029
16030 2001-12-19  Ravi Pratap  <ravi@ximian.com>
16031
16032         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
16033         use MyEventBuilder only and let it wrap the real builder for us.
16034
16035         (MyEventBuilder): Revamp constructor etc.
16036
16037         Implement all operations that we perform on EventBuilder in precisely the same
16038         way here too.
16039
16040         (FindMembers): Update to use the EventBuilder member.
16041
16042         (Event.Emit): Update accordingly.
16043
16044 2001-12-18  Ravi Pratap  <ravi@ximian.com>
16045
16046         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
16047         by calling the appropriate methods.
16048
16049         (GetCustomAttributes): Make stubs as they cannot possibly do anything
16050         useful.
16051
16052         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
16053
16054 2001-12-17  Ravi Pratap  <ravi@ximian.com>
16055
16056         * delegate.cs (Delegate.Populate): Check that the return type
16057         and various parameters types are indeed accessible.
16058
16059         * class.cs (Constructor.Define): Same here.
16060
16061         (Field.Define): Ditto.
16062
16063         (Event.Define): Ditto.
16064
16065         (Operator.Define): Check that the underlying Method defined itself
16066         correctly - so it's MethodBuilder should not be null.
16067
16068         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
16069         expression happens to be null.
16070
16071         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
16072         members but as of now we don't seem to be able to do anything really useful with it.
16073
16074         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
16075         not the EventBuilder.
16076
16077 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
16078
16079         * cs-tokenizer.cs: Add support for defines.
16080         Add support for #if, #elif, #else, #endif
16081
16082         (eval_var): evaluates a variable.
16083         (eval): stubbed for evaluating functions.
16084
16085         * cs-parser.jay: Pass the defines information
16086
16087         * driver.cs: Add --define command line option.
16088
16089         * decl.cs: Move MemberCore here.
16090
16091         Make it the base class for DeclSpace.  This allows us to catch and
16092         report 108 and 109 for everything now.
16093
16094         * class.cs (TypeContainer.Define): Extract all the members
16095         before populating and emit the warning 108 (new keyword required
16096         to override) instead of having each member implement this.
16097
16098         (MemberCore.Define): New abstract method, we will be using this in
16099         the warning reporting engine in Populate.
16100
16101         (Operator.Define): Adjust to new MemberCore protocol. 
16102
16103         * const.cs (Const): This does not derive from Expression, it is a
16104         temporary object we use to create fields, it is a MemberCore. 
16105
16106         * class.cs (Method.Define): Allow the entry point to be in a
16107         specific class.
16108
16109         * driver.cs: Rewrite the argument handler to clean it up a bit.
16110
16111         * rootcontext.cs: Made it just an auxiliary namespace feature by
16112         making everything static.
16113
16114         * driver.cs: Adapt code to use RootContext type name instead of
16115         instance variable.
16116
16117         * delegate.cs: Remove RootContext argument.
16118
16119         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
16120         argument. 
16121
16122         * class.cs (Event.Define): The lookup can fail.
16123
16124         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
16125
16126         * expression.cs: Resolve the this instance before invoking the code.
16127
16128 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
16129
16130         * cs-parser.jay: Add a production in element_access that allows
16131         the thing to become a "type" reference.  This way we can parse
16132         things like "(string [])" as a type.
16133
16134         Note that this still does not handle the more complex rules of
16135         casts. 
16136
16137
16138         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
16139
16140         * ecore.cs: (CopyNewMethods): new utility function used to
16141         assemble the list of methods from running FindMembers.
16142
16143         (MemberLookup): Rework FindMembers so that 
16144
16145 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
16146
16147         * class.cs (TypeContainer): Remove Delegates who fail to be
16148         defined.
16149
16150         * delegate.cs (Populate): Verify that we dont get null return
16151         values.   TODO: Check for AsAccessible.
16152
16153         * cs-parser.jay: Use basename to emit error 574 (destructor should
16154         have the same name as container class), not the full name.
16155
16156         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
16157         possible representation.  
16158
16159         Also implements integer type suffixes U and L.
16160
16161 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
16162
16163         * expression.cs (ArrayCreation.DoResolve): We need to do the
16164         argument resolution *always*.
16165
16166         * decl.cs: Make this hold the namespace.  Hold the root context as
16167         well.
16168         (LookupType): Move here.
16169
16170         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
16171
16172         * location.cs (Row, Name): Fixed the code, it was always returning
16173         references to the first file.
16174
16175         * interface.cs: Register properties defined through interfaces.
16176
16177         * driver.cs: Add support for globbing on the command line
16178
16179         * class.cs (Field): Make it derive from MemberCore as well.
16180         (Event): ditto.
16181
16182 2001-12-15  Ravi Pratap  <ravi@ximian.com>
16183
16184         * class.cs (Event::Define): Check that the type of the event is a delegate
16185         type else flag error #66.
16186
16187         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
16188         same.
16189
16190         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
16191         values of EntryPoint, CharSet etc etc.
16192
16193         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
16194
16195         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
16196         be null and we should ignore this. I am not sure if this is really clean. Apparently,
16197         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
16198         which needs this to do its work.
16199
16200         * ../errors/cs0066.cs : Add.
16201
16202 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
16203
16204         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
16205         helper functions.
16206
16207         * class.cs: (MethodSignature.MethodSignature): Removed hack that
16208         clears out the parameters field.
16209         (MemberSignatureCompare): Cleanup
16210
16211         (MemberCore): New base class used to share code between MethodCore
16212         and Property.
16213
16214         (RegisterRequiredImplementations) BindingFlags.Public requires
16215         either BindingFlags.Instace or Static.  Use instance here.
16216
16217         (Property): Refactored code to cope better with the full spec.
16218
16219         * parameter.cs (GetParameterInfo): Return an empty array instead
16220         of null on error.
16221
16222         * class.cs (Property): Abstract or extern properties have no bodies.
16223
16224         * parameter.cs (GetParameterInfo): return a zero-sized array.
16225
16226         * class.cs (TypeContainer.MethodModifiersValid): Move all the
16227         method modifier validation to the typecontainer so we can reuse
16228         this on properties.
16229
16230         (MethodCore.ParameterTypes): return an empty sized array of types.
16231
16232         (Property.Define): Test property modifier validity.
16233
16234         Add tests for sealed/override too.
16235
16236         (Method.Emit): abstract or extern methods have no bodies.
16237
16238 2001-12-14  Ravi Pratap  <ravi@ximian.com>
16239
16240         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
16241         thing.
16242
16243         (Method::Define, ::Emit): Modify accordingly.
16244
16245         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
16246
16247         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
16248
16249         * makefile: Pass in /unsafe.
16250
16251 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
16252
16253         * class.cs (MakeKey): Kill routine.
16254
16255         * class.cs (TypeContainer.Define): Correctly define explicit
16256         method implementations (they require the full interface name plus
16257         the method name).
16258
16259         * typemanager.cs: Deply the PtrHashtable here and stop using the
16260         lame keys.  Things work so much better.
16261
16262         This of course broke everyone who depended on `RegisterMethod' to
16263         do the `test for existance' test.  This has to be done elsewhere.
16264
16265         * support.cs (PtrHashtable): A hashtable that avoid comparing with
16266         the object stupid Equals method (because, that like fails all over
16267         the place).  We still do not use it.
16268
16269         * class.cs (TypeContainer.SetRequiredInterface,
16270         TypeContainer.RequireMethods): Killed these two routines and moved
16271         all the functionality to RegisterRequiredImplementations.
16272
16273         (TypeContainer.RegisterRequiredImplementations): This routine now
16274         registers all the implementations required in an array for the
16275         interfaces and abstract methods.  We use an array of structures
16276         which can be computed ahead of time to reduce memory usage and we
16277         also assume that lookups are cheap as most classes will not
16278         implement too many interfaces.
16279
16280         We also avoid creating too many MethodSignatures.
16281
16282         (TypeContainer.IsInterfaceMethod): Update and optionally does not
16283         clear the "pending" bit if we find that there are problems with
16284         the declaration.
16285
16286         (TypeContainer.VerifyPendingMethods): Update to report errors of
16287         methods that look like implementations but are not.
16288
16289         (TypeContainer.Define): Add support for explicit interface method
16290         implementation. 
16291
16292 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
16293
16294         * typemanager.cs: Keep track of the parameters here instead of
16295         being a feature of the TypeContainer.
16296
16297         * class.cs: Drop the registration of parameters here, as
16298         InterfaceMethods are also interface declarations.
16299
16300         * delegate.cs: Register methods with the TypeManager not only with
16301         the TypeContainer.  This code was buggy.
16302
16303         * interface.cs: Full registation here.
16304
16305 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
16306
16307         * expression.cs: Remove reducer for binary expressions, it can not
16308         be done this way.
16309
16310         * const.cs: Put here the code that used to go into constant.cs
16311
16312         * constant.cs: Put here the code for constants, this is a new base
16313         class for Literals.
16314
16315         * literal.cs: Make Literal derive from Constant.
16316
16317 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
16318
16319         * statement.cs (Return.Emit): Report error 157 if the user
16320         attempts to return from a finally block.
16321
16322         (Return.Emit): Instead of emitting a return, jump to the end of
16323         the function.
16324
16325         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
16326         LocalBuilder to store the result of the function.  ReturnLabel is
16327         the target where we jump.
16328
16329
16330 2001-12-09  Radek Doulik  <rodo@ximian.com>
16331
16332         * cs-parser.jay: remember alias in current namespace
16333
16334         * ecore.cs (SimpleName::DoResolve): use aliases for types or
16335         namespaces
16336
16337         * class.cs (LookupAlias): lookup alias in my_namespace
16338
16339         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
16340         aliases hashtable
16341         (LookupAlias): lookup alias in this and if needed in parent
16342         namespaces
16343
16344 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
16345
16346         * support.cs: 
16347
16348         * rootcontext.cs: (ModuleBuilder) Made static, first step into
16349         making things static.  I need this to avoid passing the
16350         TypeContainer when calling ParameterType.
16351
16352         * support.cs (InternalParameters.ParameterType): Remove ugly hack
16353         that did string manipulation to compute the type and then call
16354         GetType.  Use Parameter.ParameterType instead.
16355
16356         * cs-tokenizer.cs: Consume the suffix for floating values.
16357
16358         * expression.cs (ParameterReference): figure out whether this is a
16359         reference parameter or not.  Kill an extra variable by computing
16360         the arg_idx during emission.
16361
16362         * parameter.cs (Parameters.GetParameterInfo): New overloaded
16363         function that returns whether a parameter is an out/ref value or not.
16364
16365         (Parameter.ParameterType): The type of the parameter (base,
16366         without ref/out applied).
16367
16368         (Parameter.Resolve): Perform resolution here.
16369         (Parameter.ExternalType): The full type (with ref/out applied).
16370
16371         * statement.cs (Using.Emit, Using.EmitExpression): Implement
16372         support for expressions on the using statement.
16373
16374 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
16375
16376         * statement.cs (Using.EmitLocalVariableDecls): Split the
16377         localvariable handling of the using statement.
16378
16379         (Block.EmitMeta): Keep track of variable count across blocks.  We
16380         were reusing slots on separate branches of blocks.
16381
16382         (Try.Emit): Emit the general code block, we were not emitting it. 
16383
16384         Check the type of the declaration to be an IDisposable or
16385         something that can be implicity converted to it. 
16386
16387         Emit conversions if required.
16388
16389         * ecore.cs (EmptyExpression): New utility class.
16390         (Expression.ImplicitConversionExists): New utility function.
16391
16392 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
16393
16394         * statement.cs (Using): Implement.
16395
16396         * expression.cs (LocalVariableReference): Support read only variables.
16397
16398         * statement.cs: Remove the explicit emit for the Leave opcode.
16399         (VariableInfo): Add a readonly field.
16400
16401 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
16402
16403         * ecore.cs (ConvCast): new class used to encapsulate the various
16404         explicit integer conversions that works in both checked and
16405         unchecked contexts.
16406
16407         (Expression.ConvertNumericExplicit): Use new ConvCast class to
16408         properly generate the overflow opcodes.
16409
16410 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16411
16412         * statement.cs: The correct type for the EmptyExpression is the
16413         element_type, not the variable type.  Ravi pointed this out.
16414
16415 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16416
16417         * class.cs (Method::Define): Handle PInvoke methods specially
16418         by using DefinePInvokeMethod instead of the usual one.
16419
16420         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
16421         above to do the task of extracting information and defining the method.
16422
16423 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16424
16425         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
16426         of the condition for string type.
16427
16428         (Emit): Move that here. 
16429
16430         (ArrayCreation::CheckIndices): Keep string literals in their expression
16431         form.
16432
16433         (EmitDynamicInitializers): Handle strings appropriately.
16434
16435 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16436
16437         * codegen.cs (EmitContext): Replace multiple variables with a
16438         single pointer to the current Switch statement.
16439
16440         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
16441         EmitContext.
16442
16443 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16444
16445         * statement.cs 
16446
16447         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
16448         default'.
16449
16450         (Foreach.Emit): Foreach on arrays was not setting
16451         up the loop variables (for break/continue).
16452
16453         (GotoCase): Semi-implented.
16454
16455 2001-12-03  Ravi Pratap  <ravi@ximian.com>
16456
16457         * attribute.cs (CheckAttribute): Handle system attributes by using
16458         Attribute.GetAttributes to examine information we need.
16459
16460         (GetValidPlaces): Same here.
16461
16462         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
16463
16464         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
16465
16466         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
16467
16468         (Method::Define): Set appropriate flags if we have a DllImport attribute.
16469
16470         (Method::Emit): Handle the case when we are a PInvoke method.
16471
16472 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16473
16474         * expression.cs: Use ResolveWithSimpleName on compound names.
16475
16476 2001-12-02  Ravi Pratap  <ravi@ximian.com>
16477
16478         * constant.cs (EmitConstant): Make sure we resolve the associated expression
16479         before trying to reduce it.
16480
16481         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
16482
16483         * constant.cs (LookupConstantValue): Implement.
16484
16485         (EmitConstant): Use the above in emitting the constant.
16486
16487         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
16488         that are user-defined by doing a LookupConstantValue on them.
16489
16490         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
16491         too, like above.
16492
16493 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
16494
16495         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
16496
16497         (BaseAccess.DoResolve): Implement.
16498
16499         (MemberAccess.DoResolve): Split this routine into a
16500         ResolveMemberAccess routine that can be used independently
16501
16502 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
16503
16504         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
16505         As that share bits of the implementation.  Is returns a boolean,
16506         while As returns the Type that is being probed.
16507
16508 2001-12-01  Ravi Pratap  <ravi@ximian.com>
16509
16510         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
16511         instead of a Literal - much easier.
16512
16513         (EnumInTransit): Remove - utterly useless :-)
16514
16515         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
16516
16517         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
16518
16519         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
16520         chain when we have no associated expression.
16521
16522 2001-11-30  Ravi Pratap  <ravi@ximian.com>
16523
16524         * constant.cs (Define): Use Location while reporting the errror.
16525
16526         Also emit a warning when 'new' is used and there is no inherited
16527         member to hide.
16528
16529         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
16530         populated.
16531
16532         (LookupEnumValue): Implement to lookup an enum member's value and define it
16533         if necessary.
16534
16535         (Populate): Re-write accordingly to use the above routine.
16536
16537 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
16538
16539         * expression.cs (This): Fix prototype for DoResolveLValue to
16540         override the base class DoResolveLValue.
16541
16542         * cs-parser.cs: Report errors cs574 and cs575 (destructor
16543         declarations) 
16544
16545         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
16546         (we need to load the address of the field here).  This fixes
16547         test-22. 
16548
16549         (FieldExpr.DoResolveLValue): Call the DoResolve
16550         function to initialize the Instance expression.
16551
16552         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
16553         correctly the GetEnumerator operation on a value type.
16554
16555         * cs-parser.jay: Add more simple parsing error catches.
16556
16557         * statement.cs (Switch): Add support for string switches.
16558         Handle null specially.
16559
16560         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
16561
16562 2001-11-28  Ravi Pratap  <ravi@ximian.com>
16563
16564         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
16565
16566         (declare_local_constant): New helper function.
16567
16568         * statement.cs (AddConstant): Keep a separate record of constants
16569
16570         (IsConstant): Implement to determine if a variable is a constant.
16571
16572         (GetConstantExpression): Implement.
16573
16574         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
16575
16576         * statement.cs (IsVariableDefined): Re-write.
16577
16578 2001-11-27  Ravi Pratap  <ravi@ximian.com>
16579
16580         * class.cs (TypeContainer::FindMembers): Look for constants
16581         in the case when we are looking for MemberTypes.Field
16582
16583         * expression.cs (MemberAccess::DoResolve): Check that in the
16584         case we are a FieldExpr and a Literal, we are not being accessed
16585         by an instance reference.
16586
16587         * cs-parser.jay (local_constant_declaration): Implement.
16588
16589         (declaration_statement): Implement for constant declarations.
16590
16591 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
16592
16593         * statement.cs (Switch): Catch double defaults.
16594
16595         (Switch): More work on the switch() statement
16596         implementation.  It works for integral values now, need to finish
16597         string support.
16598
16599
16600 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16601
16602         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
16603         integer literals into other integer literals.  To be used by
16604         switch. 
16605
16606 2001-11-24  Ravi Pratap  <ravi@ximian.com>
16607
16608         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
16609         some memory.
16610
16611         (EmitDynamicInitializers): Cope with the above since we extract data
16612         directly from ArrayData now.
16613
16614         (ExpectInitializers): Keep track of whether initializers are mandatory
16615         or not.
16616
16617         (Bounds): Make it a hashtable to prevent the same dimension being 
16618         recorded for every element in that dimension.
16619
16620         (EmitDynamicInitializers): Fix bug which prevented the Set array method
16621         from being found.
16622
16623         Also fix bug which was causing the indices to be emitted in the reverse
16624         order.
16625
16626 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16627
16628         * expression.cs (ArrayCreation): Implement the bits that Ravi left
16629         unfinished.  They do not work, because the underlying code is
16630         sloppy.
16631
16632 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16633
16634         * cs-parser.jay: Remove bogus fixme.
16635
16636         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
16637         on Switch statement.
16638
16639 2001-11-23  Ravi Pratap  <ravi@ximian.com>
16640
16641         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
16642         the same. 
16643
16644         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
16645         parameter. Apparently, any expression is allowed. 
16646
16647         (ValidateInitializers): Update accordingly.
16648
16649         (CheckIndices): Fix some tricky bugs thanks to recursion.
16650
16651         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
16652         I was being completely brain-dead.
16653
16654         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
16655         and re-write acordingly.
16656
16657         (DelegateInvocation): Re-write accordingly.
16658
16659         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
16660
16661         (MakeByteBlob): Handle types more correctly.
16662
16663         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
16664         initialization from expressions but it is incomplete because I am a complete
16665         Dodo :-|
16666
16667 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16668
16669         * statement.cs (If.Emit): Fix a bug that generated incorrect code
16670         on If.  Basically, we have to return `true' (ie, we do return to
16671         our caller) only if both branches of the if return.
16672
16673         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
16674         short-circuit operators, handle them as short circuit operators. 
16675
16676         (Cast.DoResolve): Resolve type.
16677         (Cast.Cast): Take an expression as the target type.
16678
16679         * cs-parser.jay (cast_expression): Remove old hack that only
16680         allowed a limited set of types to be handled.  Now we take a
16681         unary_expression and we resolve to a type during semantic
16682         analysis.
16683
16684         Use the grammar productions from Rhys to handle casts (this is
16685         not complete like Rhys syntax yet, we fail to handle that corner
16686         case that C# has regarding (-x), but we will get there.
16687
16688 2001-11-22  Ravi Pratap  <ravi@ximian.com>
16689
16690         * class.cs (EmitFieldInitializer): Take care of the case when we have a
16691         field which is an array type.
16692
16693         * cs-parser.jay (declare_local_variables): Support array initialization too.
16694
16695         * typemanager.cs (MakeKey): Implement.
16696
16697         (everywhere): Use the above appropriately.
16698
16699         * cs-parser.jay (for_statement): Update for array initialization while
16700         declaring variables.
16701
16702         * ecore.cs : The error message was correct, it's the variable's names that
16703         were misleading ;-) Make the code more readable.
16704
16705         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
16706         the correct type etc.
16707
16708         (ConvertExplicit): Handle Enum types by examining the underlying type.
16709
16710 2001-11-21  Ravi Pratap  <ravi@ximian.com>
16711
16712         * parameter.cs (GetCallingConvention): Always return
16713         CallingConventions.Standard for now.
16714
16715 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16716
16717         * expression.cs (Binary.ResolveOperator): Update the values of `l'
16718         and `r' after calling DoNumericPromotions.
16719
16720         * ecore.cs: Fix error message (the types were in the wrong order).
16721
16722         * statement.cs (Foreach.ProbeCollectionType): Need to pass
16723         BindingFlags.Instance as well 
16724
16725         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
16726         implicit int literal conversion in an empty cast so that we
16727         propagate the right type upstream.
16728
16729         (UnboxCast): new class used to unbox value types.
16730         (Expression.ConvertExplicit): Add explicit type conversions done
16731         by unboxing.
16732
16733         (Expression.ImplicitNumericConversion): Oops, forgot to test for
16734         the target type before applying the implicit LongLiterals to ULong
16735         literal cast.
16736
16737 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
16738
16739         * cs-parser.jay (for_statement): Reworked the way For works: now
16740         we declare manually any variables that are introduced in
16741         for_initializer to solve the problem of having out-of-band code
16742         emition (that is what got for broken).
16743
16744         (declaration_statement): Perform the actual variable declaration
16745         that used to be done in local_variable_declaration here.
16746
16747         (local_variable_declaration): Do not declare anything, just pass
16748         the information on a DictionaryEntry
16749
16750 2001-11-20  Ravi Pratap  <ravi@ximian.com>
16751
16752         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
16753         re-write of the logic to now make it recursive.
16754
16755         (UpdateIndices): Re-write accordingly.
16756
16757         Store element data in a separate ArrayData list in the above methods.
16758
16759         (MakeByteBlob): Implement to dump the array data into a byte array.
16760
16761 2001-11-19  Ravi Pratap  <ravi@ximian.com>
16762
16763         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
16764         into CheckIndices.
16765
16766         * constant.cs (Define): Implement.
16767
16768         (EmitConstant): Re-write fully.
16769
16770         Pass in location info.
16771
16772         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
16773         respectively.
16774
16775         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
16776         DictionaryEntry since we need location info too.
16777
16778         (constant_declaration): Update accordingly.
16779
16780         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
16781         code into another method : UpdateIndices.
16782
16783 2001-11-18  Ravi Pratap  <ravi@ximian.com>
16784
16785         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
16786         some type checking etc.
16787
16788 2001-11-17  Ravi Pratap  <ravi@ximian.com>
16789
16790         * expression.cs (ArrayCreation::ValidateInitializers): Implement
16791         bits to provide dimension info if the user skips doing that.
16792
16793         Update second constructor to store the rank correctly.
16794
16795 2001-11-16  Ravi Pratap  <ravi@ximian.com>
16796
16797         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
16798         and try to implement.
16799
16800         * ../errors/cs0150.cs : Add.
16801
16802         * ../errors/cs0178.cs : Add.
16803
16804 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
16805
16806         * statement.cs: Implement foreach on multi-dimensional arrays. 
16807
16808         * parameter.cs (Parameters.GetParameterByName): Also lookup the
16809         name of the params argument.
16810
16811         * expression.cs: Use EmitStoreOpcode to get the right opcode while
16812         initializing the array.
16813
16814         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
16815         we can use this elsewhere.
16816
16817         * statement.cs: Finish implementation of foreach for single
16818         dimension arrays.
16819
16820         * cs-parser.jay: Use an out-of-band stack to pass information
16821         around, I wonder why I need this.
16822
16823         foreach_block: Make the new foreach_block the current_block.
16824
16825         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
16826         function used to return a static Parameters structure.  Used for
16827         empty parameters, as those are created very frequently.
16828
16829         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
16830
16831 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16832
16833         * interface.cs : Default modifier is private, not public. The
16834         make verify test passes again.
16835
16836 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16837
16838         * support.cs (ReflectionParameters): Fix logic to determine
16839         whether the last parameter is a params one. Test 9 passes again.
16840
16841         * delegate.cs (Populate): Register the builders we define with
16842         RegisterParameterForBuilder. Test 19 passes again.
16843
16844         * cs-parser.jay (property_declaration): Reference $6 instead
16845         of $$ to get at the location.
16846
16847         (indexer_declaration): Similar stuff.
16848
16849         (attribute): Ditto.
16850
16851         * class.cs (Property): Register parameters for the Get and Set methods
16852         if they exist. Test 23 passes again.
16853
16854         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
16855         call to EmitArguments as we are sure there aren't any params arguments. 
16856         Test 32 passes again.
16857
16858         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
16859         IndexOutOfRangeException. 
16860
16861         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
16862         Test 33 now passes again.
16863
16864 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
16865
16866         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
16867         broke a bunch of things.  Will have to come up with a better way
16868         of tracking locations.
16869
16870         * statement.cs: Implemented foreach for single dimension arrays.
16871
16872 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16873
16874         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
16875         an error.  This removes the lookup from the critical path.
16876
16877         * cs-parser.jay: Removed use of temporary_loc, which is completely
16878         broken. 
16879
16880 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
16881
16882         * support.cs (ReflectionParameters.ParameterModifier): Report
16883         whether the argument is a PARAMS argument or not.
16884
16885         * class.cs: Set the attribute `ParamArrayAttribute' on the
16886         parameter argument.
16887
16888         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
16889         and cons_param_array_attribute (ConstructorInfo for
16890         ParamArrayAttribute)., 
16891
16892         * codegen.cs: Emit the return using the `Return' statement, that
16893         way we can report the error correctly for missing return values. 
16894
16895         * class.cs (Method.Emit): Clean up.
16896
16897         * expression.cs (Argument.Resolve): Take another argument: the
16898         location where this argument is used.  Notice that this is not
16899         part of the "Argument" class as to reduce the size of the
16900         structure (we know the approximate location anyways).
16901
16902         Test if the argument is a variable-reference, if not, then
16903         complain with a 206.
16904
16905         (Argument.Emit): Emit addresses of variables.
16906
16907         (Argument.FullDesc): Simplify.
16908
16909         (Invocation.DoResolve): Update for Argument.Resolve.
16910
16911         (ElementAccess.DoResolve): ditto.
16912
16913         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
16914         method should be virtual, as this method is always virtual.
16915
16916         (NewDelegate.DoResolve): Update for Argument.Resolve.
16917
16918         * class.cs (ConstructorInitializer.DoResolve): ditto.
16919
16920         * attribute.cs (Attribute.Resolve): ditto.
16921
16922 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
16923
16924         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
16925
16926         * expression.cs (ParameterReference): Drop IStackStorage and implement
16927         IAssignMethod instead. 
16928
16929         (LocalVariableReference): ditto.
16930
16931         * ecore.cs (FieldExpr): Drop IStackStorage and implement
16932         IAssignMethod instead. 
16933
16934 2001-11-13  Miguel de Icaza <miguel@ximian.com>
16935
16936         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
16937         enumerations that are used in heavily used structures derive from
16938         byte in a laughable and pathetic attempt to reduce memory usage.
16939         This is the kind of pre-optimzations that you should not do at
16940         home without adult supervision.
16941
16942         * expression.cs (UnaryMutator): New class, used to handle ++ and
16943         -- separatedly from the other unary operators.  Cleans up the
16944         code, and kills the ExpressionStatement dependency in Unary.
16945
16946         (Unary): Removed `method' and `Arguments' from this class, making
16947         it smaller, and moving it all to SimpleCall, so I can reuse this
16948         code in other locations and avoid creating a lot of transient data
16949         strucutres when not required.
16950
16951         * cs-parser.jay: Adjust for new changes.
16952
16953 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
16954
16955         * enum.cs (Enum.Populate): If there is a failure during
16956         definition, return
16957
16958         * cs-parser.jay (opt_enum_base): we used to catch type errors
16959         here, but this is really incorrect.  The type error should be
16960         catched during semantic analysis.
16961
16962 2001-12-11  Ravi Pratap  <ravi@ximian.com>
16963
16964         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
16965         current_local_parameters as expected since I, in my stupidity, had forgotten
16966         to do this :-)
16967
16968         * attribute.cs (GetValidPlaces): Fix stupid bug.
16969
16970         * class.cs (Method::Emit): Perform check on applicability of attributes.
16971
16972         (Constructor::Emit): Ditto.
16973
16974         (Field::Emit): Ditto.
16975
16976         (Field.Location): Store location information.
16977
16978         (Property, Event, Indexer, Operator): Ditto.
16979
16980         * cs-parser.jay (field_declaration): Pass in location for each field.
16981
16982         * ../errors/cs0592.cs : Add.
16983
16984 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16985
16986         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
16987
16988         (InitCoreTypes): Update accordingly.
16989
16990         (RegisterAttrType, LookupAttr): Implement.
16991
16992         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
16993         info about the same.
16994
16995         (Resolve): Update to populate the above as necessary.
16996
16997         (Error592): Helper.
16998
16999         (GetValidPlaces): Helper to the above.
17000
17001         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
17002
17003         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
17004
17005 2001-11-12  Ravi Pratap  <ravi@ximian.com>
17006
17007         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
17008
17009         * ../errors/cs0617.cs : Add.
17010
17011 2001-11-11  Ravi Pratap  <ravi@ximian.com>
17012
17013         * enum.cs (Emit): Rename to Populate to be more consistent with what
17014         we expect it to do and when exactly it is called.
17015
17016         * class.cs, rootcontext.cs : Update accordingly.
17017
17018         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
17019         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
17020
17021         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
17022
17023         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
17024         of a fieldinfo using the above, when dealing with a FieldBuilder.
17025
17026 2001-11-10  Ravi Pratap  <ravi@ximian.com>
17027
17028         * ../errors/cs0031.cs : Add.
17029
17030         * ../errors/cs1008.cs : Add.
17031
17032         * ../errrors/cs0543.cs : Add.
17033
17034         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
17035         enum type.
17036
17037         (FindMembers): Implement.
17038
17039         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
17040         enums and delegates too.
17041
17042         (enum_types): Rename to builder_to_enum.
17043
17044         (delegate_types): Rename to builder_to_delegate.
17045
17046         * delegate.cs (FindMembers): Implement.
17047
17048 2001-11-09  Ravi Pratap  <ravi@ximian.com>
17049
17050         * typemanager.cs (IsEnumType): Implement.
17051
17052         * enum.cs (Emit): Re-write parts to account for the underlying type
17053         better and perform checking etc.
17054
17055         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
17056         of the underlying type.
17057
17058         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
17059         value
17060
17061         * enum.cs (error31): Helper to report error #31.
17062
17063         * cs-parser.jay (enum_declaration): Store location of each member too.
17064
17065         * enum.cs (member_to_location): New hashtable. 
17066
17067         (AddEnumMember): Update location hashtable.
17068
17069         (Emit): Use the location of each member while reporting errors.
17070
17071 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
17072
17073         * cs-parser.jay: A for_initializer if is a
17074         local_variable_declaration really ammount to have an implicit
17075         block with the variable declaration and no initializer for for.
17076
17077         * statement.cs (For.Emit): Cope with null initializers.
17078
17079         This fixes the infinite loop on for initializers.
17080
17081 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
17082
17083         * enum.cs: More cleanup.
17084
17085         * ecore.cs: Remove dead code.
17086
17087         * class.cs (Property.Emit): More simplification.
17088         (Event.Emit): ditto.
17089
17090         Reworked to have less levels of indentation.
17091
17092 2001-11-08  Ravi Pratap  <ravi@ximian.com>
17093
17094         * class.cs (Property): Emit attributes.
17095
17096         (Field): Ditto.
17097
17098         (Event): Ditto.
17099
17100         (Indexer): Ditto.
17101
17102         (Operator): Ditto.
17103
17104         * enum.cs (Emit): Ditto.
17105
17106         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
17107         Enums too.
17108
17109         * class.cs (Field, Event, etc.): Move attribute generation into the
17110         Emit method everywhere.
17111
17112         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
17113         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
17114         as we had no way of defining nested enums !
17115
17116         * rootcontext.cs : Adjust code accordingly.
17117
17118         * typemanager.cs (AddEnumType): To keep track of enum types separately.
17119
17120 2001-11-07  Ravi Pratap  <ravi@ximian.com>
17121
17122         * expression.cs (EvalConstantExpression): Move into ecore.cs
17123
17124         * enum.cs (Enum): Rename some members and make them public and readonly
17125         according to our convention.
17126
17127         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
17128         nothing else.
17129
17130         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
17131
17132         (Enum::Emit): Write a simple version for now which doesn't try to compute
17133         expressions. I shall modify this to be more robust in just a while.
17134
17135         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
17136
17137         (TypeContainer::CloseType): Create the Enum types too.
17138
17139         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
17140
17141         * expression.cs (EvalConstantExpression): Get rid of completely.
17142
17143         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
17144         user-defined values and other cases.
17145
17146         (IsValidEnumLiteral): Helper function.
17147
17148         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
17149         out there in the case we had a literal FieldExpr.
17150
17151         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
17152
17153         (Literalize): Revamp a bit to take two arguments.
17154
17155         (EnumLiteral): New class which derives from Literal to wrap enum literals.
17156
17157 2001-11-06  Ravi Pratap  <ravi@ximian.com>
17158
17159         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
17160
17161         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
17162
17163         (Resolve): Use the above to ensure we have proper initializers.
17164
17165 2001-11-05  Ravi Pratap  <ravi@ximian.com>
17166
17167         * expression.cs (Expression::EvalConstantExpression): New method to 
17168         evaluate constant expressions.
17169
17170         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
17171
17172 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
17173
17174         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
17175         in an array.
17176
17177         (Binary.ResolveOperator): Handle operator != (object a, object b)
17178         and operator == (object a, object b);
17179
17180         (Binary.DoNumericPromotions): Indicate whether the numeric
17181         promotion was possible.
17182
17183         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
17184         Implement.  
17185
17186         Made the ArrayAccess implement interface IAssignMethod instead of
17187         IStackStore as the order in which arguments are passed reflects
17188         this.
17189
17190         * assign.cs: Instead of using expr.ExprClass to select the way of
17191         assinging, probe for the IStackStore/IAssignMethod interfaces.
17192
17193         * typemanager.cs: Load InitializeArray definition.
17194
17195         * rootcontext.cs (RootContext.MakeStaticData): Used to define
17196         static data that can be used to initialize arrays. 
17197
17198 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
17199
17200         * expression.cs: Handle operator== and operator!= for booleans.
17201
17202         (Conditioal.Reduce): Implement reducer for the ?: operator.
17203
17204         (Conditional.Resolve): Implement dead code elimination.
17205
17206         (Binary.Resolve): Catch string literals and return a new
17207         concatenated string.
17208
17209         (Unary.Reduce): Implement reduction of unary expressions.
17210
17211         * ecore.cs: Split out the expression core handling here.
17212
17213         (Expression.Reduce): New method used to perform constant folding
17214         and CSE.  This is needed to support constant-expressions. 
17215
17216         * statement.cs (Statement.EmitBoolExpression): Pass true and false
17217         targets, and optimize for !x.
17218
17219 2001-11-04  Ravi Pratap  <ravi@ximian.com>
17220
17221         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
17222         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
17223         set custom atttributes.
17224
17225         * literal.cs (Literal::GetValue): New abstract method to return the actual
17226         value of the literal, cast as an object.
17227
17228         (*Literal): Implement GetValue method.
17229
17230         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
17231         expressions to the arraylist but objects of type Argument.
17232
17233         * class.cs (TypeContainer::Emit): Emit our attributes too.
17234
17235         (Method::Emit, Constructor::Emit): Ditto.
17236
17237         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
17238         to be ignoring earlier.
17239
17240 2001-11-03  Ravi Pratap  <ravi@ximian.com>
17241
17242         * attribute.cs (AttributeSection::Define): Implement to do the business
17243         of constructing a CustomAttributeBuilder.
17244
17245         (Attribute): New trivial class. Increases readability of code.  
17246
17247         * cs-parser.jay : Update accordingly.
17248
17249         (positional_argument_list, named_argument_list, named_argument): New rules
17250
17251         (attribute_arguments): Use the above so that we are more correct.
17252
17253 2001-11-02  Ravi Pratap  <ravi@ximian.com>
17254
17255         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
17256         to perform all checks for a method with a params parameter.
17257
17258         (Invocation::OverloadResolve): Update to use the above method and therefore
17259         cope correctly with params method invocations.
17260
17261         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
17262         params too.
17263
17264         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
17265         constructors in our parent too because we can't afford to miss out on 
17266         protected ones ;-)
17267
17268         * attribute.cs (AttributeSection): New name for the class Attribute
17269
17270         Other trivial changes to improve readability.
17271
17272         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
17273         use the new class names.
17274
17275 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17276
17277         * class.cs (Method::Define): Complete definition for params types too
17278
17279         (Indexer::Define): Ditto.
17280
17281         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
17282         Cope everywhere with a request for info about the array parameter.
17283
17284 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17285
17286         * tree.cs (RecordNamespace): Fix up to check for the correct key.
17287
17288         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
17289         local_variable_type to extract the string corresponding to the type.
17290
17291         (local_variable_type): Fixup the action to use the new helper method.
17292
17293         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
17294         go.
17295
17296         * expression.cs : Clean out code which uses the above.
17297
17298 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17299
17300         * typemanager.cs (RegisterMethod): Check if we already have an existing key
17301         and bale out if necessary by returning a false.
17302
17303         (RegisterProperty): Ditto.
17304
17305         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
17306         and print out appropriate error messages.
17307
17308         * interface.cs (everywhere): Ditto.
17309
17310         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
17311         location to constructor.
17312
17313         * class.cs (Property, Event, Indexer): Update accordingly.
17314
17315         * ../errors/cs111.cs : Added.
17316
17317         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
17318         of a method, as laid down by the spec.
17319
17320         (Invocation::OverloadResolve): Use the above method.
17321
17322 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17323
17324         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
17325         now take a TypeContainer and a Parameters object.
17326
17327         (ParameterData): Modify return type of ParameterModifier method to be 
17328         Parameter.Modifier and not a string.
17329
17330         (ReflectionParameters, InternalParameters): Update accordingly.
17331
17332         * expression.cs (Argument::GetParameterModifier): Same here.
17333
17334         * support.cs (InternalParameters::ParameterType): Find a better way of determining
17335         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
17336         symbol in it at all so maybe this is only for now.
17337
17338 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17339
17340         * support.cs (InternalParameters): Constructor now takes an extra argument 
17341         which is the actual Parameters class.
17342
17343         (ParameterDesc): Update to provide info on ref/out modifiers.
17344
17345         * class.cs (everywhere): Update call to InternalParameters to pass in
17346         the second argument too.
17347
17348         * support.cs (ParameterData): Add ParameterModifier, which is a method 
17349         to return the modifier info [ref/out etc]
17350
17351         (InternalParameters, ReflectionParameters): Implement the above.
17352
17353         * expression.cs (Argument::ParameterModifier): Similar function to return
17354         info about the argument's modifiers.
17355
17356         (Invocation::OverloadResolve): Update to take into account matching modifiers 
17357         too.
17358
17359         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
17360         a new SetFormalParameters object which we pass to InternalParameters.
17361
17362 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17363
17364         * expression.cs (NewArray): Merge into the ArrayCreation class.
17365
17366 2001-10-29  Ravi Pratap  <ravi@ximian.com>
17367
17368         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
17369         NewUserdefinedArray into one as there wasn't much of a use in having
17370         two separate ones.
17371
17372         * expression.cs (Argument): Change field's name to ArgType from Type.
17373
17374         (Type): New readonly property which returns the proper type, taking into 
17375         account ref/out modifiers.
17376
17377         (everywhere): Adjust code accordingly for the above.
17378
17379         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
17380         whether we are emitting for a ref or out parameter.
17381
17382         * expression.cs (Argument::Emit): Use the above field to set the state.
17383
17384         (LocalVariableReference::Emit): Update to honour the flag and emit the
17385         right stuff.
17386
17387         * parameter.cs (Attributes): Set the correct flags for ref parameters.
17388
17389         * expression.cs (Argument::FullDesc): New function to provide a full desc.
17390
17391         * support.cs (ParameterData): Add method ParameterDesc to the interface.
17392
17393         (ReflectionParameters, InternalParameters): Implement the above method.
17394
17395         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
17396         reporting errors.
17397
17398         (Invocation::FullMethodDesc): Ditto. 
17399
17400 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
17401
17402         * cs-parser.jay: Add extra production for the second form of array
17403         creation. 
17404
17405         * expression.cs (ArrayCreation): Update to reflect the above
17406         change. 
17407
17408         * Small changes to prepare for Array initialization.
17409
17410 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
17411
17412         * typemanager.cs (ImplementsInterface): interface might be null;
17413         Deal with this problem;
17414
17415         Also, we do store negative hits on the cache (null values), so use
17416         this instead of calling t.GetInterfaces on the type everytime.
17417
17418 2001-10-28  Ravi Pratap  <ravi@ximian.com>
17419
17420         * typemanager.cs (IsBuiltinType): New method to help determine the same.
17421
17422         * expression.cs (New::DoResolve): Get rid of array creation code and instead
17423         split functionality out into different classes.
17424
17425         (New::FormArrayType): Move into NewBuiltinArray.
17426
17427         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
17428         quite useless.
17429
17430         (NewBuiltinArray): New class to handle creation of built-in arrays.
17431
17432         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
17433         account creation of one-dimensional arrays.
17434
17435         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
17436
17437         (NewUserdefinedArray::DoResolve): Implement.
17438
17439         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
17440
17441         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
17442         we maintain inside the TypeManager. This is necessary to perform lookups on the
17443         module builder.
17444
17445         (LookupType): Update to perform GetType on the module builders too.     
17446
17447         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
17448
17449         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
17450
17451 2001-10-23  Ravi Pratap  <ravi@ximian.com>
17452
17453         * expression.cs (New::DoResolve): Implement guts of array creation.
17454
17455         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
17456
17457 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
17458
17459         * expression.cs: Fix bug I introduced lsat night that broke
17460         Delegates. 
17461
17462         (Expression.Resolve): Report a 246 error (can not resolve name)
17463         if we find a SimpleName in the stream.
17464
17465         (Expression.ResolveLValue): Ditto.
17466
17467         (Expression.ResolveWithSimpleName): This function is a variant of
17468         ResolveName, this one allows SimpleNames to be returned without a
17469         warning.  The only consumer of SimpleNames is MemberAccess
17470
17471 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
17472
17473         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
17474         might arrive here.  I have my doubts that this is correct.
17475
17476         * statement.cs (Lock): Implement lock statement.
17477
17478         * cs-parser.jay: Small fixes to support `lock' and `using'
17479
17480         * cs-tokenizer.cs: Remove extra space
17481
17482         * driver.cs: New flag --checked, allows to turn on integer math
17483         checking. 
17484
17485         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
17486         Threading.Monitor.Exit 
17487
17488 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
17489
17490         * expression.cs (IndexerAccess::DoResolveLValue): Set the
17491         Expression Class to be IndexerAccess.
17492
17493         Notice that Indexer::DoResolve sets the eclass to Value.
17494
17495 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
17496
17497         * class.cs (TypeContainer::Emit): Emit code for indexers.
17498
17499         * assign.cs (IAssignMethod): New interface implemented by Indexers
17500         and Properties for handling assignment.
17501
17502         (Assign::Emit): Simplify and reuse code. 
17503
17504         * expression.cs (IndexerAccess, PropertyExpr): Implement
17505         IAssignMethod, clean up old code. 
17506
17507 2001-10-22  Ravi Pratap  <ravi@ximian.com>
17508
17509         * typemanager.cs (ImplementsInterface): New method to determine if a type
17510         implements a given interface. Provides a nice cache too.
17511
17512         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
17513         method.
17514
17515         (ConvertReferenceExplicit): Ditto.
17516
17517         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
17518         various methods, with correct names etc.
17519
17520         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
17521         Operator.UnaryNegation.
17522
17523         * cs-parser.jay (operator_declarator): Be a little clever in the case where
17524         we have a unary plus or minus operator.
17525
17526         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
17527         UnaryMinus.
17528
17529         * everywhere : update accordingly.
17530
17531         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
17532         respectively.
17533
17534         * class.cs (Method::Define): For the case where we are implementing a method
17535         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
17536         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
17537
17538 2001-10-21  Ravi Pratap  <ravi@ximian.com>
17539
17540         * interface.cs (FindMembers): Implement to work around S.R.E
17541         lameness.
17542
17543         * typemanager.cs (IsInterfaceType): Implement.
17544
17545         (FindMembers): Update to handle interface types too.
17546
17547         * expression.cs (ImplicitReferenceConversion): Re-write bits which
17548         use IsAssignableFrom as that is not correct - it doesn't work.
17549
17550         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
17551         and accordingly override EmitStatement.
17552
17553         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
17554         using the correct logic :-)
17555
17556 2001-10-19  Ravi Pratap  <ravi@ximian.com>
17557
17558         * ../errors/cs-11.cs : Add to demonstrate error -11 
17559
17560 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
17561
17562         * assign.cs (Assign::Resolve): Resolve right hand side first, and
17563         then pass this as a hint to ResolveLValue.
17564
17565         * expression.cs (FieldExpr): Add Location information
17566
17567         (FieldExpr::LValueResolve): Report assignment to readonly
17568         variable. 
17569
17570         (Expression::ExprClassFromMemberInfo): Pass location information.
17571
17572         (Expression::ResolveLValue): Add new method that resolves an
17573         LValue. 
17574
17575         (Expression::DoResolveLValue): Default invocation calls
17576         DoResolve. 
17577
17578         (Indexers): New class used to keep track of indexers in a given
17579         Type. 
17580
17581         (IStackStore): Renamed from LValue, as it did not really describe
17582         what this did.  Also ResolveLValue is gone from this interface and
17583         now is part of Expression.
17584
17585         (ElementAccess): Depending on the element access type
17586
17587         * typemanager.cs: Add `indexer_name_type' as a Core type
17588         (System.Runtime.CompilerServices.IndexerNameAttribute)
17589
17590         * statement.cs (Goto): Take a location.
17591
17592 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17593
17594         * delegate.cs (Delegate::VerifyDelegate): New method to verify
17595         if two delegates are compatible.
17596
17597         (NewDelegate::DoResolve): Update to take care of the case when
17598         we instantiate a delegate from another delegate.
17599
17600         * typemanager.cs (FindMembers): Don't even try to look up members
17601         of Delegate types for now.
17602
17603 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17604
17605         * delegate.cs (NewDelegate): New class to take care of delegate
17606         instantiation.
17607
17608         * expression.cs (New): Split the delegate related code out into 
17609         the NewDelegate class.
17610
17611         * delegate.cs (DelegateInvocation): New class to handle delegate 
17612         invocation.
17613
17614         * expression.cs (Invocation): Split out delegate related code into
17615         the DelegateInvocation class.
17616
17617 2001-10-17  Ravi Pratap  <ravi@ximian.com>
17618
17619         * expression.cs (New::DoResolve): Implement delegate creation fully
17620         and according to the spec.
17621
17622         (New::DoEmit): Update to handle delegates differently.
17623
17624         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
17625         because of which we were printing out arguments in reverse order !
17626
17627         * delegate.cs (VerifyMethod): Implement to check if the given method
17628         matches the delegate.
17629
17630         (FullDelegateDesc): Implement.
17631
17632         (VerifyApplicability): Implement.
17633
17634         * expression.cs (Invocation::DoResolve): Update to accordingly handle
17635         delegate invocations too.
17636
17637         (Invocation::Emit): Ditto.
17638
17639         * ../errors/cs1593.cs : Added.
17640
17641         * ../errors/cs1594.cs : Added.
17642
17643         * delegate.cs (InstanceExpression, TargetMethod): New properties.
17644
17645 2001-10-16  Ravi Pratap  <ravi@ximian.com>
17646
17647         * typemanager.cs (intptr_type): Core type for System.IntPtr
17648
17649         (InitCoreTypes): Update for the same.
17650
17651         (iasyncresult_type, asynccallback_type): Ditto.
17652
17653         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
17654         correct.
17655
17656         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
17657         too.
17658
17659         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
17660         the builders for the 4 members of a delegate type :-)
17661
17662         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
17663         type.
17664
17665         * expression.cs (New::DoResolve): Implement guts for delegate creation.
17666
17667         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
17668
17669 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
17670
17671         * statement.cs (Break::Emit): Implement.   
17672         (Continue::Emit): Implement.
17673
17674         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17675         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17676         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17677         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
17678         end loop
17679
17680         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
17681         properties that track the label for the current loop (begin of the
17682         loop and end of the loop).
17683
17684 2001-10-15  Ravi Pratap  <ravi@ximian.com>
17685
17686         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
17687         use of emitting anything at all.
17688
17689         * class.cs, rootcontext.cs : Get rid of calls to the same.
17690
17691         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
17692
17693         (Populate): Define the constructor correctly and set the implementation
17694         attributes.
17695
17696         * typemanager.cs (delegate_types): New hashtable to hold delegates that
17697         have been defined.
17698
17699         (AddDelegateType): Implement.
17700
17701         (IsDelegateType): Implement helper method.
17702
17703         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
17704
17705         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
17706         and accordingly handle it.
17707
17708         * delegate.cs (Populate): Take TypeContainer argument.
17709         Implement bits to define the Invoke method. However, I still haven't figured out
17710         how to take care of the native int bit :-(
17711
17712         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
17713         Qualify the name of the delegate, not its return type !
17714
17715         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
17716         conversion.
17717
17718         (StandardConversionExists): Checking for array types turns out to be recursive.
17719
17720         (ConvertReferenceExplicit): Implement array conversion.
17721
17722         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
17723
17724 2001-10-12  Ravi Pratap  <ravi@ximian.com>
17725
17726         * cs-parser.jay (delegate_declaration): Store the fully qualified
17727         name as it is a type declaration.
17728
17729         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
17730         readonly.
17731
17732         (DefineDelegate): Renamed from Define. Does the same thing essentially,
17733         as TypeContainer::DefineType.
17734
17735         (Populate): Method in which all the definition of the various methods (Invoke)
17736         etc is done.
17737
17738         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
17739         see.
17740
17741         (CloseDelegate): Finally creates the delegate.
17742
17743         * class.cs (TypeContainer::DefineType): Update to define delegates.
17744         (Populate, Emit and CloseType): Do the same thing here too.
17745
17746         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
17747         delegates in all these operations.
17748
17749 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
17750
17751         * expression.cs: LocalTemporary: a new expression used to
17752         reference a temporary that has been created.
17753
17754         * assign.cs: Handle PropertyAccess back here, so that we can
17755         provide the proper semantic access to properties.
17756
17757         * expression.cs (Expression::ConvertReferenceExplicit): Implement
17758         a few more explicit conversions. 
17759
17760         * modifiers.cs: `NEW' modifier maps to HideBySig.
17761
17762         * expression.cs (PropertyExpr): Make this into an
17763         ExpressionStatement, and support the EmitStatement code path. 
17764
17765         Perform get/set error checking, clean up the interface.
17766
17767         * assign.cs: recognize PropertyExprs as targets, and if so, turn
17768         them into toplevel access objects.
17769
17770 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
17771
17772         * expression.cs: PropertyExpr::PropertyExpr: use work around the
17773         SRE.
17774
17775         * typemanager.cs: Keep track here of our PropertyBuilders again to
17776         work around lameness in SRE.
17777
17778 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
17779
17780         * expression.cs (LValue::LValueResolve): New method in the
17781         interface, used to perform a second resolution pass for LValues. 
17782
17783         (This::DoResolve): Catch the use of this in static methods.
17784
17785         (This::LValueResolve): Implement.
17786
17787         (This::Store): Remove warning, assigning to `this' in structures
17788         is 
17789
17790         (Invocation::Emit): Deal with invocation of
17791         methods on value types.  We need to pass the address to structure
17792         methods rather than the object itself.  (The equivalent code to
17793         emit "this" for structures leaves the entire structure on the
17794         stack instead of a pointer to it). 
17795
17796         (ParameterReference::DoResolve): Compute the real index for the
17797         argument based on whether the method takes or not a `this' pointer
17798         (ie, the method is static).
17799
17800         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
17801         value types returned from functions when we need to invoke a
17802         method on the sturcture.
17803
17804
17805 2001-10-11  Ravi Pratap  <ravi@ximian.com>
17806
17807         * class.cs (TypeContainer::DefineType): Method to actually do the business of
17808         defining the type in the Modulebuilder or Typebuilder. This is to take
17809         care of nested types which need to be defined on the TypeBuilder using
17810         DefineNestedMethod.
17811
17812         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
17813         methods in RootContext, only ported to be part of TypeContainer.
17814
17815         (TypeContainer::GetInterfaceOrClass): Ditto.
17816
17817         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
17818
17819         * interface.cs (Interface::DefineInterface): New method. Does exactly
17820         what RootContext.CreateInterface did earlier, only it takes care of nested types 
17821         too.
17822
17823         (Interface::GetInterfaces): Move from RootContext here and port.
17824
17825         (Interface::GetInterfaceByName): Same here.
17826
17827         * rootcontext.cs (ResolveTree): Re-write.
17828
17829         (PopulateTypes): Re-write.
17830
17831         * class.cs (TypeContainer::Populate): Populate nested types too.
17832         (TypeContainer::Emit): Emit nested members too.
17833
17834         * typemanager.cs (AddUserType): Do not make use of the FullName property,
17835         instead just use the name argument passed in as it is already fully
17836         qualified.
17837
17838         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
17839         to TypeContainer mapping to see if a type is user-defined.
17840
17841         * class.cs (TypeContainer::CloseType): Implement. 
17842
17843         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
17844         the default constructor.
17845
17846         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
17847         twice.
17848
17849         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
17850
17851         * interface.cs (CloseType): Create the type here.
17852
17853         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
17854         the hierarchy.
17855
17856         Remove all the methods which are now in TypeContainer.
17857
17858 2001-10-10  Ravi Pratap  <ravi@ximian.com>
17859
17860         * delegate.cs (Define): Re-write bits to define the delegate
17861         correctly.
17862
17863 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
17864
17865         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
17866
17867         * expression.cs (ImplicitReferenceConversion): handle null as well
17868         as a source to convert to any reference type.
17869
17870         * statement.cs (Return): Perform any implicit conversions to
17871         expected return type.  
17872
17873         Validate use of return statement.  
17874
17875         * codegen.cs (EmitContext): Pass the expected return type here.
17876
17877         * class.cs (Method, Constructor, Property): Pass expected return
17878         type to EmitContext.
17879
17880 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
17881
17882         * expression.cs: Make DoResolve take an EmitContext instead of a
17883         TypeContainer.
17884
17885         Replaced `l' and `location' for `loc', for consistency.
17886
17887         (Error, Warning): Remove unneeded Tc argument.
17888
17889         * assign.cs, literal.cs, constant.cs: Update to new calling
17890         convention. 
17891
17892         * codegen.cs: EmitContext now contains a flag indicating whether
17893         code is being generated in a static method or not.
17894
17895         * cs-parser.jay: DecomposeQI, new function that replaces the old
17896         QualifiedIdentifier.  Now we always decompose the assembled
17897         strings from qualified_identifier productions into a group of
17898         memberaccesses.
17899
17900 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
17901
17902         * rootcontext.cs: Deal with field-less struct types correctly now
17903         by passing the size option to Define Type.
17904
17905         * class.cs: Removed hack that created one static field. 
17906
17907 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17908
17909         * statement.cs: Moved most of the code generation here. 
17910
17911 2001-10-09  Ravi Pratap  <ravi@ximian.com>
17912
17913         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
17914         seem very right.
17915
17916         (ElementAccess): Remove useless bits for now - keep checks as the spec
17917         says.
17918
17919 2001-10-08  Ravi Pratap  <ravi@ximian.com>
17920
17921         * expression.cs (ElementAccess::DoResolve): Remove my crap code
17922         and start performing checks according to the spec.
17923
17924 2001-10-07  Ravi Pratap  <ravi@ximian.com>
17925
17926         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
17927         rank_specifiers instead.
17928
17929         (rank_specifiers): Change the order in which the rank specifiers are stored
17930
17931         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
17932
17933         * expression.cs (ElementAccess): Implement the LValue interface too.
17934
17935 2001-10-06  Ravi Pratap  <ravi@ximian.com>
17936
17937         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
17938         except that user defined conversions are not included.
17939
17940         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
17941         perform the conversion of the return type, if necessary.
17942
17943         (New::DoResolve): Check whether we are creating an array or an object
17944         and accordingly do the needful.
17945
17946         (New::Emit): Same here.
17947
17948         (New::DoResolve): Implement guts of array creation.
17949
17950         (New::FormLookupType): Helper function.
17951
17952 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17953
17954         * codegen.cs: Removed most of the code generation here, and move the
17955         corresponding code generation bits to the statement classes. 
17956
17957         Added support for try/catch/finalize and throw.
17958
17959         * cs-parser.jay: Added support for try/catch/finalize.
17960
17961         * class.cs: Catch static methods having the flags override,
17962         virtual or abstract.
17963
17964         * expression.cs (UserCast): This user cast was not really doing
17965         what it was supposed to do.  Which is to be born in fully resolved
17966         state.  Parts of the resolution were being performed at Emit time! 
17967
17968         Fixed this code.
17969
17970 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17971
17972         * expression.cs: Implicity convert the result from UserCast.
17973
17974 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17975
17976         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
17977         prevented it from working correctly. 
17978
17979         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
17980         merely ConvertImplicit.
17981
17982 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17983
17984         * typemanager.cs: Make the LookupTypeContainer function static,
17985         and not per-instance.  
17986
17987         * class.cs: Make static FindMembers (the one that takes a Type
17988         argument). 
17989
17990         * codegen.cs: Add EmitForeach here.
17991
17992         * cs-parser.jay: Make foreach a toplevel object instead of the
17993         inline expansion, as we need to perform semantic analysis on it. 
17994
17995 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17996
17997         * expression.cs (Expression::ImplicitUserConversion): Rename to
17998         UserDefinedConversion.
17999
18000         (Expression::UserDefinedConversion): Take an extra argument specifying 
18001         whether we look for explicit user conversions too.
18002
18003         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
18004
18005         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
18006
18007         (ExplicitUserConversion): Make it a call to UserDefinedConversion
18008         with the appropriate arguments.
18009
18010         * cs-parser.jay (cast_expression): Record location too.
18011
18012         * expression.cs (Cast): Record location info.
18013
18014         (Expression::ConvertExplicit): Take location argument.
18015
18016         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
18017         to determine if we are doing explicit conversions.
18018
18019         (UserCast::Emit): Update accordingly.
18020
18021         (Expression::ConvertExplicit): Report an error if everything fails.
18022
18023         * ../errors/cs0030.cs : Add.
18024
18025 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
18026
18027         * modifiers.cs: If the ABSTRACT keyword is present, also set the
18028         virtual and newslot bits. 
18029
18030         * class.cs (TypeContainer::RegisterRequiredImplementations):
18031         Record methods we need.
18032
18033         (TypeContainer::MakeKey): Helper function to make keys for
18034         MethodBases, since the Methodbase key is useless.
18035
18036         (TypeContainer::Populate): Call RegisterRequiredImplementations
18037         before defining the methods.   
18038
18039         Create a mapping for method_builders_to_methods ahead of time
18040         instead of inside a tight loop.
18041
18042         (::RequireMethods):  Accept an object as the data to set into the
18043         hashtable so we can report interface vs abstract method mismatch.
18044
18045 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
18046
18047         * report.cs: Make all of it static.
18048
18049         * rootcontext.cs: Drop object_type and value_type computations, as
18050         we have those in the TypeManager anyways.
18051
18052         Drop report instance variable too, now it is a global.
18053
18054         * driver.cs: Use try/catch on command line handling.
18055
18056         Add --probe option to debug the error reporting system with a test
18057         suite. 
18058
18059         * report.cs: Add support for exiting program when a probe
18060         condition is reached.
18061
18062 2001-10-03  Ravi Pratap  <ravi@ximian.com>
18063
18064         * expression.cs (Binary::DoNumericPromotions): Fix the case when
18065         we do a forcible conversion regardless of type, to check if 
18066         ForceConversion returns a null.
18067
18068         (Binary::error19): Use location to report error.
18069
18070         (Unary::error23): Use location here too.
18071
18072         * ../errors/cs0019.cs : Check in.
18073
18074         * ../errors/cs0023.cs : Check in.
18075
18076         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
18077         case of a non-null MethodInfo object with a length of 0 !
18078
18079         (Binary::ResolveOperator): Flag error if overload resolution fails to find
18080         an applicable member - according to the spec :-)
18081         Also fix logic to find members in base types.
18082
18083         (Unary::ResolveOperator): Same here.
18084
18085         (Unary::report23): Change name to error23 and make first argument a TypeContainer
18086         as I was getting thoroughly confused between this and error19 :-)
18087
18088         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
18089         (::FindMostEncompassedType): Implement.
18090         (::FindMostEncompassingType): Implement.
18091         (::StandardConversionExists): Implement.
18092
18093         (UserImplicitCast): Re-vamp. We now need info about most specific
18094         source and target types so that we can do the necessary conversions.
18095
18096         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
18097         mathematical union with no duplicates.
18098
18099 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
18100
18101         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
18102         in order from base classes to child classes, so that we can in
18103         child classes look up in our parent for method names and
18104         attributes (required for handling abstract, virtual, new, override
18105         constructs: we need to instrospect our base class, and if we dont
18106         populate the classes in order, the introspection might be
18107         incorrect.  For example, a method could query its parent before
18108         the parent has any methods and would determine that the parent has
18109         no abstract methods (while it could have had them)).
18110
18111         (RootContext::CreateType): Record the order in which we define the
18112         classes.
18113
18114 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
18115
18116         * class.cs (TypeContainer::Populate): Also method definitions can
18117         fail now, keep track of this.
18118
18119         (TypeContainer::FindMembers): Implement support for
18120         DeclaredOnly/noDeclaredOnly flag.
18121
18122         (Constructor::Emit) Return the ConstructorBuilder.
18123
18124         (Method::Emit) Return the MethodBuilder. 
18125         Check for abstract or virtual methods to be public.
18126
18127         * rootcontext.cs (RootContext::CreateType): Register all the
18128         abstract methods required for the class to be complete and the
18129         interface methods that must be implemented. 
18130
18131         * cs-parser.jay: Report error 501 (method requires body if it is
18132         not marked abstract or extern).
18133
18134         * expression.cs (TypeOf::Emit): Implement.
18135
18136         * typemanager.cs: runtime_handle_type, new global type.
18137
18138         * class.cs (Property::Emit): Generate code for properties.
18139
18140 2001-10-02  Ravi Pratap  <ravi@ximian.com>
18141
18142         * expression.cs (Unary::ResolveOperator): Find operators on base type
18143         too - we now conform exactly to the spec.
18144
18145         (Binary::ResolveOperator): Same here.
18146
18147         * class.cs (Operator::Define): Fix minor quirk in the tests.
18148
18149         * ../errors/cs0215.cs : Added.
18150
18151         * ../errors/cs0556.cs : Added.
18152
18153         * ../errors/cs0555.cs : Added.
18154
18155 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18156
18157         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
18158         single integer which is really efficient
18159
18160 2001-10-01  Ravi Pratap  <ravi@ximian.com>
18161
18162         *  expression.cs (Expression::ImplicitUserConversion): Use location
18163         even in the case when we are examining True operators.
18164  
18165         * class.cs (Operator::Define): Perform extensive checks to conform
18166         with the rules for operator overloading in the spec.
18167
18168         * expression.cs (Expression::ImplicitReferenceConversion): Implement
18169         some of the other conversions mentioned in the spec.
18170
18171         * typemanager.cs (array_type): New static member for the System.Array built-in
18172         type.
18173
18174         (cloneable_interface): For System.ICloneable interface.
18175
18176         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
18177         we start resolving the tree and populating types.
18178
18179         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
18180  
18181 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18182
18183         * expression.cs (Expression::ExprClassFromMemberInfo,
18184         Expression::Literalize): Create literal expressions from
18185         FieldInfos which are literals.
18186
18187         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
18188         type casts, because they were wrong.  The test suite in tests
18189         caught these ones.
18190
18191         (ImplicitNumericConversion): ushort to ulong requires a widening
18192         cast. 
18193
18194         Int32 constant to long requires widening cast as well.
18195
18196         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
18197         for integers because the type on the stack is not i4.
18198
18199 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
18200
18201         * expression.cs (report118): require location argument. 
18202
18203         * parameter.cs: Do not dereference potential null value.
18204
18205         * class.cs: Catch methods that lack the `new' keyword when
18206         overriding a name.  Report warnings when `new' is used without
18207         anything being there to override.
18208
18209         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
18210
18211         * class.cs: Only add constructor to hashtable if it is non-null
18212         (as now constructors can fail on define).
18213
18214         (TypeManager, Class, Struct): Take location arguments.
18215
18216         Catch field instance initialization in structs as errors.
18217
18218         accepting_filter: a new filter for FindMembers that is static so
18219         that we dont create an instance per invocation.
18220
18221         (Constructor::Define): Catch errors where a struct constructor is
18222         parameterless 
18223
18224         * cs-parser.jay: Pass location information for various new
18225         constructs. 
18226
18227         * delegate.cs (Delegate): take a location argument.
18228
18229         * driver.cs: Do not call EmitCode if there were problesm in the
18230         Definition of the types, as many Builders wont be there. 
18231
18232         * decl.cs (Decl::Decl): Require a location argument.
18233
18234         * cs-tokenizer.cs: Handle properly hex constants that can not fit
18235         into integers, and find the most appropiate integer for it.
18236
18237         * literal.cs: Implement ULongLiteral.
18238
18239         * rootcontext.cs: Provide better information about the location of
18240         failure when CreateType fails.
18241
18242 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
18243
18244         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
18245         as well.
18246
18247         * expression.cs (Binary::CheckShiftArguments): Add missing type
18248         computation.
18249         (Binary::ResolveOperator): Add type to the logical and and logical
18250         or, Bitwise And/Or and Exclusive Or code paths, it was missing
18251         before.
18252
18253         (Binary::DoNumericPromotions): In the case where either argument
18254         is ulong (and most signed types combined with ulong cause an
18255         error) perform implicit integer constant conversions as well.
18256
18257 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18258
18259         * expression.cs (UserImplicitCast): Method should always be
18260         non-null. 
18261         (Invocation::BetterConversion): Simplified test for IntLiteral.
18262
18263         (Expression::ImplicitNumericConversion): Split this routine out.
18264         Put the code that performs implicit constant integer conversions
18265         here. 
18266
18267         (Expression::Resolve): Become a wrapper around DoResolve so we can
18268         check eclass and type being set after resolve.
18269
18270         (Invocation::Badness): Remove this dead function
18271
18272         (Binary::ResolveOperator): Do not compute the expensive argumnets
18273         unless we have a union for it.
18274
18275         (Probe::Emit): Is needs to do an isinst and then
18276         compare against null.
18277
18278         (::CanConvert): Added Location argument.  If the Location argument
18279         is null (Location.Null), then we do not report errors.  This is
18280         used by the `probe' mechanism of the Explicit conversion.  We do
18281         not want to generate an error for something that the user
18282         explicitly requested to be casted.  But the pipeline for an
18283         explicit cast first tests for potential implicit casts.
18284
18285         So for now, if the Location is null, it means `Probe only' to
18286         avoid adding another argument.   Might have to revise this
18287         strategy later.
18288
18289         (ClassCast): New class used to type cast objects into arbitrary
18290         classes (used in Explicit Reference Conversions).
18291
18292         Implement `as' as well.
18293
18294         Reverted all the patches from Ravi below: they were broken:
18295
18296                 * The use of `level' as a mechanism to stop recursive
18297                   invocations is wrong.  That was there just to catch the
18298                   bug with a strack trace but not as a way of addressing
18299                   the problem.
18300
18301                   To fix the problem we have to *understand* what is going
18302                   on and the interactions and come up with a plan, not
18303                   just get things going.
18304
18305                 * The use of the type conversion cache that I proposed
18306                   last night had an open topic: How does this work across
18307                   protection domains.  A user defined conversion might not
18308                   be public in the location where we are applying the
18309                   conversion, a different conversion might be selected
18310                   (ie, private A->B (better) but public B->A (worse),
18311                   inside A, A->B applies, but outside it, B->A will
18312                   apply).
18313
18314                 * On top of that (ie, even if the above is solved),
18315                   conversions in a cache need to be abstract.  Ie, `To
18316                   convert from an Int to a Short use an OpcodeCast', not
18317                   `To convert from an Int to a Short use the OpcodeCast on
18318                   the variable 5' (which is what this patch was doing).
18319
18320 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18321
18322         * expression.cs (Invocation::ConversionExists): Re-write to use
18323         the conversion cache
18324
18325         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
18326         cache all conversions done, not just user-defined ones.
18327
18328         (Invocation::BetterConversion): The real culprit. Use ConversionExists
18329         to determine if a conversion exists instead of acutually trying to 
18330         perform the conversion. It's faster too.
18331
18332         (Expression::ConvertExplicit): Modify to use ConversionExists to check
18333         and only then attempt the implicit conversion.
18334
18335 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18336
18337         * expression.cs (ConvertImplicit): Use a cache for conversions
18338         already found. Check level of recursion and bail out if necessary.
18339
18340 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18341
18342         * typemanager.cs (string_concat_string_string, string_concat_object_object):
18343         Export standard methods that we expect for string operations.
18344
18345         * statement.cs (Block::UsageWarning): Track usage of variables and
18346         report the errors for not used variables.
18347
18348         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
18349         operator. 
18350
18351 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18352
18353         * codegen.cs: remove unnneded code 
18354
18355         * expression.cs: Removed BuiltinTypeAccess class
18356
18357         Fix the order in which implicit conversions are
18358         done.  
18359
18360         The previous fixed dropped support for boxed conversions (adding a
18361         test to the test suite now)
18362
18363         (UserImplicitCast::CanConvert): Remove test for source being null,
18364         that code is broken.  We should not feed a null to begin with, if
18365         we do, then we should track the bug where the problem originates
18366         and not try to cover it up here.
18367
18368         Return a resolved expression of type UserImplicitCast on success
18369         rather than true/false.  Ravi: this is what I was talking about,
18370         the pattern is to use a static method as a "constructor" for
18371         objects. 
18372
18373         Also, do not create arguments until the very last minute,
18374         otherwise we always create the arguments even for lookups that
18375         will never be performed. 
18376
18377         (UserImplicitCast::Resolve): Eliminate, objects of type
18378         UserImplicitCast are born in a fully resolved state. 
18379
18380         * typemanager.cs (InitCoreTypes): Init also value_type
18381         (System.ValueType). 
18382
18383         * expression.cs (Cast::Resolve): First resolve the child expression.
18384
18385         (LValue): Add new method AddressOf to be used by
18386         the `&' operator.  
18387
18388         Change the argument of Store to take an EmitContext instead of an
18389         ILGenerator, because things like FieldExpr need to be able to call
18390         their children expression to generate the instance code. 
18391
18392         (Expression::Error, Expression::Warning): Sugar functions for
18393         reporting errors.
18394
18395         (Expression::MemberLookup): Accept a TypeContainer instead of a
18396         Report as the first argument.
18397
18398         (Expression::ResolvePrimary): Killed.  I still want to improve
18399         this as currently the code is just not right.
18400
18401         (Expression::ResolveMemberAccess): Simplify, but it is still
18402         wrong. 
18403
18404         (Unary::Resolve): Catch errors in AddressOf operators.
18405
18406         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
18407         index to a byte for the short-version, or the compiler will choose
18408         the wrong Emit call, which generates the wrong data.
18409
18410         (ParameterReference::Emit, ::Store): same.
18411
18412         (FieldExpr::AddressOf): Implement.
18413
18414         * typemanager.cs: TypeManager: made public variable instead of
18415         property.
18416
18417         * driver.cs: document --fatal.
18418
18419         * report.cs (ErrorMessage, WarningMessage): new names for the old
18420         Error and Warning classes.
18421
18422         * cs-parser.jay (member_access): Turn built-in access to types
18423         into a normal simplename
18424
18425 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18426
18427         * expression.cs (Invocation::BetterConversion): Fix to cope
18428         with q being null, since this was introducing a bug.
18429
18430         * expression.cs (ConvertImplicit): Do built-in conversions first.
18431
18432 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18433
18434         * expression.cs (UserImplicitCast::Resolve): Fix bug.
18435
18436 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18437
18438         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
18439         I had introduced long ago (what's new ?).
18440
18441         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
18442         the work of all the checking. 
18443         (ConvertImplicit): Call CanConvert and only then create object if necessary.
18444         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
18445
18446         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
18447         that is the right way. 
18448
18449         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
18450         overloading resolution. Use everywhere instead of cutting and pasting code.
18451
18452         (Binary::ResolveOperator): Use MakeUnionSet.
18453
18454         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
18455         we have to convert to bool types. Not complete yet.
18456
18457 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18458
18459         * typemanager.cs (TypeManager::CSharpName): support ushort.
18460
18461         * expression.cs (Expression::TryImplicitIntConversion): Attempts
18462         to provide an expression that performsn an implicit constant int
18463         conversion (section 6.1.6).
18464         (Expression::ConvertImplicitRequired): Reworked to include
18465         implicit constant expression conversions.
18466
18467         (Expression::ConvertNumericExplicit): Finished.
18468
18469         (Invocation::Emit): If InstanceExpression is null, then it means
18470         that we perform a call on this.
18471
18472 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18473
18474         * expression.cs (Unary::Emit): Remove some dead code.
18475         (Probe): Implement Resolve and Emit for `is'.
18476         (Expression::ConvertImplicitRequired): Attempt to do constant
18477         expression conversions here.  Maybe should be moved to
18478         ConvertImplicit, but I am not sure.
18479         (Expression::ImplicitLongConstantConversionPossible,
18480         Expression::ImplicitIntConstantConversionPossible): New functions
18481         that tell whether is it possible to apply an implicit constant
18482         expression conversion.
18483
18484         (ConvertNumericExplicit): Started work on explicit numeric
18485         conversions.
18486
18487         * cs-parser.jay: Update operator constants.
18488
18489         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
18490         (Parameters::GetSignature): Hook up VerifyArgs here.
18491         (Parameters::VerifyArgs): Verifies that no two arguments have the
18492         same name. 
18493
18494         * class.cs (Operator): Update the operator names to reflect the
18495         ones that the spec expects (as we are just stringizing the
18496         operator names).
18497
18498         * expression.cs (Unary::ResolveOperator): Fix bug: Use
18499         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
18500         previous usage did only work for our methods.
18501         (Expression::ConvertImplicit): Handle decimal implicit numeric
18502         conversions as well.
18503         (Expression::InternalTypeConstructor): Used to invoke constructors
18504         on internal types for default promotions.
18505
18506         (Unary::Emit): Implement special handling for the pre/post
18507         increment/decrement for overloaded operators, as they need to have
18508         the same semantics as the other operators.
18509
18510         (Binary::ResolveOperator): ditto.
18511         (Invocation::ConversionExists): ditto.
18512         (UserImplicitCast::Resolve): ditto.
18513
18514 2001-09-26  Ravi Pratap  <ravi@ximian.com>
18515
18516         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
18517         operator, return after emitting body. Regression tests pass again !
18518
18519         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
18520         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
18521         (Invocation::OverloadResolve): Ditto.
18522         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
18523
18524         * everywhere : update calls to the above methods accordingly.
18525
18526 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18527
18528         * assign.cs (Assign): Make it inherit from ExpressionStatement.
18529
18530         * expression.cs (ExpressionStatement): New base class used for
18531         expressions that can appear in statements, so that we can provide
18532         an alternate path to generate expression that do not leave a value
18533         on the stack.
18534
18535         (Expression::Emit, and all the derivatives): We no longer return
18536         whether a value is left on the stack or not.  Every expression
18537         after being emitted leaves a single value on the stack.
18538
18539         * codegen.cs (EmitContext::EmitStatementExpression): Use the
18540         facilties of ExpressionStatement if possible.
18541
18542         * cs-parser.jay: Update statement_expression.
18543
18544 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
18545
18546         * driver.cs: Change the wording of message
18547
18548 2001-09-25  Ravi Pratap  <ravi@ximian.com>
18549
18550         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
18551         the type of the expression to the return type of the method if
18552         we have an overloaded operator match ! The regression tests pass again !
18553         (Unary::ResolveOperator): Ditto.
18554
18555         * expression.cs (Invocation::ConversionExists): Correct the member lookup
18556         to find "op_Implicit", not "implicit" ;-)
18557         (UserImplicitCast): New class to take care of user-defined implicit conversions.
18558         (ConvertImplicit, ForceConversion): Take TypeContainer argument
18559
18560         * everywhere : Correct calls to the above accordingly.
18561
18562         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
18563         (ConvertImplicit): Do user-defined conversion if it exists.
18564
18565 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
18566
18567         * assign.cs: track location.
18568         (Resolve): Use implicit conversions on assignment.
18569
18570         * literal.cs: Oops.  Not good, Emit of short access values should
18571         pass (Bytes) or the wrong argument will be selected.
18572
18573         * expression.cs (Unary::Emit): Emit code for -expr.
18574
18575         (Unary::ResolveOperator): Handle `Substract' for non-constants
18576         (substract from zero from the non-constants).
18577         Deal with Doubles as well. 
18578
18579         (Expression::ConvertImplicitRequired): New routine that reports an
18580         error if no implicit conversion exists. 
18581
18582         (Invocation::OverloadResolve): Store the converted implicit
18583         expressions if we make them
18584
18585 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18586
18587         * class.cs (ConstructorInitializer): Take a Location argument.
18588         (ConstructorBaseInitializer): Same here.
18589         (ConstructorThisInitializer): Same here.
18590
18591         * cs-parser.jay : Update all calls accordingly.
18592
18593         * expression.cs (Unary, Binary, New): Take location argument.
18594         Update accordingly everywhere.
18595
18596         * cs-parser.jay : Update all calls to the above to take a location
18597         argument.
18598
18599         * class.cs : Ditto.
18600
18601 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18602
18603         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
18604         (Invocation::BetterConversion): Same here
18605         (Invocation::ConversionExists): Ditto.
18606
18607         (Invocation::ConversionExists): Implement.
18608
18609 2001-09-22  Ravi Pratap  <ravi@ximian.com>
18610
18611         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
18612         Also take an additional TypeContainer argument.
18613
18614         * All over : Pass in TypeContainer as argument to OverloadResolve.
18615
18616         * typemanager.cs (CSharpName): Update to check for the string type and return
18617         that too.
18618
18619         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
18620         a given method.
18621
18622 2001-09-21  Ravi Pratap  <ravi@ximian.com>
18623
18624         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
18625         (Invocation::BetterFunction): Implement.
18626         (Invocation::BetterConversion): Implement.
18627         (Invocation::ConversionExists): Skeleton, no implementation yet.
18628
18629         Okay, things work fine !
18630
18631 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
18632
18633         * typemanager.cs: declare and load enum_type, delegate_type and
18634         void_type. 
18635
18636         * expression.cs (Expression::Emit): Now emit returns a value that
18637         tells whether a value is left on the stack or not.  This strategy
18638         might be reveted tomorrow with a mechanism that would address
18639         multiple assignments.
18640         (Expression::report118): Utility routine to report mismatches on
18641         the ExprClass.
18642
18643         (Unary::Report23): Report impossible type/operator combination
18644         utility function.
18645
18646         (Unary::IsIncrementableNumber): Whether the type can be
18647         incremented or decremented with add.
18648         (Unary::ResolveOperator): Also allow enumerations to be bitwise
18649         complemented. 
18650         (Unary::ResolveOperator): Implement ++, !, ~,
18651
18652         (Invocation::Emit): Deal with new Emit convetion.
18653
18654         * All Expression derivatives: Updated their Emit method to return
18655         whether they leave values on the stack or not.
18656
18657         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
18658         stack for expressions that are statements. 
18659
18660 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18661
18662         * expression.cs (LValue): New interface.  Must be implemented by
18663         LValue objects.
18664         (LocalVariableReference, ParameterReference, FieldExpr): Implement
18665         LValue interface.
18666
18667         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
18668         interface for generating code, simplifies the code.
18669
18670 2001-09-20  Ravi Pratap  <ravi@ximian.com>
18671
18672         * expression.cs (everywhere): Comment out return statements in ::Resolve
18673         methods to avoid the warnings.
18674
18675 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18676
18677         * driver.cs (parse): Report error 2001 if we can not open the
18678         source file.
18679
18680         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
18681         not resolve it.
18682
18683         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
18684         object. 
18685
18686         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
18687         otherwise nested blocks end up with the same index.
18688
18689         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
18690
18691         * expression.cs:  Instead of having FIXMEs in the Resolve
18692         functions, throw exceptions so it is obvious that we are facing a
18693         bug. 
18694
18695         * cs-parser.jay (invocation_expression): Pass Location information.
18696
18697         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
18698         Use a basename for those routines because .NET does not like paths
18699         on them. 
18700
18701         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
18702         already defined.
18703
18704 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
18705
18706         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
18707         are loading the correct data types (throws an exception if not).
18708         (TypeManager::InitCoreTypes): Use CoreLookupType
18709
18710         * expression.cs (Unary::ResolveOperator): return the child
18711         expression for expressions which are just +expr.
18712         (Unary::ResolveOperator): Return negative literals for -LITERAL
18713         expressions (otherwise they are Unary {Literal}).
18714         (Invocation::Badness): Take into account `Implicit constant
18715         expression conversions'.
18716
18717         * literal.cs (LongLiteral): Implement long literal class.
18718         (IntLiteral): export the `Value' of the intliteral. 
18719
18720 2001-09-19  Ravi Pratap  <ravi@ximian.com>
18721
18722         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
18723
18724         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
18725         instead of 'Operator'
18726
18727         * expression.cs (Binary::ResolveOperator): Update accordingly.
18728         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
18729         and 'Minus'
18730
18731         * cs-parser.jay (unary_expression): Update to use the new names.
18732
18733         * gen-treedump.cs (GetUnary): Same here.
18734
18735         * expression.cs (Unary::Resolve): Implement.
18736         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
18737         operators are found instead of making noise ;-)
18738         (Unary::ResolveOperator): New method to do precisely the same thing which
18739         Binary::ResolveOperator does for Binary expressions.
18740         (Unary.method, .Arguments): Add.
18741         (Unary::OperName): Implement.   
18742         (Unary::ForceConversion): Copy and Paste !
18743
18744         * class.cs (Operator::Define): Fix a small bug for the case when we have 
18745         a unary operator.
18746
18747         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
18748         for the inbuilt operators. Only overloading works for now ;-)
18749
18750 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
18751
18752         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
18753         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
18754
18755         * expression.cs (This::Emit): Implement. 
18756         (This::Resolve): Implement.
18757         (TypeOf:Resolve): Implement.
18758         (Expression::ResolveSimpleName): Add an implicit this to instance
18759         field references. 
18760         (MemberAccess::Resolve): Deal with Parameters and Fields. 
18761         Bind instance variable to Field expressions.
18762         (FieldExpr::Instance): New field used to track the expression that
18763         represents the object instance.
18764         (FieldExpr::Resolve): Track potential errors from MemberLookup not
18765         binding 
18766         (FieldExpr::Emit): Implement.
18767
18768         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
18769         the last instruction contains a return opcode to avoid generating
18770         the last `ret' instruction (this generates correct code, and it is
18771         nice to pass the peverify output).
18772
18773         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
18774         initializer for static and instance variables.
18775         (Constructor::Emit): Allow initializer to be null in the case of
18776         static constructors.  Only emit initializer for instance
18777         constructors. 
18778
18779         (TypeContainer::FindMembers): Return a null array if there are no
18780         matches.
18781
18782         Also fix the code for the MemberTypes.Method branch, as it was not
18783         scanning that for operators (or tried to access null variables before).
18784
18785         * assign.cs (Assign::Emit): Handle instance and static fields. 
18786
18787         * TODO: Updated.
18788
18789         * driver.cs: Stop compilation if there are parse errors.
18790
18791         * cs-parser.jay (constructor_declaration): Provide default base
18792         initializer for non-static constructors.
18793         (constructor_declarator): Do not provide a default base
18794         initializers if none was specified.
18795         Catch the fact that constructors should not have parameters.
18796
18797         * class.cs: Do not emit parent class initializers for static
18798         constructors, that should be flagged as an error.
18799
18800 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18801
18802         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
18803         Move back code into TypeContainer::Populate.
18804
18805 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18806
18807         * class.cs (TypeContainer::AddConstructor): Fix the check to
18808         compare against Name, not Basename. 
18809         (Operator::OpType): Change Plus and Minus to Add and Subtract.
18810
18811         * cs-parser.jay : Update accordingly.
18812
18813         * class.cs (TypeContainer::FindMembers): For the case where we are searching
18814         for methods, don't forget to look into the operators too.
18815         (RegisterMethodBuilder): Helper method to take care of this for
18816         methods, constructors and operators.
18817         (Operator::Define): Completely revamp.
18818         (Operator.OperatorMethod, MethodName): New fields.
18819         (TypeContainer::Populate): Move the registering of builders into
18820         RegisterMethodBuilder.
18821         (Operator::Emit): Re-write.
18822
18823         * expression.cs (Binary::Emit): Comment out code path to emit method
18824         invocation stuff for the case when we have a user defined operator. I am
18825         just not able to get it right !
18826
18827 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18828
18829         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
18830         argument. 
18831
18832         (Expression::MemberLookup): Provide a version that allows to
18833         specify the MemberTypes and BindingFlags. 
18834
18835         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
18836         so it was not fetching variable information from outer blocks.
18837
18838         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
18839         Beforefieldinit as it was buggy.
18840
18841         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
18842         that Ravi put here.  
18843
18844         * class.cs (Constructor::Emit): Only emit if block is not null.
18845         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
18846         deal with this by semantically definining it as if the user had
18847         done it.
18848
18849         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
18850         constructors as we now "emit" them at a higher level.
18851
18852         (TypeContainer::DefineDefaultConstructor): Used to define the
18853         default constructors if none was provided.
18854
18855         (ConstructorInitializer): Add methods Resolve and Emit. 
18856
18857         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
18858
18859 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18860
18861         * class.cs (TypeContainer::EmitDefaultConstructor): Register
18862         the default constructor builder with our hashtable for methodbuilders
18863         to methodcores.
18864
18865         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
18866         and argument_count is 0 in which case we have a match.
18867         (Binary::ResolveOperator): More null checking and miscellaneous coding
18868         style cleanup.
18869
18870 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18871
18872         * rootcontext.cs (IsNameSpace): Compare against null.
18873
18874         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
18875
18876         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
18877         and Unary::Operator.
18878
18879         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
18880         accordingly.
18881
18882         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
18883         we have overloaded operators.
18884         (Binary::ResolveOperator): Implement the part which does the operator overload
18885         resolution.
18886
18887         * class.cs (Operator::Emit): Implement.
18888         (TypeContainer::Emit): Emit the operators we have too.
18889
18890         * expression.cs (Binary::Emit): Update to emit the appropriate code for
18891         the case when we have a user-defined operator.
18892
18893 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18894
18895         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
18896
18897 2001-09-16  Ravi Pratap  <ravi@ximian.com>
18898
18899         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
18900         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
18901         (Constructor::Emit): Implement.
18902         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
18903         if we have no work to do. 
18904         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
18905         Emit method.
18906
18907         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
18908         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
18909
18910         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
18911         of parent.parent.
18912
18913 2001-09-15  Ravi Pratap  <ravi@ximian.com>
18914
18915         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
18916         in the source.
18917         (Tree::RecordNamespace): Method to do what the name says ;-)
18918         (Tree::Namespaces): Property to get at the namespaces hashtable.
18919
18920         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
18921         keep track.
18922
18923         * rootcontext.cs (IsNamespace): Fixed it :-)
18924
18925 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18926
18927         * class.cs (TypeContainer::FindMembers): Add support for
18928         constructors. 
18929         (MethodCore): New class that encapsulates both the shared aspects
18930         of a Constructor and a Method.  
18931         (Method, Constructor): Factored pieces into MethodCore.
18932
18933         * driver.cs: Added --fatal which makes errors throw exceptions.
18934         Load System assembly as well as part of the standard library.
18935
18936         * report.cs: Allow throwing exceptions on errors for debugging.
18937
18938         * modifiers.cs: Do not use `parent', instead use the real type
18939         container to evaluate permission settings.
18940
18941         * class.cs: Put Ravi's patch back in.  He is right, and we will
18942         have to cope with the
18943
18944 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18945
18946         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
18947         FamORAssem, not FamANDAssem.
18948
18949 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18950
18951         * driver.cs: Added --parse option that only parses its input files
18952         and terminates.
18953
18954         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
18955         incorrect.  IsTopLevel is not used to tell whether an object is
18956         root_types or not (that can be achieved by testing this ==
18957         root_types).  But to see if this is a top-level *class* (not
18958         necessarly our "toplevel" container). 
18959
18960 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18961
18962         * enum.cs (Enum::Define): Modify to call the Lookup method on the
18963         parent instead of a direct call to GetType.
18964
18965 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18966
18967         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
18968         Modifiers.TypeAttr. This should just be a call to that method.
18969
18970         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
18971         object so that we can determine if we are top-level or not.
18972
18973         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
18974         TypeContainer too.
18975
18976         * enum.cs (Enum::Define): Ditto.
18977
18978         * modifiers.cs (FieldAttr): Re-write.
18979
18980         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
18981         (TypeContainer::HaveStaticConstructor): New property to provide access
18982         to precisely that info.
18983
18984         * modifiers.cs (MethodAttr): Re-write.
18985         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
18986
18987         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
18988         of top-level types as claimed.
18989
18990 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18991
18992         * expression.cs (MemberLookup): Fruitless attempt to lookup
18993         constructors.  Maybe I need to emit default constructors?  That
18994         might be it (currently .NET emits this for me automatically).
18995         (Invocation::OverloadResolve): Cope with Arguments == null.
18996         (Invocation::EmitArguments): new function, shared by the new
18997         constructor and us.
18998         (Invocation::Emit): Handle static and instance methods.  Emit
18999         proper call instruction for virtual or non-virtual invocations.
19000         (New::Emit): Implement.
19001         (New::Resolve): Implement.
19002         (MemberAccess:Resolve): Implement.
19003         (MethodGroupExpr::InstanceExpression): used conforming to the spec
19004         to track instances.
19005         (FieldExpr::Resolve): Set type.
19006
19007         * support.cs: Handle empty arguments.
19008                 
19009         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
19010         SimpleLookup): Auxiliary routines to help parse a qualifier
19011         identifier.  
19012
19013         Update qualifier_identifier rule.
19014
19015         * codegen.cs: Removed debugging messages.
19016
19017         * class.cs: Make this a global thing, this acts just as a "key" to
19018         objects that we might have around.
19019
19020         (Populate): Only initialize method_builders_to_methods once.
19021
19022         * expression.cs (PropertyExpr): Initialize type from the
19023         PropertyType. 
19024
19025         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
19026         Resolve pattern.  Attempt to implicitly convert value to boolean.
19027         Emit code.
19028
19029         * expression.cs: Set the type for the int32/int32 argument case.
19030         (Binary::ResolveOperator): Set the return type to boolean for
19031         comparission operators
19032
19033         * typemanager.cs: Remove debugging print code.
19034
19035         (Invocation::Resolve): resolve type.
19036
19037         * class.cs: Allocate a MemberInfo of the correct size, as the code
19038         elsewhere depends on the test to reflect the correct contents.
19039
19040         (Method::) Keep track of parameters, due to System.Reflection holes
19041
19042         (TypeContainer::Populate): Keep track of MethodBuilders to Method
19043         mapping here.
19044
19045         (TypeContainer::FindMembers): Use ArrayList and then copy an array
19046         of the exact size and return that.
19047
19048         (Class::LookupMethodByBuilder): New function that maps
19049         MethodBuilders to its methods.  Required to locate the information
19050         on methods because System.Reflection bit us again.
19051
19052         * support.cs: New file, contains an interface ParameterData and
19053         two implementations: ReflectionParameters and InternalParameters
19054         used to access Parameter information.  We will need to grow this
19055         as required.
19056
19057         * expression.cs (Invocation::GetParameterData): implement a cache
19058         and a wrapper around the ParameterData creation for methods. 
19059         (Invocation::OverloadResolve): Use new code.
19060
19061 2001-09-13  Ravi Pratap  <ravi@ximian.com>
19062
19063         * class.cs (TypeContainer::EmitField): Remove and move into 
19064         (Field::Define): here and modify accordingly.
19065         (Field.FieldBuilder): New member.
19066         (TypeContainer::Populate): Update accordingly.
19067         (TypeContainer::FindMembers): Implement.
19068
19069 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
19070
19071         * statement.cs: (VariableInfo::VariableType): New field to be
19072         initialized with the full type once it is resolved. 
19073
19074 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
19075
19076         * parameter.cs (GetParameterInfo): Use a type cache to compute
19077         things only once, and to reuse this information
19078
19079         * expression.cs (LocalVariableReference::Emit): Implement.
19080         (OpcodeCast::Emit): fix.
19081
19082         (ParameterReference::Resolve): Implement.
19083         (ParameterReference::Emit): Implement.
19084
19085         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
19086         that are expressions need to stay as Expressions.
19087
19088         * typemanager.cs (CSharpName): Returns the C# name of a type if
19089         possible. 
19090
19091         * expression.cs (Expression::ConvertImplicit): New function that
19092         implements implicit type conversions.
19093
19094         (Expression::ImplicitReferenceConversion): Implements implicit
19095         reference conversions.
19096
19097         (EmptyCast): New type for transparent casts.
19098
19099         (OpcodeCast): New type for casts of types that are performed with
19100         a sequence of bytecodes.
19101
19102         (BoxedCast): New type used for casting value types into reference
19103         types.  Emits a box opcode.
19104
19105         (Binary::DoNumericPromotions): Implements numeric promotions of
19106         and computation of the Binary::Type.
19107
19108         (Binary::EmitBranchable): Optimization.
19109
19110         (Binary::Emit): Implement code emission for expressions.
19111
19112         * typemanager.cs (TypeManager): Added two new core types: sbyte
19113         and byte.
19114
19115 2001-09-12  Ravi Pratap  <ravi@ximian.com>
19116
19117         * class.cs (TypeContainer::FindMembers): Method which does exactly
19118         what Type.FindMembers does, only we don't have to use reflection. No
19119         implementation yet.
19120
19121         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
19122         typecontainer objects as we need to get at them.
19123         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
19124
19125         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
19126         typecontainer object.
19127
19128         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
19129         of just a Report object.
19130
19131 2001-09-11  Ravi Pratap  <ravi@ximian.com>
19132
19133         * class.cs (Event::Define): Go back to using the prefixes "add_" and
19134         "remove_"
19135         (TypeContainer::Populate): Now define the delegates of the type too.
19136         (TypeContainer.Delegates): Property to access the list of delegates defined
19137         in the type.
19138
19139         * delegates.cs (Delegate::Define): Implement partially.
19140
19141         * modifiers.cs (TypeAttr): Handle more flags.
19142
19143 2001-09-11  Ravi Pratap  <ravi@ximian.com>
19144
19145         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
19146         and not <=
19147         (Operator::Define): Re-write logic to get types by using the LookupType method
19148         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
19149         (Indexer::Define): Ditto.
19150         (Event::Define): Ditto.
19151         (Property::Define): Ditto.
19152
19153 2001-09-10  Ravi Pratap  <ravi@ximian.com>
19154
19155         * class.cs (TypeContainer::Populate): Now define operators too. 
19156         (TypeContainer.Operators): New property to access the list of operators
19157         in a type.
19158         (Operator.OperatorMethodBuilder): New member to hold the method builder
19159         for the operator we are defining.
19160         (Operator::Define): Implement.
19161
19162 2001-09-10  Ravi Pratap  <ravi@ximian.com>
19163
19164         * class.cs (Event::Define): Make the prefixes of the accessor methods
19165         addOn_ and removeOn_ 
19166
19167         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
19168         of the location being passed in too. Ideally, this should go later since all
19169         error reporting should be done through the Report object.
19170
19171         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
19172         (Populate): Iterate thru the indexers we have and define them too.
19173         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
19174         for the get and set accessors.
19175         (Indexer::Define): Implement.
19176
19177 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
19178
19179         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
19180         my previous implementation, did not work.
19181
19182         * typemanager.cs: Add a couple of missing types (the longs).
19183
19184         * literal.cs: Use TypeManager.bool_type instead of getting it.
19185
19186         * expression.cs (EventExpr): New kind of expressions.
19187         (Expressio::ExprClassFromMemberInfo): finish
19188
19189 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
19190
19191         * assign.cs: Emit stores to static fields differently.
19192
19193 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19194
19195         * Merge in changes and adjust code to tackle conflicts. Backed out my
19196         code in Assign::Resolve ;-) 
19197
19198 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19199
19200         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
19201         instead Report.Error and also pass in the location.
19202         (CSharpParser::Lexer): New readonly property to return the reference
19203         to the Tokenizer object.
19204         (declare_local_variables): Use Report.Error with location instead of plain 
19205         old error.
19206         (CheckDef): Ditto.
19207
19208         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
19209         (Operator.CheckBinaryOperator): Ditto.
19210
19211         * cs-parser.jay (operator_declarator): Update accordingly.
19212
19213         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
19214         (CheckBinaryOperator): Same here.
19215
19216         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
19217         on the name without any prefixes of namespace names etc. This is because we
19218         already might have something already fully qualified like 
19219         'System.Console.WriteLine'
19220
19221         * assign.cs (Resolve): Begin implementation. Stuck ;-)
19222
19223 2001-09-07  Ravi Pratap  <ravi@ximian.com>
19224
19225         * cs-tokenizer.cs (location): Return a string which also contains
19226         the file name.
19227
19228         * expression.cs (ElementAccess): New class for expressions of the
19229         type 'element access.'
19230         (BaseAccess): New class for expressions of the type 'base access.'
19231         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
19232         respectively.
19233
19234         * cs-parser.jay (element_access): Implement action.
19235         (base_access): Implement actions.
19236         (checked_expression, unchecked_expression): Implement.
19237
19238         * cs-parser.jay (local_variable_type): Correct and implement.
19239         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
19240
19241         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
19242
19243         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
19244         name and the specifiers.
19245
19246         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
19247
19248         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
19249         making them all public ;-)
19250
19251         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
19252         class anyways.
19253
19254 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
19255
19256         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
19257         PropertyExprs.
19258         (FieldExpr, PropertyExprs): New resolved expressions.
19259         (SimpleName::MemberStaticCheck): Perform static checks for access
19260         to non-static fields on static methods. Maybe this should be
19261         generalized for MemberAccesses. 
19262         (SimpleName::ResolveSimpleName): More work on simple name
19263         resolution. 
19264
19265         * cs-parser.jay (primary_expression/qualified_identifier): track
19266         the parameter index.
19267
19268         * codegen.cs (CodeGen::Save): Catch save exception, report error.
19269         (EmitContext::EmitBoolExpression): Chain to expression generation
19270         instead of temporary hack.
19271         (::EmitStatementExpression): Put generic expression code generation.
19272
19273         * assign.cs (Assign::Emit): Implement variable assignments to
19274         local variables, parameters and fields.
19275
19276 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
19277
19278         * statement.cs (Block::GetVariableInfo): New method, returns the
19279         VariableInfo for a variable name in a block.
19280         (Block::GetVariableType): Implement in terms of GetVariableInfo
19281
19282         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
19283         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
19284
19285 2001-09-06  Ravi Pratap  <ravi@ximian.com>
19286
19287         * cs-parser.jay (operator_declaration): Continue on my quest : update
19288         to take attributes argument.
19289         (event_declaration): Ditto.
19290         (enum_declaration): Ditto.
19291         (indexer_declaration): Ditto.
19292
19293         * class.cs (Operator::Operator): Update constructor accordingly.
19294         (Event::Event): Ditto.
19295
19296         * delegate.cs (Delegate::Delegate): Same here.
19297
19298         * enum.cs (Enum::Enum): Same here.
19299
19300 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19301
19302         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
19303
19304         * ../tests/cs0658.cs : New file to demonstrate error 0658.
19305
19306         * attribute.cs (Attributes): New class to encapsulate all attributes which were
19307         being passed around as an arraylist.
19308         (Attributes::AddAttribute): Method to add attribute sections.
19309
19310         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
19311         (struct_declaration): Update accordingly.
19312         (constant_declaration): Update.
19313         (field_declaration): Update.
19314         (method_header): Update.
19315         (fixed_parameter): Update.
19316         (parameter_array): Ditto.
19317         (property_declaration): Ditto.
19318         (destructor_declaration): Ditto.
19319
19320         * class.cs (Struct::Struct): Update constructors accordingly.
19321         (Class::Class): Ditto.
19322         (Field::Field): Ditto.
19323         (Method::Method): Ditto.
19324         (Property::Property): Ditto.
19325         (TypeContainer::OptAttribute): update property's return type.
19326
19327         * interface.cs (Interface.opt_attributes): New member.
19328         (Interface::Interface): Update to take the extra Attributes argument.
19329
19330         * parameter.cs (Parameter::Parameter): Ditto.
19331
19332         * constant.cs (Constant::Constant): Ditto.
19333
19334         * interface.cs (InterfaceMemberBase): New OptAttributes field.
19335         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
19336         the attributes as a parameter.
19337         (InterfaceProperty): Update constructor call.
19338         (InterfaceEvent): Ditto.
19339         (InterfaceMethod): Ditto.
19340         (InterfaceIndexer): Ditto.
19341
19342         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
19343         pass the attributes too.
19344         (interface_event_declaration): Ditto.
19345         (interface_property_declaration): Ditto.
19346         (interface_method_declaration): Ditto.
19347         (interface_declaration): Ditto.
19348
19349 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
19350
19351         * class.cs (Method::Define): Track the "static Main" definition to
19352         create an entry point. 
19353
19354         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
19355         EntryPoint if we find it. 
19356
19357         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
19358         (EmitContext::ig): Make this variable public.
19359
19360         * driver.cs: Make the default output file be the first file name
19361         with the .exe extension.  
19362
19363         Detect empty compilations
19364
19365         Handle various kinds of output targets.  Handle --target and
19366         rename -t to --dumper.
19367
19368         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
19369         methods inherited from Expression return now an Expression.  This
19370         will is used during the tree rewriting as we resolve them during
19371         semantic analysis.
19372
19373         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
19374         the spec.  Missing entirely is the information about
19375         accessability of elements of it.
19376
19377         (Expression::ExprClassFromMemberInfo): New constructor for
19378         Expressions that creates a fully initialized Expression based on
19379         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
19380         a Type.
19381
19382         (Invocation::Resolve): Begin implementing resolution of invocations.
19383
19384         * literal.cs (StringLiteral):  Implement Emit.
19385
19386 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19387
19388         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
19389         member.
19390
19391 2001-09-04  Ravi Pratap  <ravi@ximian.com>
19392
19393         * cs-parser.jay (attribute_arguments): Implement actions.
19394         (attribute): Fix bug in production. Implement action.
19395         (attribute_list): Implement.
19396         (attribute_target): Implement.
19397         (attribute_target_specifier, opt_target_specifier): Implement
19398         (CheckAttributeTarget): New method to check if the attribute target
19399         is valid.
19400         (attribute_section): Implement.
19401         (opt_attributes): Implement.
19402
19403         * attribute.cs : New file to handle attributes.
19404         (Attribute): Class to hold attribute info.
19405
19406         * cs-parser.jay (opt_attribute_target_specifier): Remove production
19407         (attribute_section): Modify production to use 2 different rules to 
19408         achieve the same thing. 1 s/r conflict down !
19409         Clean out commented, useless, non-reducing dimension_separator rules.
19410
19411         * class.cs (TypeContainer.attributes): New member to hold list
19412         of attributes for a type.
19413         (Struct::Struct): Modify to take one more argument, the attribute list.
19414         (Class::Class): Ditto.
19415         (Field::Field): Ditto.
19416         (Method::Method): Ditto.
19417         (Property::Property): Ditto.
19418
19419         * cs-parser.jay (struct_declaration): Update constructor call to
19420         pass in the attributes too.
19421         (class_declaration): Ditto.
19422         (constant_declaration): Ditto.
19423         (field_declaration): Ditto.
19424         (method_header): Ditto.
19425         (fixed_parameter): Ditto.
19426         (parameter_array): Ditto.
19427         (property_declaration): Ditto.
19428
19429         * constant.cs (Constant::Constant): Update constructor similarly.
19430         Use System.Collections.
19431
19432         * parameter.cs (Parameter::Parameter): Update as above.
19433
19434 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19435
19436         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
19437         (TypeContainer.delegates): New member to hold list of delegates.
19438
19439         * cs-parser.jay (delegate_declaration): Implement the action correctly 
19440         this time as I seem to be on crack ;-)
19441
19442 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
19443
19444         * rootcontext.cs (RootContext::IsNamespace): new function, used to
19445         tell whether an identifier represents a namespace.
19446
19447         * expression.cs (NamespaceExpr): A namespace expression, used only
19448         temporarly during expression resolution.
19449         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
19450         utility functions to resolve names on expressions.
19451
19452 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
19453
19454         * codegen.cs: Add hook for StatementExpressions. 
19455
19456         * class.cs: Fix inverted test for static flag in methods.
19457
19458 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19459
19460         * class.cs (Operator::CheckUnaryOperator): Correct error number used
19461         to make it coincide with MS' number.
19462         (Operator::CheckBinaryOperator): Ditto.
19463
19464         * ../errors/errors.txt : Remove error numbers added earlier.
19465
19466         * ../errors/cs1019.cs : Test case for error # 1019
19467
19468         * ../errros/cs1020.cs : Test case for error # 1020
19469
19470         * cs-parser.jay : Clean out commented cruft.
19471         (dimension_separators, dimension_separator): Comment out. Ostensibly not
19472         used anywhere - non-reducing rule.
19473         (namespace_declarations): Non-reducing rule - comment out.
19474
19475         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
19476         with TypeContainer::AddEnum.
19477
19478         * delegate.cs : New file for delegate handling classes.
19479         (Delegate): Class for declaring delegates.
19480
19481         * makefile : Update.
19482
19483         * cs-parser.jay (delegate_declaration): Implement.
19484
19485 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
19486
19487         * class.cs (Event::Define): Implement.
19488         (Event.EventBuilder): New member.
19489
19490         * class.cs (TypeContainer::Populate): Update to define all enums and events
19491         we have.
19492         (Events): New property for the events arraylist we hold. Shouldn't we move to using
19493         readonly fields for all these cases ?
19494
19495 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19496
19497         * class.cs (Property): Revamp to use the convention of making fields readonly.
19498         Accordingly modify code elsewhere.
19499
19500         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
19501         the Define method of the Property class.
19502
19503         * class.cs : Clean up applied patch and update references to variables etc. Fix 
19504         trivial bug.
19505         (TypeContainer::Populate): Update to define all the properties we have. Also
19506         define all enumerations.
19507
19508         * enum.cs (Define): Implement.
19509
19510 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19511
19512         * cs-parser.jay (overloadable_operator): The semantic value is an
19513         enum of the Operator class.
19514         (operator_declarator): Implement actions.
19515         (operator_declaration): Implement.
19516
19517         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
19518         validity of definitions.
19519         (Operator::CheckBinaryOperator): Static method to check for binary operators
19520         (TypeContainer::AddOperator): New method to add an operator to a type.
19521
19522         * cs-parser.jay (indexer_declaration): Added line to actually call the
19523         AddIndexer method so it gets added ;-)
19524
19525         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
19526         already taken care of by the MS compiler ?  
19527
19528 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19529
19530         * class.cs (Operator): New class for operator declarations.
19531         (Operator::OpType): Enum for the various operators.
19532
19533 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19534
19535         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
19536         ostensibly handle this in semantic analysis.
19537
19538         * cs-parser.jay (general_catch_clause): Comment out
19539         (specific_catch_clauses, specific_catch_clause): Ditto.
19540         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
19541         (catch_args, opt_catch_args): New productions.
19542         (catch_clause): Rewrite to use the new productions above
19543         (catch_clauses): Modify accordingly.
19544         (opt_catch_clauses): New production to use in try_statement
19545         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
19546         and re-write the code in the actions to extract the specific and
19547         general catch clauses by being a little smart ;-)
19548
19549         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
19550         Hooray, try and catch statements parse fine !
19551
19552 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19553
19554         * statement.cs (Block::GetVariableType): Fix logic to extract the type
19555         string from the hashtable of variables.
19556
19557         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
19558         I end up making that mistake ;-)
19559         (catch_clauses): Fixed gross error which made Key and Value of the 
19560         DictionaryEntry the same : $1 !!
19561
19562 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19563
19564         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
19565
19566         * cs-parser.jay (event_declaration): Correct to remove the semicolon
19567         when the add and remove accessors are specified. 
19568
19569 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19570
19571         * cs-parser.jay (IndexerDeclaration): New helper class to hold
19572         information about indexer_declarator.
19573         (indexer_declarator): Implement actions.
19574         (parsing_indexer): New local boolean used to keep track of whether
19575         we are parsing indexers or properties. This is necessary because 
19576         implicit_parameters come into picture even for the get accessor in the 
19577         case of an indexer.
19578         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
19579
19580         * class.cs (Indexer): New class for indexer declarations.
19581         (TypeContainer::AddIndexer): New method to add an indexer to a type.
19582         (TypeContainer::indexers): New member to hold list of indexers for the
19583         type.
19584
19585 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19586
19587         * cs-parser.jay (add_accessor_declaration): Implement action.
19588         (remove_accessor_declaration): Implement action.
19589         (event_accessors_declaration): Implement
19590         (variable_declarators): swap statements for first rule - trivial.
19591
19592         * class.cs (Event): New class to hold information about event
19593         declarations.
19594         (TypeContainer::AddEvent): New method to add an event to a type
19595         (TypeContainer::events): New member to hold list of events.
19596
19597         * cs-parser.jay (event_declaration): Implement actions.
19598
19599 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19600
19601         * cs-parser.jay (dim_separators): Implement. Make it a string
19602         concatenating all the commas together, just as they appear.
19603         (opt_dim_separators): Modify accordingly
19604         (rank_specifiers): Update accordingly. Basically do the same
19605         thing - instead, collect the brackets here.
19606         (opt_rank_sepcifiers): Modify accordingly.
19607         (array_type): Modify to actually return the complete type string
19608         instead of ignoring the rank_specifiers.
19609         (expression_list): Implement to collect the expressions
19610         (variable_initializer): Implement. We make it a list of expressions
19611         essentially so that we can handle the array_initializer case neatly too.
19612         (variable_initializer_list): Implement.
19613         (array_initializer): Make it a list of variable_initializers
19614         (opt_array_initializer): Modify accordingly.
19615
19616         * expression.cs (New::NType): Add enumeration to help us
19617         keep track of whether we have an object/delegate creation
19618         or an array creation.
19619         (New:NewType, New::Rank, New::Indices, New::Initializers): New
19620         members to hold data about array creation.
19621         (New:New): Modify to update NewType
19622         (New:New): New Overloaded contructor for the array creation
19623         case.
19624
19625         * cs-parser.jay (array_creation_expression): Implement to call
19626         the overloaded New constructor.
19627
19628 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
19629
19630         * class.cs (TypeContainer::Constructors): Return member
19631         constructors instead of returning null.
19632
19633 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
19634
19635         * typemanager.cs (InitCoreTypes): Initialize the various core
19636         types after we have populated the type manager with the user
19637         defined types (this distinction will be important later while
19638         compiling corlib.dll)
19639
19640         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
19641         on Expression Classification.  Now all expressions have a method
19642         `Resolve' and a method `Emit'.
19643
19644         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
19645         generation from working.     Also add some temporary debugging
19646         code. 
19647
19648 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
19649
19650         * codegen.cs: Lots of code generation pieces.  This is only the
19651         beginning, will continue tomorrow with more touches of polish.  We
19652         handle the fundamentals of if, while, do, for, return.  Others are
19653         trickier and I need to start working on invocations soon.
19654
19655         * gen-treedump.cs: Bug fix, use s.Increment here instead of
19656         s.InitStatement. 
19657
19658         * codegen.cs (EmitContext): New struct, used during code
19659         emission to keep a context.   Most of the code generation will be
19660         here. 
19661
19662         * cs-parser.jay: Add embedded blocks to the list of statements of
19663         this block.  So code generation proceeds in a top down fashion.
19664
19665 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
19666
19667         * statement.cs: Add support for multiple child blocks.
19668
19669 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
19670
19671         * codegen.cs (EmitCode): New function, will emit the code for a
19672         Block of code given a TypeContainer and its ILGenerator. 
19673
19674         * statement.cs (Block): Standard public readonly optimization.
19675         (Block::Block constructors): Link children. 
19676         (Block::Child): Child Linker.
19677         (Block::EmitVariables): Emits IL variable declarations.
19678
19679         * class.cs: Drop support for MethodGroups here, delay until
19680         Semantic Analysis.
19681         (Method::): Applied the same simplification that I did before, and
19682         move from Properties to public readonly fields.
19683         (Method::ParameterTypes): Returns the parameter types for the
19684         function, and implements a cache that will be useful later when I
19685         do error checking and the semantic analysis on the methods is
19686         performed.
19687         (Constructor::GetCallingConvention): Renamed from CallingConvetion
19688         and made a method, optional argument tells whether this is a class
19689         or a structure to apply the `has-this' bit.
19690         (Method::GetCallingConvention): Implement, returns the calling
19691         convention. 
19692         (Method::Define): Defines the type, a second pass is performed
19693         later to populate the methods.
19694
19695         (Constructor::ParameterTypes): implement a cache similar to the
19696         one on Method::ParameterTypes, useful later when we do semantic
19697         analysis. 
19698
19699         (TypeContainer::EmitMethod):  New method.  Emits methods.
19700
19701         * expression.cs: Removed MethodGroup class from here.
19702
19703         * parameter.cs (Parameters::GetCallingConvention): new method.
19704
19705 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
19706
19707         * class.cs (TypeContainer::Populate): Drop RootContext from the
19708         argument. 
19709
19710         (Constructor::CallingConvention): Returns the calling convention.
19711         (Constructor::ParameterTypes): Returns the constructor parameter
19712         types. 
19713
19714         (TypeContainer::AddConstructor): Keep track of default constructor
19715         and the default static constructor.
19716
19717         (Constructor::) Another class that starts using `public readonly'
19718         instead of properties. 
19719
19720         (Constructor::IsDefault): Whether this is a default constructor. 
19721
19722         (Field::) use readonly public fields instead of properties also.
19723
19724         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
19725         track of static constructors;  If none is used, turn on
19726         BeforeFieldInit in the TypeAttributes. 
19727
19728         * cs-parser.jay (opt_argument_list): now the return can be null
19729         for the cases where there are no arguments. 
19730
19731         (constructor_declarator): If there is no implicit `base' or
19732         `this', then invoke the default parent constructor. 
19733
19734         * modifiers.cs (MethodAttr): New static function maps a set of
19735         modifiers flags into a MethodAttributes enum
19736         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
19737         MethodAttr, TypeAttr to represent the various mappings where the
19738         modifiers are used.
19739         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
19740
19741 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
19742
19743         * parameter.cs (GetParameterInfo): Fix bug where there would be no
19744         method arguments.
19745
19746         * interface.cs (PopulateIndexer): Implemented the code generator
19747         for interface indexers.
19748
19749 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
19750
19751         * interface.cs (InterfaceMemberBase): Now we track the new status
19752         here.  
19753
19754         (PopulateProperty): Implement property population.  Woohoo!  Got
19755         Methods and Properties going today. 
19756
19757         Removed all the properties for interfaces, and replaced them with
19758         `public readonly' fields. 
19759
19760 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
19761
19762         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
19763         initialize their hashtables/arraylists only when they are needed
19764         instead of doing this always.
19765
19766         * parameter.cs: Handle refs and out parameters.
19767
19768         * cs-parser.jay: Use an ArrayList to construct the arguments
19769         instead of the ParameterCollection, and then cast that to a
19770         Parameter[] array.
19771
19772         * parameter.cs: Drop the use of ParameterCollection and use
19773         instead arrays of Parameters.
19774
19775         (GetParameterInfo): Use the Type, not the Name when resolving
19776         types. 
19777
19778 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
19779
19780         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
19781         and instead use public readonly fields.
19782
19783         * class.cs: Put back walking code for type containers.
19784
19785 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
19786
19787         * class.cs (MakeConstant): Code to define constants.
19788
19789         * rootcontext.cs (LookupType): New function.  Used to locate types 
19790
19791
19792 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
19793
19794         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
19795         this System.Reflection code is.  Kudos to Microsoft
19796
19797         * typemanager.cs: Implement a type cache and avoid loading all
19798         types at boot time.  Wrap in LookupType the internals.  This made
19799         the compiler so much faster.  Wow.  I rule!
19800
19801         * driver.cs: Make sure we always load mscorlib first (for
19802         debugging purposes, nothing really important).
19803
19804         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
19805         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
19806
19807         * rootcontext.cs: Lookup types on their namespace;  Lookup types
19808         on namespaces that have been imported using the `using' keyword.
19809
19810         * class.cs (TypeContainer::TypeAttr): Virtualize.
19811         (Class::TypeAttr): Return attributes suitable for this bad boy.
19812         (Struct::TypeAttr): ditto.
19813         Handle nested classes.
19814         (TypeContainer::) Remove all the type visiting code, it is now
19815         replaced with the rootcontext.cs code
19816
19817         * rootcontext.cs (GetClassBases): Added support for structs. 
19818
19819 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
19820
19821         * interface.cs, statement.cs, class.cs, parameter.cs,
19822         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
19823         Drop use of TypeRefs, and use strings instead.
19824
19825 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
19826
19827         * rootcontext.cs: 
19828
19829         * class.cs (Struct::Struct): set the SEALED flags after
19830         checking the modifiers.
19831         (TypeContainer::TypeAttr): new property, returns the
19832         TypeAttributes for a class.  
19833
19834         * cs-parser.jay (type_list): Oops, list production was creating a
19835         new list of base types.
19836
19837         * rootcontext.cs (StdLib): New property.
19838         (GetInterfaceTypeByName): returns an interface by type name, and
19839         encapsulates error handling here.
19840         (GetInterfaces): simplified.
19841         (ResolveTree): Encapsulated all the tree resolution here.
19842         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
19843         types. 
19844
19845         * driver.cs: Add support for --nostdlib, to avoid loading the
19846         default assemblies.
19847         (Main): Do not put tree resolution here. 
19848
19849         * rootcontext.cs: Beginning of the class resolution.
19850
19851 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
19852
19853         * rootcontext.cs: Provide better error reporting. 
19854
19855         * cs-parser.jay (interface_base): set our $$ to be interfaces.
19856
19857         * rootcontext.cs (CreateInterface): Handle the case where there
19858         are no parent interfaces.
19859
19860         (CloseTypes): Routine to flush types at the end.
19861         (CreateInterface): Track types.
19862         (GetInterfaces): Returns an array of Types from the list of
19863         defined interfaces.
19864
19865         * typemanager.c (AddUserType): Mechanism to track user types (puts
19866         the type on the global type hash, and allows us to close it at the
19867         end). 
19868
19869 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
19870
19871         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
19872         RecordInterface instead.
19873
19874         * cs-parser.jay: Updated to reflect changes above.
19875
19876         * decl.cs (Definition): Keep track of the TypeBuilder type that
19877         represents this type here.  Not sure we will use it in the long
19878         run, but wont hurt for now.
19879
19880         * driver.cs: Smaller changes to accomodate the new code.
19881
19882         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
19883         when done. 
19884
19885         * rootcontext.cs (CreateInterface):  New method, used to create
19886         the System.TypeBuilder type for interfaces.
19887         (ResolveInterfaces): new entry point to resolve the interface
19888         hierarchy. 
19889         (CodeGen): Property, used to keep track of the code generator.
19890
19891 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
19892
19893         * cs-parser.jay: Add a second production for delegate_declaration
19894         with `VOID'.
19895
19896         (enum_body): Put an opt_comma here instead of putting it on
19897         enum_body or enum_member_declarations so we can handle trailing
19898         commas on enumeration members.  Gets rid of a shift/reduce.
19899
19900         (type_list): Need a COMMA in the middle.
19901
19902         (indexer_declaration): Tell tokenizer to recognize get/set
19903
19904         * Remove old targets.
19905
19906         * Re-add the parser target.
19907
19908 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19909
19910         * cs-parser.jay: Add precendence rules for a number of operators
19911         ot reduce the number of shift/reduce conflicts in the grammar.
19912
19913 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
19914
19915         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
19916         and put it here.
19917
19918         Get rid of old crufty code.
19919
19920         * rootcontext.cs: Use this to keep track of the parsed
19921         representation and the defined types available to the program. 
19922
19923         * gen-treedump.cs: adjust for new convention.
19924
19925         * type.cs: Split out the type manager, and the assembly builder
19926         from here. 
19927
19928         * typemanager.cs: the type manager will live here now.
19929
19930         * cil-codegen.cs: And the code generator here. 
19931
19932 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
19933
19934         * makefile: Fixed up for easy making.
19935
19936 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19937
19938         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
19939         the 
19940
19941         (unary_expression): Expand pre_increment_expression and
19942         post_decrement_expression to reduce a shift/reduce.
19943
19944 2001-07-11  Simon Cozens
19945
19946         * cs-tokenizer.cs: Hex numbers should begin with a 0.
19947
19948         Improve allow_keyword_as_indent name.
19949
19950 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
19951
19952         * Adjustments for Beta2. 
19953
19954 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
19955
19956         * decl.cs: Added `Define' abstract method.
19957         (InTransit): new property, used to catch recursive definitions. 
19958
19959         * interface.cs: Implement `Define'. 
19960
19961         * modifiers.cs: Map Modifiers.constants to
19962         System.Reflection.TypeAttribute flags.
19963
19964         * class.cs: Keep track of types and user-defined types.
19965         (BuilderInit): New method for creating an assembly
19966         (ResolveType): New function to launch the resolution process, only
19967         used by interfaces for now.
19968
19969         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
19970         that are inserted into the name space. 
19971
19972 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
19973
19974         * ARGH.  I have screwed up my tree so many times due to the use of
19975         rsync rather than using CVS.  Going to fix this at once. 
19976
19977         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
19978         load types.
19979
19980 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
19981
19982         * Experiment successful: Use System.Type rather that our own
19983         version of Type.  
19984
19985 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
19986
19987         * cs-parser.jay: Removed nsAliases from here.
19988
19989         Use new namespaces, handle `using XXX;' 
19990
19991         * namespace.cs: Reimplemented namespace handling, use a recursive
19992         definition of the class.  Now we can keep track of using clauses
19993         and catch invalid using clauses.
19994
19995 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
19996
19997         * gen-treedump.cs: Adapted for all the renaming.
19998
19999         * expression.cs (Expression): this class now has a Type property
20000         which returns an expression Type.
20001
20002         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
20003         `Type', as this has a different meaning now in the base
20004
20005 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
20006
20007         * interface.cs, class.cs: Removed from all the sources the
20008         references to signature computation, as we can not do method
20009         signature computation during the parsing time, as we are not
20010         trying to solve at that point distinguishing:
20011
20012         class X {
20013                 void a (Blah x) {}
20014                 void a (NS.Blah x) {}
20015         }
20016
20017         Which depending on the context might be valid or not, as we do not
20018         know if Blah is the same thing as NS.Blah at that point.
20019
20020         * Redid everything so the code uses TypeRefs now instead of
20021         Types.  TypeRefs are just temporary type placeholders, that need
20022         to be resolved.  They initially have a pointer to a string and the
20023         current scope in which they are used.  This is used later by the
20024         compiler to resolve the reference to an actual Type. 
20025
20026         * DeclSpace is no longer a CIR.Type, and neither are
20027         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
20028         are all DeclSpaces, but no Types. 
20029
20030         * type.cs (TypeRefManager): This implements the TypeRef manager,
20031         which keeps track of all the types that need to be resolved after
20032         the parsing has finished. 
20033
20034 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
20035
20036         * ARGH.  We are going to have to store `foreach' as a class rather
20037         than resolving it, as we need to verify error 1579 after name
20038         resolution.   *OR* we could keep a flag that says `This request to
20039         IEnumerator comes from a foreach statement' which we can then use
20040         to generate the error.
20041
20042 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
20043
20044         * class.cs (TypeContainer.AddMethod): we now add methods to the
20045         MethodGroup instead of the method hashtable.  
20046
20047         * expression.cs: Add MethodGroup abstraction, which gets us one
20048         step closer to the specification in the way we handle method
20049         declarations.  
20050
20051         * cs-parser.jay (primary_expression): qualified_identifier now
20052         tried to match up an identifier to a local variable reference or
20053         to a parameter reference.
20054
20055         current_local_parameters is now a parser global variable that
20056         points to the current parameters for the block, used during name
20057         lookup.
20058
20059         (property_declaration): Now creates an implicit `value' argument to
20060         the set accessor.
20061
20062 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
20063
20064         * parameter.cs: Do not use `param' arguments as part of the
20065         signature, per the spec.
20066
20067 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
20068
20069         * decl.cs: Base class for classes, structs and interfaces.  This
20070         is the "Declaration Space" 
20071
20072         * cs-parser.jay: Use CheckDef for checking declaration errors
20073         instead of having one on each function.
20074
20075         * class.cs: Factor out some code for handling error handling in
20076         accordance to the "Declarations" section in the "Basic Concepts"
20077         chapter in the ECMA C# spec.
20078
20079         * interface.cs: Make all interface member classes derive from
20080         InterfaceMemberBase.
20081
20082 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
20083
20084         * Many things: all interfaces are parsed and generated in
20085         gen-treedump.  Support for member variables, constructors,
20086         destructors, properties, constants is there.
20087
20088         Beginning of the IL backend, but very little done, just there for
20089         testing purposes. 
20090
20091 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
20092
20093         * cs-parser.jay: Fix labeled statement.
20094
20095         * cs-tokenizer.cs (escape): Escape " and ' always.
20096         ref_line, ref_name: keep track of the line/filename as instructed
20097         by #line by the compiler.
20098         Parse #line.
20099
20100 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
20101
20102         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
20103         to match the values in System.CodeDOM.
20104
20105         Divid renamed to Divide.
20106
20107         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
20108         statements. 
20109         (Statements.set): remove.
20110
20111         * System.CodeDOM/CodeCatchClause.cs: always have a valid
20112         statements. 
20113
20114         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
20115         falseStatements always have valid values. 
20116
20117         * cs-parser.jay: Use System.CodeDOM now.
20118